映射:通过declare_map宏 begin_message_map 与end_message_map完成
路由:通过CcmdMsg 完成。
控件通知消息(WM_****)与命令消息(WM_COMMAND消息)的路由过程不一致,如Win32程序存在windowProc函数,然后其内部实现中存在控件通知消息和命令消息的判断(如下),控件通知消息不会进入OnCommand函数(OnCommand函数实现中存在CcmdMsg函数),也就不会进出CcmdMsg函数,相反,WM_COMMAND消息会进入CcmdMsg函数,从而完成诡异的消息路由过程。
1 void WindowProc(){ 2 if(nMsg == WM_COMMAND){ 3 OnCommand(); 4 return DefWindowProc(); 5 } 6 7 } 8 9 10 /// 因为windowProc是虚函数,当指定类没有调用时,会调用父类的windowProc,这样完成消息往父类推去的原理。
控件消息(直接把消息往父类推去):CView --> CWnd -->CCmdTarget
CFrameWnd -->CWnd --> CCmdTarget
命令消息(不一样的消息路由过程):CView -->CWnd --> CCmdTarget
-->CDocument ---> CCmdTarget
CFrameWnd --> CView -->CWnd --> CCmdTarget
--> CDocument ---> CCmdTarget
--> CWnd --> CCmdTarget
--> CWinApp-->CCmdTarget