MFC学习笔记2_消息映射

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获得该数组的首地址,同时得到基类的消息映射入口地址。当本身对该消息不响应时就可以上溯到基类的消息映射表中寻找对应的消息响应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值