菜单命令的路由

一、windows消息分类

 

标准消息:除了WM_COMMAND之外,所以以WM_开头的消息都是标准消息。从CWnd派生的类都可以接收到这类消息

命令消息:来自菜单或者工具栏按钮的消息。这类消息都是以WM_COMMAND形式呈现。在MFC中,通过菜单项的标识(ID)来区

分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息;

通告消息:由控件产生的消息,例如按钮的单击、列表框的选择都会产生这类消息,目的是为了向其父窗口(通常是对话框)通知事件的发

生。这类消息也是以WM_COMMAND形式呈现的。从CCmdTarget派生的类都能响应这类消息。


从MSDN提供的MFC层次结构图中可以发现,CWnd类实际上派生于CCmdTarget类,即CMnd是子类,CCmdTarget是父类。父类能接受命令消息和通告消息。CWnd类除了能接受命令消息外还能接受标准消息。

二、各种消息路由的差别

 仔细对比在OnWndMsg这一步骤之前,都和标准消息的映射是一样的。只是命令消息适用的ON_COMMAND宏。

详细的,首先由AfxWndProc函数接收操作系统发出的消息,由这个消息对所有的消息进行处理;然后函数AfxWndProc调用函数

AfxCallWndProc进行消息处理,这里一个进步是把对句柄的操作转换成对CWnd对象的操作;函数又AfxCallWndProc调用CWnd类的方法

WindowProc进行消息处理;WindowProc调用OnWndMsg进行正式的消息处理,即把消息派送到相关的方法中去处理。这个函数会对到来的

消息进行一个类型判断,如果是标准消息,就利用MFC消息映射机制来查找时哪个类响应了当前这个小心,并调用相应的消息映射函数,完

成对消息的处理;如果是命令消息,它就会交由OnCommand这个函数来处理,在这个函数中完成这个消息的路由;如果是通告消息,它将

交由OnNotify这个函数来处理,该函数完成通告消息的路由。二者最后都会调用OnCmdMsg函数。


三、菜单消息命令路由

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


可知,父类先接受消息,子类先处理响应。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值