WM_COMMAND 和 WM_NOTIFY 区别
来源:互联网 发布:美剧 英文 知乎 编辑:程序博客网 时间:2024/05/01 03:24
参考一:
对这几个消息的理解要先了解一下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最好就不要互换了!
http://topic.csdn.net/u/20080325/12/ce7da89b-58a5-4ae4-9f6e-f20d0074359d.html
参考二:
WM_COMMAND 和 WM_NOTIFY 的区别
当我们按下一个菜单选项,或者一个控件需要通知父窗口一个事件发生(如鼠标单击、双击等),或者快捷键被按下时,Windows将会发送一个 WM_COMMAND 消息给父窗口。那么 WM_COMMAND 消息参数是什么呢?
OK,一切运行的很好,通过 WPARAM 高位置1或0区分菜单、快捷键、或者控件事件Code,通过 WPARAM 低位可以知道发出WM_COMMAND消息的菜单项或控件ID,通过LPARAM知道控件句柄。
然而,有一天,当选中一个 ListControl 控件中的某一行时,人们忽然发现父窗口需要知道被选中该行的索引,这下为难了,对于控件来看,整个WM_COMMAND消息的WPARAM、LPARAM 都被塞的满满的。怎么办呢?这儿有一种解决办法:新增一个消息,就叫WM_LIST_CONTROL_CLICKED吧,如下:
呃,看起来的确解决了问题,我们把事件 Code 通过消息 ID 体现了出来,然后把被选中行的索引塞进了WPARAM的高位,看起来非常完美!然而又有一天,人们发现对ListView,父窗口需要知道单击该控件时选中的行号和列号,以便处理,照猫画虎,我们又加了一个WM_LIST_VIEW_CLICKED。接着人们发现其他一些控件都需要这样的改进,如果这样增加消息的话,岂不是没完没了了?!!
于是,WM_NOTIFY消息横空出世:
现在,我们将所有附加信息都存放在 NMHDR(Notify Message Handler)的一个结构体中,该结构体指针通过 LPARAM 通知到父窗口。NMHDR如下:
typedef struct tagNMHDR{ HWND hwndFrom; // 控件句柄. UINT_PTR idFrom; // 控件 ID. UINT code; // NM_ code.} NMHDR;这只是一个一般的结构,如果我们需要知道 ListView选中的行和列,那么需要:
typedef struct tagNMLISTVIEW{ NMHDR hdr; // NMHDR. int iItem; // 行号. int iSubItem; // 列号. UINT uNewState; UINT uOldState; UINT uChanged; POINT ptAction; LPARAM lParam;} NMLISTVIEW, *LPNMLISTVIEW;像其他的控件,都会对应这样一个结构体,它们的第一个字段一定是 NMHDR。但一些微软标准控件并不会发送WM_NOTIFY 消息,这些控件有:Edit、ComboBox、ListBox、Button、ScrollBar、Static等。所以在使用过程中请注意用法,最好的做法是参考MSDN。
- WM_COMMAND和WM_NOTIFY区别
- WM_COMMAND 和 WM_NOTIFY 区别
- WM_COMMAND 和 WM_NOTIFY 的区别
- WM_COMMAND 和 WM_NOTIFY 的区别
- WM_COMMAND 和 WM_NOTIFY 的区别
- WM_COMMAND 和 WM_NOTIFY 的区别
- WM_COMMAND 和 WM_NOTIFY 的区别
- WM_COMMAND和WM_NOTIFY有什么区别
- WM_COMMAND和WM_NOTIFY有什么区别?
- WM_COMMAND和WM_NOTIFY消息的区别
- WM_COMMAND和WM_NOTIFY比较
- 关于WM_Notify和WM_Command
- WM_COMMAND,WM_NOTIFY等消息
- WM_COMMAND与WM_NOTIFY
- WM_COMMAND,WM_NOTIFY等消息
- 关于WM_COMMAND与WM_NOTIFY
- WM_COMMAND,WM_NOTIFY等消息
- Differences between WM_NOTIFY and WM_COMMAND
- Android深入浅出之Audio 第二部分 AudioFlinger分析
- #ifdef _DEBUG用法小结
- windows的磁盘操作之十——获取磁盘型号
- 和菜鸟一起学linux之常见错误的解决和常用命令
- 【BFS/Dijkstra】hdu 1548 A Strange Lift
- WM_COMMAND 和 WM_NOTIFY 区别
- java平台的脚本语言可以利用起来了 4
- 列表标题栏添加CheckBox
- Nginx、SSL双向认证、PHP、SOAP、Webservice、https
- 俄罗斯方块(C语言实现)
- POJ 1564 Sum It Up
- Java中:包、类、字段、方法命名规则
- 浅谈Java Applet应用程序的编辑与运行
- 关于Oracle TNS_ADMIN环境变量