MFC中消息机制

1 在M F C应用程序中传输的消息有三种类型:窗口消息、命令消息和控件通知
  • 窗口消息(Window Message,又称为标准消息):一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。除WM_CONNAMD(命令消息)之外,任何以wm_开头的都算是这一类。任何派生自CWnd的类,均可接受此消息。
  • 命令消息(WM_COMMAND):命令消息意味着”使用者命令程序做某些操作“。凡由UI对象产生的消息都是这种命令消息,可能来自菜单获加速键获工具栏按钮。并且都以 WM_COMMAND呈现。如何分别来自各处的命令消息? SDK程序主要靠消息的wParam识别之,MFC程序则主要靠菜单项的识别码(即ID)识别——两者其实是相同的。凡是派生自CCmdTarget的类,皆有资格接受命令消息。
  • 控件通知消息(Control Notification) :通常,控件通知在某些重要事件发生时,由控件窗口发送到父窗口,如打开一个组合框。控件通知为父窗口进一步控制子窗口提供了机会。例如,打开一个组合框时,父窗口可以用组合框初建时得不到的消息填充它。

 

2 在MFC应用程序中消息映射的三个宏:ON_COMMAND、ON_MESSAGE和ON_NOTIFY
  • ON_MESSAGE:处理所有的Windows的消息的,因为所有的消息都以相同的格式传送,也就是ID, WPARAM, LPARAM。
  • ON_COMMAND:专门处理WM_COMMAND消息的,这样我们就不用自己解开WM_COMMAND中wParam和lParam中传送的控件ID,事件种类…,所有的都在MFC内部解决了,当然方便了。
  • ON_NOTIFY:更是不用说了,看看他的处理函数,是不是把NMHDR解出来了。

ON_COMMAND 和ON_MESSAGE都是将消息处理函数加入消息路由表中,但是ON_COMMAND对应的消息ID一直都是WM_COMMAND,而ON_MESSAGE的消息ID为ON_COMMAND的第一个参数。ON_COMMAND用来处理WM_COMMAND消息。老式的windows控件发送WM_COMMAND作为对父窗口的通知消息。另外,菜单,工具栏 也向框架窗口发送WM_COMMAND消息。 ON_MESSAGE主要用来处理用户自定义消息。对于某些新型的windows控件(如ListCtrl等),向父窗口发送通知消息时需要包含大量的信 息,WM_COMMAND已不适应这种要求(因为WM_COMMAND的wparam和lparam都已经填满了),ON_NOTIFY主要用来处理这些 新型的windows控件向父窗口的发送的WM_NOTIFY通知消息。

这样一样就一目了然了,ON_COMMAND和ON_NOTIFY都可以用ON_MESSAGE来处理,只不过自己要多做很多事情。ON_COMMAND和ON_NOTIFY最好就不要互换了!

 

3 几点说明

1、ON_COMMAND(id,memberFxn)
此宏通过ClassWizard或手工插入一个消息映射。它表明那个函数将从一个命令用户接口(例如一个菜单项或toolbar按钮)处理一个命令消息。 当一个命令对象通过指定的ID接受到一个Windows WM_COMMAND消息时,ON_COMMAND将调用成员函数memberFxn处理此消 息。在用户的消息映射中,对于每个菜单或加速器命令(必须被映射到一个消息处理函数)应该确实有一个ON_COMMAND宏语句。

2、ON_MESSAGE(message,memberFxn)
指明哪个函数将处理一用户定义消息。用户定义消息通常定义在WM_USER到0x7FF范围内。用户定义消息是那些不是标准 Windows WM_MESSAGE消息的任何消息。在用户的消息映射中,每个必须被映射到一个消息处理函数。用户定义消息应该有一个 ON_MESSAGE宏语句。

 

MFC消息分类(理论)(http://blog.csdn.net/geeeeeeee/archive/2008/12/16/3532052.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值