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

解决方案 »

  1.   

    DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP、END_MESSAGE_MAP以及ON_COMMAND、ON_MESSAGE等宏最终作用的结果是在你的类中生成了一个名为lpEntries的数组,该数组中将填入每个你关心的消息和此消息对应的处理函数。应用程序框架生成的WindowProc接收到一个消息后,会按照一定的原则轮询个各类(CView、CDocument、CFrameWnd、CWinApp)的lpEntries数组,检查该数组中有没有对应的消息,如果有,就调用相应的响应函数;如果没有,就换下一个类继续检查。当所有的有关的类都被检查完后仍未发现响应函数时,便将此消息丢给DefWindowProc处理。
    MFC之所以这样做,主要是考虑到使用虚函数会造成过大的系统开销。以上只是实现的简单原理,详细过程你还是去看MFC的源代码吧。我个人认为,MFC在消息处理这事上,做得还是相当漂亮。