struct AFX_MSGMAP_ENTRY;struct AFX_MSGMAP
{
AFX_MSGMAP* pBaseMessageMap;
AFX_MSGMAP_ENTRY* lpEntries;
};#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 END_MESSAGE_MAP() { 0,0,0,0,AfxSig_end,(AFX_PMSG)0 } };
//jjhou copyright
{
AFX_MSGMAP* pBaseMessageMap;
AFX_MSGMAP_ENTRY* lpEntries;
};#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 END_MESSAGE_MAP() { 0,0,0,0,AfxSig_end,(AFX_PMSG)0 } };
//jjhou copyright
MFC之所以这样做,主要是考虑到使用虚函数会造成过大的系统开销。以上只是实现的简单原理,详细过程你还是去看MFC的源代码吧。我个人认为,MFC在消息处理这事上,做得还是相当漂亮。