消息映射与消息路由原理

映射:通过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

posted on 2012-10-21 20:33  笔记吧... 可能只有自己看得懂  阅读(1423)  评论(0编辑  收藏  举报