消息映射机制
任何需要消息映射的类,在其定义中必须加入DECLARE_MESSAGE_MAP()。
宏DECLARE_MESSAGE_MAP() 的定义如下:#ifdef _AFXDLL#define DECLARE_MESSAGE_MAP() /private: /static const AFX_MSGMAP_ENTRY _messageEntries[]; / //采用登录AFX_MSGMAP_ENTRY的私有数组_messageEntries,称为登录消息protected: /static AFX_DATA const AFX_MSGMAP messageMap; / //指向登录消息数组的消息映射static const AFX_MSGMAP* PASCAL _GetBaseMessageMap(); / //返回消息映射的地址virtual const AFX_MSGMAP* GetMessageMap() const; /#else#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; /#endifAFX_MSGMAP_ENTRY定义如下:struct AFX_MSGMAP_ENTRY{UINT nMessage; // windows messageUINT nCode; // control code or WM_NOTIFY codeUINT nID; // control ID (or 0 for windows messages)UINT nLastID; // used for entries specifying a range of control id'sUINT nSig; // signature type (action) or pointer to message #AFX_PMSG pfn; // routine to call (or special value)};AFX_MSGMAP 定义如下: //是个动态链表,每个节点包含指向下一节点的指针和指向AFX_MSGMAP_ENTRY 的指针struct AFX_MSGMAP{#ifdef _AFXDLLconst AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();#elseconst AFX_MSGMAP* pBaseMap;#endifconst AFX_MSGMAP_ENTRY* lpEntries;};