消息映射是MFC程序框架中最重要的一个特点.为了实现这一特点,首先我们来看其中两个关键的结构体.
struct AFX_MSGMAP
{
AFX_MSGMAP * pBaseMessageMap;
AFX_MSGMAP_ENTRY * lpEntries;
};
struct AFX_MSGMAP_ENTRY
{
UNIT nMessage;
UNIT nCode;
UNIT nID;
UNIT nLastID;
UNIT nSig;
AFX_PMSG pfn;
};
其中从以下定义我们已经可以看出映射的实现,先定义了一个AFX_MSGMAP对象messageMap以及AFX_MSGMAP_ENTRY对象_messageEntries,并且在BEGIN_MESSAGE_MAP中对messageMap进行初始化,将_messageEntries赋值为messageMap的成员.另这几个宏还定义了派生类和基类之间的联系.最后定义了在_messageEntries中给出了另外两个重要的宏定义ON_COMMAND和END_MESSAGE_MAP的具体实现
#define DECLARE_MESSAGE_MAP() /
static AFX_MSGMAP_ENTRY _messageEntries[]; /
static AFX_MSGMAP messageMap; /
virtual AFX_MSGMAP *GetMessageMap() const;
#define BEGIN_MESSAGE_MAP(theClass,baseClass) /
AFX_MSGMAP *theClass::GetMessageMap() const/
{return &theClass::messageMap;} /
AFX_MSGMAP theClass::messageMap= {&(baseClass::messageMap,/
(AFX_MSGMAP_ENTRY *) &(theclass::_messageEntries)}; /
AFX_MSGMAP_ENTRY theClass::_messageEntries[]= /
{
#define ON_COMMAND(id,memberFxn) /
{WM_COMMAND,0,(WORD)id,(WORD) id,AfxSig_vv,(AFX_PMSG)memberFxn},
#define END_MESSAGE_MAP() /
{0,0,0,0,AfxSig_end,(AFX_PMSG)0} /
};
其中AfxSig_end定义为:
enum AfxSig
{
AfxSig_end=0;
AfxSig_vv,
};
至此,我们已经可以很清楚的看出了消息映射的实现