首页 > 代码库 > MFC消息映射机制

MFC消息映射机制

1 消息循环所在的函数
CWinApp::Run

2  消息类别
<1>Windows Messages
WM_XX前缀开头,但是除了WM_COMMAND消息外。
<2>Control Notifications
包含来自控件或者子窗口发给父窗口的 WM_COMMAND的通知消息。
<3>Command Messages
菜单,工具栏按钮,快捷键


3 消息的发送和接受
CWinApp::Run函数接受消息并且将他们分派到合适的窗口,大多数命令消息时被发送到主框架窗口。接受消息的必须是一个窗口对象,如果是Windows消息则被窗口对象直接处理,如果是Command消息则会按照消息路由进行处理。
<1> standard windows messages 
这种消息不像Command messages,它是被消息发送到的窗口直接处理,窗口可以是MainFrame,MDI childWindow,standard control,dialog,view,child Windows。

在运行的时候,每个窗口都会关联到一个window Object(z直接或者间接从CWnd派生),然后框架使用消息映射把消息发送至处理函数处理。


<2> command message

command messages  被主框架接受后要看通过消息路由的机制找到最终的处理函数,所谓的消息路由就是把消息按照一定的指定路径从一个Command target传递给另一个Command target ,直到最终找到这个消息所谓的command target 就是框架在消息路由的时候要经过的一些列的候选对象,这些候选对象就是Command target(命令目标)

4 标准消息路由
_____________________________________________________________________________________
MDI Frame (CMDIFrameWnd)
active CMDIChildWnd
this Framewnd Window
Application (CWinApp Object)
_____________________________________________________________________________________
Document Frame Window (CFrameWnd, CMDIChildWnd)
active view
this frame Window
Application (CWinApp Object)
______________________________________________________________________________________
View
this view
Document attached to this view
______________________________________________________________________________________
Document
this Document
Document template attached to this Document
______________________________________________________________________________________
Dialog
this Dialog
Window that owns this dialog
Application (CWinApp Object)
______________________________________________________________________________________


5 OnCmdMsg
它确定是否有处理命令的函数,以及将命令发送给下一级的OnCmdMsg,它可以被重载,从而改变默认的消息路由
在这里会检查消息的映射宏,在消息映射宏中查找是否有相应的处理函数。


6 派生类的消息路由
如果在派生类中检查到不匹配的就去找基类的,依次类推。如果最后还是没有找到处理函数就执行默认的处理函数。
<1>如果是命令消息,则转到下一个命令目标
<2>如果是standard Windows消息,则传递给默认窗口过程函数
消息映射机制有着虚函数的功能,但是比虚函数节省空间。为了加快消息映射,框架会缓存最近的匹配。


7 message-map range
将多个消息绑定到同一个处理函数中
<1> ON_COMMAND_RANGE(startID,endID,&OnXxxFunc) // ID必须连续
<2> ON_UPDATE_COMMAND_UI_RANGE(startID,endID,&OnXxxFunc)

<3> ON_CONTROL_RANGE(notification,startID,endID,&OnXxxFunc)


8 标准Windows消息的重载
重载的时候,可能要调用基类的函数,在开头或者结尾,或者不调用。

总结:Window的消息映射机制总体就是
发送的消息含有窗口句柄,每个窗口句柄都会被关联到一个窗口对象。CWinApp::Run函数是消息循环函数,它销售消息并且派送消息。OnCmdMsg在消息映射宏中查找处理消息的函数,它会按照不同的分类来处理消息。如果是命令消息就按照消息路由一步一步处理消息,如果是非命令消息就传递交给窗口对象来处理。