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

2012-7-6 16:14 6924 19 19 分类: 工程师职场

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

wxleasyland@sina.com

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

 

 

 

 

====================================

 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632619(v=vs.85).aspx

WM_CREATE message

Sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function.    (The message is sent before the function returns.这个消息在函数返回前被发送)      The window procedure of the new window receives this message after the window is created, but before the window becomes visible.

A window receives this message through its WindowProc function.   窗口通过WindowProc函数来接收这个消息!

 

If an application processes this message, it should return zero to continue creation of the window.     If the application returns –1, the window is destroyed and the CreateWindowEx or CreateWindow function returns a NULL handle.  处理这个消息的程序应返回0,如果返回-1,则窗口被销毁并且CreateWindow返回NULL

 

 

 

CreateWindow function

Creates an overlapped, pop-up, or child window.   It specifies the window class, window title, window style, and (optionally) the initial position and size of the window. The function also specifies the window's parent or owner, if any, and the window's menu.

 

Before returning, CreateWindow sends a WM_CREATE message to the window procedure.     CreateWindow返回前,它会发送WM_CREATE给窗口处理程序。

For overlapped, pop-up, and child windows,  CreateWindow sends WM_CREATE, WM_GETMINMAXINFO, and WM_NCCREATE messages to the window.      The lParam parameter of theWM_CREATE message contains a pointer to a CREATESTRUCT structure.   If the WS_VISIBLE style is specified, CreateWindow sends the window all the messages required to activate and show the window.

 

 

 

 

WM_NCCREATE message

Sent prior to the WM_CREATE message when a window is first created. 在WM_CREATE之前被发送。

A window receives this message through its WindowProc function.  窗口通过WindowProc函数来接收这个消息!

If an application processes this message, it should return TRUE to continue creation of the window. If the application returns FALSE, theCreateWindow or CreateWindowEx function will return a NULL handle.

 

 

 

====================================

引用网络上的:

====================================

UpdateWindow

 

UpdateWindow()立即用WM_PAINT刷新窗口。WM_PAINT消息并不是一直发的,一般在窗口遮住后再显示时系统自动发,而且它的优先级很低,只有在别的消息处理完后才处理;UpdateWindow给指定窗口的窗口过程发送一个WM_PAINT消息并立即执行(不经过消息队列),如果更新区域为空,则不发送消息。

 

===================================

 

WM_CREATE & WM_INITDIALOG

 

WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕.可以安全的使用这个窗口了,例如在它上面画控件等等.这个状态肯定是在调用ShowWindows()显示窗口之前.

 

WM_WM_INITDIALOG是对话框才能收到的消息,表明对话框及其所有子控件都创建完毕了,这个状态肯定是调用显示对话框的函数之前.所以可以在WM_WM_INITDIALOG对控件进行一些修改等.

 

-------

 

nvneibaba_069 - 初级水手长 七级

 

不要被MFC干扰了,MFC封装了太多的东西,心里想着API的执行顺序就行了。

 

所有窗口都是在注册窗口类之后调用CreateWindowEx来创建的,创建成功之后(HWND有效但CreateWindowEx尚未返回)系统自动发送WM_CREATE消息,所以你的OnCreate将被执行,在这里窗口已经创建成功了,你可以安全地创建各种子窗口。

 

-------

 

http://www.cppblog.com/pwqonline/archive/2008/12/04/67806.html

 

WM_CREATE消息响应函数和WM_INITDIALOG消息响应函数之区别

 

          在响应WM_CREATE消息响应函数的时候,对话框及子控件还未创建完成,亦是说只是通知系统说要开始创建窗口啦,这个消息响应完之后,对话框和子控件才开始创建。因此在此消息响应函数中无法对控件进行修改和初始化。

 

          而WM_INITDIALOG消息响应函数是在程序运行时,当其对话框和子控件全部创建完毕,将要显示内容的时候发送的消息。因此可以在WM_INITDIALOG消息响应函数中添加对编辑框控件的初始化和修改。

 

-------

 

WM_CREATE消息用来产生子窗口控件,WM_CREATE是谁发出的,什么意思??

当然是windows操作系统发出,所有消息都是由操作系统发出给程序的,分成进队消息,和不进队消息,wm_create不仅仅指子窗口产生,所有窗口在操作系统内部产生时,windows都会发出这个消息

 

--------

 

应用程序中处理消息的顺序(转)

 

MFC应用程序中处理消息的顺序

 

1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc

 

2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数

 

3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数

 

4.OnWndMsg()        该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息

调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数

 

5.OnCommand()       该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数

 

6.OnCmdMsg()        根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。

例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数

 

MFC应用程序创建窗口的过程

 

1.PreCreateWindow()   该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数 (可以设置窗口风格等等)

 

2.PreSubclassWindow() 这也是一个重载函数,允许首先子分类一个窗口

 

3.OnGetMinMaxInfo()   该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者 最小尺寸

 

4.OnNcCreate()        该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区 即将被创建

 

5.OnNcCalcSize()      该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小

 

6.OnCreate()          该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建

 

7.OnSize()            该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经 发生变化

 

8.OnMove()            消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动

 

9.OnChildNotify()     该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被 创建

 

MFC应用程序关闭窗口的顺序(非模态窗口)

 

1.OnClose()       消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息

 

2.OnDestroy()     消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息

 

3.OnNcDestroy()   消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息

 

4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用

 

MFC应用程序中打开模式对话框的函数调用顺序

 

1.DoModal()             重载函数,重载DoModal()成员函数

 

2.PreSubclassWindow()   重载函数,允许首先子分类一个窗口

 

3.OnCreate()            消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建

 

4.OnSize()              消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化

 

5.OnMove()              消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动

 

6.OnSetFont()           消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体

 

7.OnInitDialog()        消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件

 

8.OnShowWindow()        消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用

 

9.OnCtlColor()          消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色

 

10. OnChildNotify()     重载函数,作为WM_CTLCOLOR消息的结果发送

 

MFC应用程序中关闭模式对话框的顺序

 

1.OnClose()        消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候,该函数被调用

 

2.OnKillFocus()    消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送

 

3.OnDestroy()      消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送

 

4.OnNcDestroy()    消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送

 

5.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用

 

打开无模式对话框的顺序

 

1.PreSubclassWindow()    重载函数,允许用户首先子分类一个窗口

 

2.OnCreate()             消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建

 

3.OnSize()               消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化

 

4.OnMove()               消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动

 

5.OnSetFont()            消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体

 

以上这些的执行都是按给定的顺序执行!

 

只有清楚的了解应用程序的执行顺序,才能在编写代码的时候知道,在什么时候应该执行什么,以及在什么地方该处理什么!

 

这只是本人总结的一点小小的经验,希望能对MFC的初学者有所帮助!

 

原文:http://hi.baidu.com/hq81/blog/item/ead55009beb083236a60fbc2.html

 

 

 

文章评论0条评论)

登录后参与讨论
我要评论
0
19
关闭 站长推荐上一条 /2 下一条