您的位置:首页 > 其它

消息映射的作用机制---MFC学习 2

2011-07-25 13:53 190 查看
MFC中,通入消息映射表来影响程序接收到的各种各样的消息。

要使用消息映射的类,其必须直接或间接的派生于CCmdTaget类,所有的派生于CCmdTarget类的子类都可以使用消息映射。
使用方法如下三步:
1、在类中声明消息映射DECLARE_MESSAGE_MAP()
2、BEGIN _MESSAGE_MAP(class,base class) 声明此消息映射所属的类和该类的基类。
消息映射的条目(由各种宏来把消息及消息所对应的消息处理程序添加到消息映射表中,例如:ON_WM_PAINT())
END_MESSAGE _MAP()
3、在相应的类中添加消息处理程序afx_msg........().
下面进行相应宏所完成的功能,编译器的预处理程序将生成相应的代码:

《1》 DECLARE_MESSAGE_MAP() 宏将在类的成员中添加三个成员: 在private中添加一个静态的(static)AFX_MSGMAP_ENTRY 类型结构的名为_messgeEntries[] 的数组,AFX_MSGMAP_ENTRY结构指向包含消息与消息处理程序相关的信息。 在protected中 ,一个静态(static)AFX_MSGMAP结构名为messageMap的成员,AFX_MSGMAP结构包含一个指向本类-messageEntries[]的指针及一个指向父类messageMap的指针.... 在protected中,包含一个虚拟的getMessageMap()函数,该函数返回此类中messageMap的指针;

<2> BEGIN_MESSAGE_MAP(CLASS,BASED CLASS)宏:
1、将完成虚函数GetMessageMap()的实现。
2、初始化MessageMap
《3》在BEGIN_MESSAGE_MAP()及END_MESSAGE_MAP之间的宏将填充_messageEntries[]数组

《4》END_MESSAGE_MAP()
有NULL标识_messageEntries[]数组的结尾。
AFX

那么,MFC是如何把程序所接收到的消息,转化为相对应的函数的调用的呢?
我们知道,在SDK中,当在WINODWS中注册窗口类的时候都有一个相应的窗口过程与这个窗口类相对应,当此基于此窗口类所创建的窗口接收到由
windows消息时,将由windows来调用此窗口过程对消息进行相应的处理后,再返回到消息循环。
然而,在MFC中,对消息所对应的消息处理程序的调用如下:
以框架窗口为例,前提:class CMainWnd:public CFrameWnd... 当CMainWnd接收到消息的时候,框架调用由CWnd(CFrameWnd派生于CWnd)继承下来的WindowProc函数,windowProc函数调用OnWndMsg...OnWndMsg函数又调用此类的GetMessageMap函数来得到此类的MessageMap指针,从而获得了_messageEntries指针,程序搜索_messageEntries数组去对消息ID进行匹配,有相应的匹配则去调用相应的消息函数;若没有相应的匹配,则由MessageMap结构得到此类基类的MessageMap结构,再次进行匹配。。如此进行,直到找到匹配或是将消息传递给Windos进行默认处理为止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: