MFC消息映射机制
摘要:关于MFC消息映射机制的深入研究。
步骤/方法
- 01
预备工作: 定义消息描绘结构: struct AFX_MSGMAP { AFX_MSGMAP* pBaseMessageMap; AFX_MSGMAP_ENTRY* lpEntries; }; 定义消息表项实体结构: struct AFX_MSGMAP_ENTRY // MFC 4.0 { UINT nMessage; // windows message UINT nCode; // control code or WM_NOTIFY code UINT nID; // control ID (or 0 for windows messages) UINT nLastID; // used for entries specifying a range of control id's UINT nSig; // signature type (action) or pointer to message # AFX_PMSG pfn; // routine to call (or special value) };
- 02
类内声明: #define DECLARE_MESSAGE_MAP() \ static AFX_MSGMAP_ENTRY _messageEntries[]; \ static AFX_MSGMAP messageMap; \ virtual AFX_MSGMAP* GetMessageMap() const; 做了三件事情: 声明了该类的消息表数组:_messageEntries[] 声明了两个指针:pBaseMessageMap;lpEntries;顾名思义,它们分别指向基类的消息表和该类的消息表。 声明了一个函数GetMessageMap() ,顾名思义,它的作用是获得一个指向该类消息表的指针。
- 03
在.CPP文件中给表项添加具体条目,并实现GetMessageMap() 声明函数GetMessageMap() #define BEGIN_MESSAGE_MAP(theClass, baseClass) \ // [1、实现函数GetMessageMap()] : AFX_MSGMAP* theClass::GetMessageMap() const \ { return &theClass::messageMap; } \ //实现messageMap: AFX_MSGMAP theClass::messageMap = \ { &(baseClass::messageMap), \ (AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) }; \ //给::_messageEntries[]添加具体表项: AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \ { 诸如COMMAND、PAINT、…… //结束消息描绘表: #define END_MESSAGE_MAP() \ { 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \ };
- 04
注意:上面这两个#define是前后呼应的,前一个以“{”为结尾;后一个以“};”为结尾,合而为一才算完整。