MFC消息处理笔记

Windows消息的分类


在Windows中,消息分为三类(实际上,菜单命令也是一种消息,属于命令消息):

1)标准消息:

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

2)命令消息:

来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND形式呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接受到这类消息。

3)通告消息:

由控件产生的消息,例如按钮的单击、列表框的选择等都会产生这类消息,目的是为了向其父窗口(通常是对话框)通知时间的发生。这类消息也是以WM_COMMAND形式呈现的。从CCmdTarget派生的类,都可以接收到这类消息。

凡是从CWnd派生的类,他们既可以接收标准消息,也可以接收命令消息和通告消息。而对于那些从CCmdTarget派生的类,则只能接收命令消息和通告消息,不能接收标准消息。

菜单命令的路由


菜单命令消息响应函数的映射与标准消息的映射是一样的,只是命令消息使用的是ON_COMMAND宏。不过,命令消息和标准消息的路由过程还是有区别的:


命令消息和通告消息的路由

命令消息和通告消息的路由


MFC在后台把窗口过程替换成了AfxWndProc函数,由这个函数对所有的消息进行处理。该函数内部将调用AfxCallWndProc函数。后者又将调用WindowProc函数,这是CWnd类的一个成员函数,应用程序所有类型的消息都会进入这个函数中。WindowProc函数又将调用OnWndMsg函数,这个函数会对到来的消息进行一个类型判断,如果是标准消息,就利用消息映射机制来查找是哪个类响应了当前这个消息,并调用相应的消息映射函数,完成对消息的处理;如果是命令消息,它就会交由OnCommand这个函数来处理,在这个函数中将完成命令消息的路由;如果是通告消息,那么它将交由OnNotify这个函数来处理,该函数将完成通告消息的路由。命令消息和通告消息二者最后都会调用OnCmdMsg函数。


若在Menu中为同一个消息添加四个消息响应函数,则响应次序为:视类,文档类,框架类,应用程序。


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


添加一个消息响应函数以后,在源代码中有三个改动:

①在类的声明中,有消息响应函数的声明。形如:afx_msg void OnTest();

②在类的实现中,有详细映射关系的实现。

位于BEGIN_MESSAGE_MAP(TheClass, BaseClass)和END_MESSAGE_MAP()。TheClass指该类,BaseClass指该类的基类。

形如:
ON_COMMAND(ID_Test, OnTest)

③在响应消息的类的实现中,有消息响应函数的实现。即void TheClass::OnTest()的实现部分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值