这些天又在使用MFC写程序,抽空重读了一下《深入浅出MFC》,同时对照着程序又循着消息传递路线走了一遍,就是侯杰老师说的“二万五千里长征”。这里想说一点自己的体会。
在之前学习MFC是深刻感叹消息机制的精巧,通过宏定义就可以形成一张消息映射网,同时将Frame,View,Document,App全部链接起来。而今日在看MFC消息机制感觉复杂无比,觉得它的设计很不符合面向对象的思想。CWinApp,CWnd,CDocument都继承自CCmdTarget。CCmdTarget实现对WM_COMMAND类型的消息在消息映射表中的遍历,CWnd用来区分WM_COMMAND消息,并对非WM_COMMAND消息在消息映射表中实现从基类到父类的遍历。
消息到来时,记录消息来源地this指针类型,然后调用CWnd::WindowProc函数来开始消息传递,如果是WM_COMMAND消息这转入CFrameWnd::OnCmdMsg中设计的 CView CWnd CWinApp之路
在进入CView之后再转入CView::OnCmdMsg设计的CWnd CDocument之路
而CView,CDocument,CWnd,CWinApp最终都要调用CCmdTarget::OnCmdMsg实现对WM_COMMAND消息从基类到父类的推送。有空再研究下Spring的消息机制和QT的消息机制,希望不想MFC这般复杂。