(本文转载自http://bbs.ednchina.com/BLOG_ARTICLE_3005454.HTM)
VC中WM_CREATE、WM_INITDIALOG消息出现顺序及调用方式
2012.7
wxleasyland试验:
VC建的标准WIN32-HELLO WORLD程序中:
1.在CreateWindow()前面加上语句WinExec("cmd /k echo now call CreateWindow()",SW_SHOW); Sleep(5000);
2.在CreateWindow()后面加上语句WinExec("cmd /k echo CreateWindow() RETURN",SW_SHOW);
3.在WndProc()中加上
case WM_CREATE:
WinExec("cmd /k echo WndProc(): WM_CREATE: appear!",SW_SHOW);
Sleep(5000);
break;
4.运行,发现,先出现now call CreateWindow()、再WndProc(): WM_CREATE: appear!、最后CreateWindow() RETURN。
结论:
CreateWindow()是在运行后、返回前,发送消息WM_CREATE,并阻塞!
WM_CREATE消息直接发给消息处理函数WndProc()执行!而不是通过消息队列(GetMessage、DispatchMessage等)!!
其实就是CreateWindow()直接拿消息WM_CREATE去调用WndProc()!!!!!
如果WndProc()返回0,CreateWindow()正常返回hWnd。
如果WndProc()返回-1,CreateWindow()销毁窗口,并返回NULL。
所以WM_CREATE时,CreateWindow()内部已经创建好窗口了,但还没有返回,还没有hWnd!即窗口真正还没有创建结束。这时这里不能有对窗口上的控件操作的函数,不然就会“程序执行了非法操作”。比如GetDlgItem等。
标准WIN32程序中,是先RegisterClassEx()注册窗口类->再CreateWindow()创建窗口->再ShowWindow()显示出窗口->再UpdateWindow()立即用WM_PAINT刷新窗口->再LoadAccelerators()->再进入消息循环(GetMessage、DispatchMessage等)
在MFC对话框中,试验,是:先WM_CREATE,这时窗口未显示出来->再WM_INITDIALOG,这时窗口仍未显示出来-> OnInitDialog()运行完毕后,窗口才显示出来(应是默认通过ShowWindow())。