BEGIN_MESSAGE_MAP,END_MESSAGE_MAP和ON_COMMAND

一、介绍

在MFC中,消息响应需要BEGIN_MESSAGE_MAP,END_MESSAGE_MAP和ON_COMMAND这些宏,这些宏的定义通常位于afxwin.h头文件中

二、源码

首先在使用消息映射之前,必须先声明DECLARE_MESSAGE_MAP()

define BEGIN_MESSAGE_MAP(theClass, baseClass) /   
    const AFX_MSGMAP* theClass::GetMessageMap() const /   
             { return &theClass::messageMap; } /   
    AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = /   
             { &baseClass::messageMap, &theClass::_messageEntries[0] }; /   
    AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = /   
             { /   
 
    
#define ON_COMMAND(id, memberFxn) /   
    { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn },   
 
 
#define END_MESSAGE_MAP() /   
    {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } /   
}; /

可以看出,关键代码是一个map键值对baseClass::messageMap与theClass::_messageEntries[],以实现消息与处理函数之间的关联。

三、原理

对于消息映射机制的理解。表面上看是A发消息到B,然后B收到消息执行相应的操作。实际上呢?消息映射的原理是:B预先设定,假如A执行了发某个消息的过程,那么B就做某一个操作。可以看出,实际上并没有什么“消息”在传递,消息映射的实质是A对B的一种函数调用,即多个函数依次执行,一旦函数A执行了,函数B就跟着执行,形成一条函数链。

参考:

MFC六大核心机制【消息映射】_奕星星奕的博客-CSDN博客

你可能感兴趣的:(MFC,mfc)