在MFC应用程序中传输的消息有三种类型:窗口消息、命令消息和控件通知。
窗口消息(Window Message)一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗
口等。通常,消息是从系统发送到窗口,或从窗口发送到窗口。
若需要窗口消息的完全的列表,请参考M F C文档。
命令消息
命令消息一般与处理用户请求相关,当用户单击一个菜单项或工具栏时,命令消息产生,
并被发送到能处理该请求的类对象(如,装载文件、编辑文本和保存选项等)。
控件通知
通常,控件通知在某些重要事件发生时,由控件窗口发送到父窗口,如打开一个组合框。
控件通知为父窗口进一步控制子窗口提供了机会。例如,打开一个组合框时,父窗口可以用
组合框初建时得不到的消息填充它。
ON_COMMAND 和ON_MESSAGE都是将消息处理函数加入消息路由表中,但是ON_COMMAND对应的消息ID一直都是WM_COMMAND,而ON_MESSAGE的消息ID为ON_COMMAND的第一个参数
在MFC中,ON_COMMAND, ON_MESSAGE, ON_NOTIFY它们的区别。
ON_NOTIFY是控件向其父窗口发送消息处理的宏,ON_COMMAND是菜单和工具栏项处理消息的宏,ON_MESSAGE是处理自定义消息的宏
ON_COMMAND用来处理WM_COMMAND消息。老式的windows控件发送WM_COMMAND作为对父窗口的通知消息。另外,菜单,工具栏也向框架窗口发送WM_COMMAND消息。
ON_MESSAGE主要用来处理用户自定义消息。
对于某些新型的windows控件(如ListCtrl等),向父窗口发送通知消息时需要包含大量的信息,WM_COMMAND已不适应这种要求(因为WM_COMMAND的wparam和lparam都已经填满了),ON_NOTIFY主要用来处理这些新型的windows控件向父窗口的发送的WM_NOTIFY通知消息。
对这几个消息的理解要先了解一下Window消息的背景。
在Windows3.1里,控件会将mouse, keybord等等的消息通知它的父窗口, 使用的消息就只有WM_COMMAND, 事件种类和控件ID被包含在wParam中,控件的句柄包含在lParam中。由于wParam和 lParam已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时候就没有地方可以存放它们了。所以Windows3.1中定义了许多其它的消息种类,比如WM_VSCROLL, WM_CTLCOLOR等等,每种消息wParam,lParam中附带的信息是不同的。
当到了Win32后,控件的种类越来越多,当然不可以为每一个控件都定义一套消息,这样也不利于系统的扩充。所以在Win32中定义了唯一一个强大的消息WM_NOTIFY。当然WM_NOTIFY也遵守原来的消息规则,既只带参数wParam和lParam。唯一不同处在于,此时的lParam中传送的是一个NMHDR指针。不同的控件可以按照规则对NMHDR进行扩充,因此WM_NOTIFY消息传送的信息量可以相当的大,这个可以看看MSDN中的相关说明,TreeControl中就有很多这种消息。
现在就可以知道为什么有ON_MESSAGE,ON_COMMAND,ON_NOTIFY了。
ON_MESSAGE是处理所有的Windows的消息的,因为所有的消息都以相同的格式传送,也就是ID, WPARAM, LPARAM.
ON_COMMAND是专门处理WM_COMMAND消息的,这样我们就不用自己解开WM_COMMAND中wParam和lParam中传送的控件ID,事件种类,所有的都在MFC内部解决了。
ON_NOTIFY更是不用说了,看看他的处理函数,是不是把NMHDR解出来了。
这样一样就一目了然了,ON_COMMAND和ON_NOTIFY都可以用ON_MESSAGE来处理,只不过自己要多做很多事情。ON_COMMAND和ON_NOTIFY最好就不要互换了!

ON_COMMAND和ON_MESSAGE的区别相关推荐

  1. ON_MESSAGE,ON_COMMAND和ON_NOTIFY的区别和联系

    ON_COMMAND是菜单和工具栏项处理消息的宏 ON_MESSAGE是处理自定义消息的宏 ON_NOTIFY 是控件向其父窗口发送消息处理的宏 对这几个消息的理解要先了解一下Window消息的背景. ...

  2. 详解DC、CDC、HDC、句柄、设备上下文

    最近那么长时间都没写博文.感觉经常写博文是好事.工作的时候项目是用MFC做的.百度了下说这个框架已经过时了.但是工作需要又不得不看,所以现在就之前看的一篇关于设备上下文的文章转载下 MFC中的DC.C ...

  3. BEGIN_MESSAGE_MAP宏

    当创建一个MFC程序的时候,在系统自动生成的代码中经常看到如下部分: BEGIN_MESSAGE_MAP( theClass, baseClass )         END_MESSAGE_MAP( ...

  4. [转]MFC中ON_COMMAND, ON_MESSAGE, ON_NOTIFY它们的区别

    ON_COMMAND是菜单和工具栏项处理消息的宏 ON_MESSAGE是处理自定义消息的宏 ON_NOTIFY  是控件向其父窗口发送消息处理的宏 对这几个消息的理解要先了解一下Window消息的背景 ...

  5. ON_MESSAGE和ON_NOTIFY 区别

    ON_COMMAND是菜单和工具栏项处理消息的宏 ON_MESSAGE是处理自定义消息的宏 ON_NOTIFY 是控件向其父窗口发送消息处理的宏 对这几个消息的理解要先了解一下Window消息的背景. ...

  6. VS Debug和Release版本的区别

    VS Debug和Release版本的区别 1. 变量. 大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值 ...

  7. 关于Debug和Release之本质区别的讨论

    一.Debug 和 Release 编译方式的本质区别     Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化 ...

  8. Vs2010与VC的区别

    VS2010与VC++编译器的区别: 1.VS2010并不是针对C++的,C++只是它的一小部分,它更加关注.net平台程序开发(主要是C#.VB,C++/CLI(C++在.net下的语言)),而VC ...

  9. CAsyncSocket及CSocket的区别和用法

    微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易.CAsyncSocket类逐个封装了WinSock API,为高级网络程序员提供了更加有力而灵活的方法.这个类基 ...

最新文章

  1. Vue Router的集中统一管理
  2. ORM数据层框架的设计热点:更新指定的列的几种设计方案
  3. J2Pay –实施网关
  4. 设置MongoDB副本集分为4个步骤
  5. Shell declare的使用方法
  6. vm linux数据恢复,VMWARE虚拟机数据恢复
  7. [原创软件]手机截屏及格式转换工具
  8. c# asp.net页面传值方法总结
  9. Julia:关于push 与 Array 和Dict 数据结构
  10. python 里面的内置函数之:locals() 和 globals()
  11. secureCRT连接Linux虚拟机
  12. python的power,Python numpy.power()函数使用说明
  13. 【温故而知新】计算机408之计算机网络速记
  14. 第四篇:ROS常用命令行指令【重点】
  15. linux 中的rime 输入法 自定义 新世纪五笔输入法
  16. 管程法实现生产者消费者问题
  17. 源码分析:SpringBoot健康检查
  18. 体验ANT DESIGN PRO V5--项目创建并安装umi气泡工作台
  19. 【题解】【PTA-Python题库】第1章-3 输出“人生苦短,我学Python” (10 分)
  20. NOI模拟 : Vain (并查集维护割点)

热门文章

  1. Auto 和 Decltye 的区别
  2. SublimeText3快捷键简要总结
  3. 大型网站系统架构分析
  4. python 为抓取而生
  5. 美国政府在将Web业务赶出美国
  6. 最新消息:更多的Windows Azure Marketplace Content 和Hands On Lab
  7. Linux 2.6.39-rc3的一个插曲
  8. Windows USB驱动开发点滴积累备忘录
  9. Jmeter启动报错解决方案
  10. 对于response.setContentType(MIME)的解释