MFC学习笔记2_消息映射
2016-07-07 15:46
337 查看
MFC库并没有采用虚函数来处理Windows消息,而是通过一些宏来讲特定的消息映射到派生类中相应的成员函数内。MFC采用的Document/View框架结构,能够将数据管理的代码和显示数据的程序代码分开,并且设计了一套方便的消息映射和命令传递机制,方便开发。
在MFC下,消息映射是通过巧妙的消息映射表格来进行的消息映射和命令传递。
首先在需要进行消息处理的类的头文件.h中都会包含DECLARE_MESSAGE_MAP()宏,用来声明改类拥有消息的映射表格:
然后在类的.CPP中实现这一表格:
上述代码主要进行消息映射的实现,其中出现如下3种宏:
①BEGIN_MESSAGE_MAP宏具有两个参数,分别是拥有消息表格的类及其父类
②ON_COMMAND宏用于指定命令消息的处理函数名称。
③END_MESSAGS_MAP宏作为结尾符号
头文件中DECLARE_MESSAGE_MAP的定义如下:
上述代码包含MFC新定义的两个数据结构,AFX_MSGMAP_ENTR源代码如下:
AFX_MSGMAP的源代码如下:
MFC把所有消息一条条填入AFX_MSGMAP_ENTRY结构中去,形成一个数组,同时通过AFX_MSGMAP获得该数组的首地址,同时得到基类的消息映射入口地址。当本身对该消息不响应时就可以上溯到基类的消息映射表中寻找对应的消息响应。
在MFC下,消息映射是通过巧妙的消息映射表格来进行的消息映射和命令传递。
首先在需要进行消息处理的类的头文件.h中都会包含DECLARE_MESSAGE_MAP()宏,用来声明改类拥有消息的映射表格:
class CScribbleDoc:public CDocument { ... DECLEARE_MESSAGE_MAP() }
然后在类的.CPP中实现这一表格:
BEGIN_MESSAGE_MAP(CInheritClass, CBaseClass) //该宏具有两个参数拥有消息表格的类及其父类 //{{AFX_MSG_MAP(CInheritClass) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) //该宏用于指定命令消息的处理函数名称 ... //}}AFX_MSG_MAP //由ClassWizard生成,对程序无影响 END_MESSAGS_MAP() //该宏最为结尾符号
上述代码主要进行消息映射的实现,其中出现如下3种宏:
①BEGIN_MESSAGE_MAP宏具有两个参数,分别是拥有消息表格的类及其父类
②ON_COMMAND宏用于指定命令消息的处理函数名称。
③END_MESSAGS_MAP宏作为结尾符号
头文件中DECLARE_MESSAGE_MAP的定义如下:
#define DECLARE_MESSAGE_MAP() private: static const AFX_MSGMAP_ENTRY_messageEntries[]; protected: static AFX_DATA const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const;
上述代码包含MFC新定义的两个数据结构,AFX_MSGMAP_ENTR源代码如下:
//包含了一个消息的所有相关信息 struct AFX_MSGMAP_ENTRY { UINT nMessage; UINT nCode; UINT nID: UINT nLastID; UINT nSig; AFX_PMSG pfn; };
AFX_MSGMAP的源代码如下:
structAFX_MSGMAP { const AFX_MSGMAP* pBaseMap; //基类消息映射入口地址 const AFX_MSGMAP_ENTRY* lpEntries; //本身消息映射入口地址 }
MFC把所有消息一条条填入AFX_MSGMAP_ENTRY结构中去,形成一个数组,同时通过AFX_MSGMAP获得该数组的首地址,同时得到基类的消息映射入口地址。当本身对该消息不响应时就可以上溯到基类的消息映射表中寻找对应的消息响应。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解