MFC消息

原创转载请注明出处:http://hi.baidu.com/pub/show/modifytext?qbid=38744a3074a4e93fceb9fe87

 

MFC把消息分为三大类:

  1、命令消息(WM_COMMAND):使用者命令程序做某些操作,产生的消息。凡由UI对象(菜单栏、工具栏按钮)产生的对象消息都是这种命令消息,可能来自菜单或加速键或工具栏按钮,并都以WM_COMMAND呈现。如何分辨来自各处的命令消息呢?SDK程序主要靠消息的wParam识别,MFC程序则主要靠菜单项的识别码(ID)识别。什么样的类有资格处理呢?凡是派生自CCmdTarget的类都有资格处理,MFC中建立应用程序的最重要的几个类都是派生自CCmdTarget。

  2、标准消息(WM_xxx):处WM_COMMAND之外,任何以WM_开头的都算是这一类。任何派生自CWnd之类,均有资格处理此消息。

  3、ControlNotification:这种消息由空间产生,为的是向父窗口(通常是对话框)通知某种情况。例如电脑给你在ListBox上选择其中一个项目,ListBox就会产生 LBN_SELCHANGE传送给父窗口。这类消息也是以WM_COMMAND形式呈现。

 

举例:菜单命令消息路由的具体过程:当单击某个菜单项时,最先接收到这个菜单命令消息的是框架类。框架类将把接收到的这个消息交给它的子窗口。即视类,由视类首先进行处理。视类首先格局命令消息映射机制查找自身是否对此消息进行了响应,如果响应了,就调用相应响应函数对这个消息进行处理,消息路由过程结束;如果视类没有对此命令消息做出响应,就交由文档类,文档类同样查找自身是否对这个菜单命令进行了响应,如果响应了,就有文档类的命令消息响应函数进行处理,路由过程结束。如果文档类也未做响应,就把这个命令消息交还给视类,后者又把该消息交还给框架类。框架类查看自己是否对这个命令消息进行了响应,如果它也没有做出响应,就把这个菜单命令消息交给应用程序类,由后者来进行处理。这就是菜单命令的路由过程

 

 

 

MFC对消息循环的规定为:

    1:若是一般的windows消息(WM_xx)则一搬是由派生类流向基类。因为可以指定接收消息的句柄,所以可以跑到任意的CWnd的派生类。

    2:如果是WM_COMMAND消息,就非常复杂了。要区分接受者的类型:

      1:接受者若为Frame窗口:处理次序为:View-> Document->Frame窗口本身->CWinApp类。

      2:接受者若为View :处理次序为:View本身->Document;

      3:接受者若为Document:处理次序为:Document本身->Document template

posted @ 2014-05-20 15:58  何人之名  阅读(182)  评论(0)    收藏  举报