mfc编程消息机制中消息汇总

做VC开发必须熟悉消息机制,笔试面试重点,自己在这方面很欠缺,搜集学习一下

WM_CREATE    			CreateWindow  初始化工作
GetMessage	 			遇到WM_QUIT,程序结束
DispatchMessage			向窗口派送消息
重复2,3操作
关闭按钮,发出WM_CLOSE
DefWindowProc处理WM_CLOSE消息,调用DestroyWindows消息,发出WM_DESTROY
调用WM_QUIT消息,程序结束


一个进程的产生和死亡:


1shell调用CreateProcess激活.exe;
2产生进程核心对象,计数为1;
3系统创建一个4GB的地址空间;
4加载器将必要代码加载到上诉地址空间(.exe程序 DLLs());
5系统为此产生一个主线程,线程才是CPU分配时间的对象;
6系统调用CRuntime库里面的Startup code
7startup code 调用Winmain函数
8程序开始运行;
9关闭窗口,使得WinMain中消息结构体循环结束(如上面所述)于是WInMain 函数结束;
10回到startup code;
11回到系统,系统调用ExitProcess结束进程




// 调用CreateWindow后产生第一条消息:
CreateWindow()
 WM_GETMINMAXINFO     "当窗口将要改变大小或位置时,由系统发送本消息给窗口,用户拖动一个可重置大小的窗口时便会发出本消息"
 WM_NCCREATE          "当某窗口首次被创建时,本消息在WM_CREATE消息发送前发送"
 WM_NCCALCSIZE        "当某窗口的客户区的大小和位置须被计算时发送本消息"
 WM_CREATE            "新建一个窗口"
CreateWindow() 返回

ShowWindow()
 WM_SHOWWINDOW        "发送本消息给一个窗口,以便隐藏或显示该窗口"
 WM_WINDOWPOSCHANGING "本消息会发送给那些大小和位置(Z_Order)将被改变的窗口,以调用SetWindowPos函数或其它窗口管理函数"
 WM_ACTIVATEAPP       "窗口进程激活状态改动,正被激活的窗口属于不同的应用程序 "
 WM_NCACTIVATE        "本消息发送给某窗口,在窗口的非客户区被激活时重绘窗口"
 WM_GETICON           "本消息发送给某个窗口,用于返回与某窗口有关联的大图标或小图标的句柄(一般收到多个,用于获取不同大小的图标)"
 WM_ACTIVATE          "一个窗口被激活或失去激活状态"
 WM_IME_SETCONTEXT    "应用程序的窗口激活时,系统将向应用程序发送WM_IME_SETCONTEXT消息,输入焦点转移到了某个窗口上,注:输入法相关"
 WM_IME_NOTIFY        "可使用WM_IME_NOTIFY消息来通知关于IME窗口状态的常规改变,注:输入法相关,IME窗口发生了改变" 
 WM_SETFOCUS          "将焦点转向一个窗口"
 WM_NCPAINT           "当窗口框架(非客户区)必须被被重绘时,应用程序发送本消息给该窗口"
 WM_ERASEBKGND        "当一个窗口的背景必须被擦除时本消息会被触发(如:窗口大小改变时)"
 WM_WINDOWPOSCHANGED  "本消息会发送给那些大小和位置(Z_Order)已被改变的窗口,以调用SetWindowPos函数或其它窗口管理函数"
 WM_SIZE              "改变一个窗口的大小"
 WM_MOVE              "移动一个窗口"
ShowWindow() 返回

UpdateWindow()
 WM_PAINT             "窗口重绘"
UpdateWindow() 返回
 WM_GETICON           "本消息发送给某个窗口,用于返回与某窗口有关联的大图标或小图标的句柄(一般收到多个,用于获取不同大小的图标)"

// 进入消息循环
 WM_TIMER             "发生了定时器事件"
 WM_KEYUP             "当一个非系统按键被释放弹起时(<ALT>键没有被按下),会发送本消息给拥有键盘焦点的窗口"
 WM_TIMER             "发生了定时器事件"
 WM_SYSKEYDOWN        "当用户按住<ALT>键的同时又按下其它键时,发送本消息给拥有焦点的窗口",
 WM_SYSCOMMAND        "当用户选择一条系统菜单命令、用户最大化或最小化或还原或关闭时,窗口会收到本消息"
 WM_CLOSE             "用户关闭窗口时会发送本消息,紧接着会发送WM_DESTROY消息"
 WM_WINDOWPOSCHANGING "本消息会发送给那些大小和位置(Z_Order)将被改变的窗口,以调用SetWindowPos函数或其它窗口管理函数"
 WM_WINDOWPOSCHANGED  "本消息会发送给那些大小和位置(Z_Order)已被改变的窗口,以调用SetWindowPos函数或其它窗口管理函数"
 WM_NCACTIVATE        "本消息发送给某窗口,在窗口的非客户区被激活时重绘窗口"
 WM_ACTIVATE          "一个窗口被激活或失去激活状态"
 WM_ACTIVATEAPP       "窗口进程激活状态改动,正被激活的窗口属于不同的应用程序 "
 WM_KILLFOCUS         "使一个窗口失去焦点"
 WM_IME_SETCONTEXT    "应用程序的窗口激活时,系统将向应用程序发送WM_IME_SETCONTEXT消息,输入焦点转移到了某个窗口上,注:输入法相关"
 WM_IME_NOTIFY        "可使用WM_IME_NOTIFY消息来通知关于IME窗口状态的常规改变,注:输入法相关,IME窗口发生了改变" 
 WM_DESTROY           "销毁一个窗口"
 WM_NCDESTROY         "本消息通知某窗口,非客户区正在销毁"


WM_CLOSE->WM_DESTROY->WM_QUIT



WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕(可以安全的使用这个窗口了,例如在它上面画控件等)。在响应WM_CREATE消息
响应函数的时候,对话框及子控件还未创建完成,亦是说只是通知系统说要开始创建窗口啦,这个消息响应完之后,对话框和子控件才开始创建。
因此在此消息响应函数中无法对控件进行修改和初始化。
    
    WM_INITDIALOG消息是对话框才能收到的消息,表明对话框及其所有子控件都创建完毕了。这个状态肯定是在调用显示对话框的函数之前,因此
	可以在WM_INITDIALOG消息响应函数中添加对编辑框控件的初始化和修改。

    ==========================================
    
    不要被MFC干扰了,MFC封装了太多的东西,心里想着API的执行顺序就行了。
    
    所有窗口都是在注册窗口类之后调用CreateWindowEx来创建的,创建成功之后(HWND有效但CreateWindowEx尚未返回)系统自动发送WM_CREATE
	消息,所以你的OnCreate将被执行,在这里窗口已经创建成功了,你可以安全地创建各种子窗口。
    
    --------


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

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消息,发送此消息以告诉窗口大小发生变化,OnSIze可能会在OnCreate之前调用,因此要判断此时控件是否存在

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消息,发送此消息以允许改变对话框中控件的字体


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

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

猜你喜欢

转载自blog.csdn.net/qq_24282081/article/details/79929238
今日推荐