Win32项目中的WM_CREATE消息何时被调用的

(本文转载自http://bbs.ednchina.com/BLOG_ARTICLE_3005454.HTM)

VC中WM_CREATE、WM_INITDIALOG消息出现顺序及调用方式

[email protected]

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())。

你可能感兴趣的:(Win32项目中的WM_CREATE消息何时被调用的)