您的位置:首页 > 编程语言 > C语言/C++

MFC学习笔记2_消息映射

2016-07-07 15:46 337 查看
MFC库并没有采用虚函数来处理Windows消息,而是通过一些宏来讲特定的消息映射到派生类中相应的成员函数内。MFC采用的Document/View框架结构,能够将数据管理的代码和显示数据的程序代码分开,并且设计了一套方便的消息映射和命令传递机制,方便开发。

在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获得该数组的首地址,同时得到基类的消息映射入口地址。当本身对该消息不响应时就可以上溯到基类的消息映射表中寻找对应的消息响应。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc c++