ON_MESSAGE和ON_NOTITY再次理解

ON_NOTIFY是控件向其父窗口发送消息处理的宏,ON_COMMAND是菜单和工具栏项处理消息的宏,ON_MESSAGE是处理自定义消息的宏

对这几个消息的理解要先了解一下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_MESSAGE和ON_NOTITY再次理解

时间: 2024-10-12 15:47:42

ON_MESSAGE和ON_NOTITY再次理解的相关文章

再次理解WCF以及其通信(附加一個編程小經驗)

一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NET Framework 3.0 开始引入. WCF的最终目标是通过进程或不同的系统.通过本地网络或是通过Internet收发客户和服务之间的消息. WCF合并了Web服务..net Remoting.消息队列和Enterprise Services的功能并集成在Visual Studio中. WCF

(转)java.ByteArrayInputStream与ByteArrayOutputStream再次理解

转载自:java.ByteArrayInputStream与ByteArrayOutputStream再次理解 第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutputStream的用法 以下是JDK中的记载: public class ByteArrayOutputStream  extends OutputStream 此类实现了一个输出流,其中

再次理解HTTP请求过程

我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次!程序只管处理一次即可! HTTP请求 步骤1:浏览器首先向服务器发送HTTP请求,请求包括: 方法:GET还是POST,GET仅请求资源,POST会附带用户数据: 路径:/html/path: 域名:由Host头指定:Host: www.sina.com.cn 以及其他相关的Header: 如果是

二分算法 再次理解

二分算法 再次理解 详解二分查找算法 这篇博客很详细介绍了二分算法的一些细节问题 寻找一个数,也是最基本的二分搜索 //代码示例如下 int bsearch(int []nums, int target) { int left=0, right=nums.length-1;//这里的数组长度用法可以是其他的形式 while(left<=right) { int mid = left + (right - left) / 2; if(num[mid] == target) return mid;

C++再次理解虚表

#include <iostream> using namespace std; class Base { public: virtual void fun1() { cout << "Base::fun1()" << endl; } virtual void fun2() { cout << "Base::fun2()" << endl; } }; class Son : public Base { pu

再次理解javascript的apply

普通函数执行的时候,this指向函数执行的上下文 其实就是一个原型链的结构... 我一直没有搞懂原型链莫非它们像链条一样连在一起? 昂... 原型链可以理解成继承吗? 就像,java里边的继承吧嗯嗯刚想说这个 写js的时候一般没用到这里,还有apply()和call()一直搞不清太灵活了,不知道是什么,想要干啥 ES6新的语法来讲,你可能会看着比较熟悉了 call 和 apply就是绑定一个函数执行的 this指向 觉apply()和代码上下文有很大关系 这意思是修改父类吗? 不是.. 那我又不

再次理解js中的call函数

a.call(b); 网上说明的版本比较多.有的说,是指针替换.有说,将a对象的方法加在b对象执行.官方说:什么对象替换什么对象.反正看了几个版本,尽管有具体的实例,看了我三次都没看懂它的具体含义.看过还是云里雾里的.后来发现,结合实验去理解非常好. 其实,换成自己能够接受的方式理解为好.a对象的方法应用到b对象上(函数apply的意思正好说明符合这样理解:a对象应用到b对象上去) a对象既然添加到b对象上了.那么b对象自然就拥有了a对象所有的内容.所有,b对象就继承了a对象了.结合自己编写的下

对static的再次理解

随着做技术工作的不断深入,能在常见的语法和对象使用中获取更深的理解,我想,这大概就是孔老夫子说的"温故而知新"吧. 言归正传,java中的static大概分4中用法吧(漏掉的请大神在评论补充). 修饰成员变量和成员方法.这应该是对static的最初印象. 修饰代码块.这大概是在开始做项目的时候就会遇到.栗子就不举了. 修饰内部类. 静态导入.import static静态导入是JDK1.5中的新特性.虽然使用的比较少,但是知不知道应该可以作为检验真爱粉的一项标准吧 . 能使用第一点是作

java.ByteArrayInputStream与ByteArrayOutputStream再次理解

第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutputStream的用法 以下是JDK中的记载: public class ByteArrayOutputStream  extends OutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组.缓冲区会随着数据的不断写入而自动增长.可使用 toByteArray()和 t