当我们按下一个菜单选项,或者一个控件需要通知父窗口一个事件发生(如鼠标单击、双击等),或者快捷键被按下时,Windows将会发送一个 WM_COMMAND 消息给父窗口。那么 WM_COMMAND 消息参数是什么呢?

WM_COMMAND 消息来源 WPARAM 高位 WPARAM 低位 LPARAM
菜单 0 菜单 ID 0
快捷键 1 快捷键对应菜单 ID 0
控件 响应 Code(如BN_CLICKED) 控件 ID 控件句柄

OK,一切运行的很好,通过 WPARAM 高位置1或0区分菜单、快捷键、或者控件事件Code,通过 WPARAM 低位可以知道发出WM_COMMAND消息的菜单项或控件ID,通过LPARAM知道控件句柄。

然而,有一天,当选中一个 ListControl 控件中的某一行时,人们忽然发现父窗口需要知道被选中该行的索引,这下为难了,对于控件来看,整个WM_COMMAND消息的WPARAM、LPARAM 都被塞的满满的。怎么办呢?这儿有一种解决办法:新增一个消息,就叫WM_LIST_CONTROL_CLICKED吧,如下:

消息类型 WPARAM 高位 WPARAM 低位 LPARAM
WM_LIST_CONTROL_CLICKED 被选中行的索引 ListControl 控件的 ID ListControl 控件的句柄

呃,看起来的确解决了问题,我们把事件 Code 通过消息 ID 体现了出来,然后把被选中行的索引塞进了WPARAM的高位,看起来非常完美!然而又有一天,人们发现对ListView,父窗口需要知道单击该控件时选中的行号和列号,以便处理,照猫画虎,我们又加了一个WM_LIST_VIEW_CLICKED。接着人们发现其他一些控件都需要这样的改进,如果这样增加消息的话,岂不是没完没了了?!!

于是,WM_NOTIFY消息横空出世:

消息类型 WPARAM LPARAM
WM_NOTIFY 发生 WM_NOTIFY 消息的控件 ID NMHDR 指针

现在,我们将所有附加信息都存放在 NMHDR(Notify Message Handler)的一个结构体中,该结构体指针通过 LPARAM 通知到父窗口。NMHDR如下:

  1. typedef struct tagNMHDR
  2. {
  3. HWND      hwndFrom;     // 控件句柄.
  4. UINT_PTR  idFrom;       // 控件 ID.
  5. UINT      code;         // NM_ code.
  6. }   NMHDR;

这只是一个一般的结构,如果我们需要知道 ListView选中的行和列,那么需要:

  1. typedef struct tagNMLISTVIEW
  2. {
  3. NMHDR   hdr;            // NMHDR.
  4. int     iItem;          // 行号.
  5. int     iSubItem;       // 列号.
  6. UINT    uNewState;
  7. UINT    uOldState;
  8. UINT    uChanged;
  9. POINT   ptAction;
  10. LPARAM  lParam;
  11. } NMLISTVIEW, *LPNMLISTVIEW;

像其他的控件,都会对应这样一个结构体,它们的第一个字段一定是 NMHDR。但一些微软标准控件并不会发送WM_NOTIFY 消息,这些控件有:Edit、ComboBox、ListBox、Button、ScrollBar、Static等。所以在使用过程中请注意用法,最好的做法是参考MSDN。

WM_COMMAND 和 WM_NOTIFY 的区别的更多相关文章

  1. WM_COMMAND和WM_NOTIFY区别[转]

    对这几个消息的理解要先了解一下Window消息的背景.          在Windows3.1里,控件会将mouse,   keybord等等的消息通知它的父窗口,   使用的消息就只有WM_COM ...

  2. WM_COMMAND消息

    原文地址:https://blog.csdn.net/whm243149796/article/details/78966065 当用户点击菜单.按钮.下拉列表框等控件时候,会触发WM_COMMAND ...

  3. windows消息机制详解(转载)

    消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序.消息本身是作为一个记录传递给应用程序的 ...

  4. Windows消息编程(写的不错,有前因后果)

    本文主要包括以下内容: 1.简单理解Windows的消息2.通过一个简单的Win32程序理解Windows消息3.通过几个Win32程序实例进一步深入理解Windows消息4.队列消息和非队列消息5. ...

  5. [用UpdateLayeredWindow实现任意异形窗口]

    前面提到,我们可以用SetWindowRgn或SetLayeredWindowAttributes实现不规则以及半透明的效果 对于SetWindowRgn,它通过一个Rgn来设置区域,这个Rgn一般可 ...

  6. ATL7窗口类详细剖析

    前言: ATL是微软继MFC之后提供的一套C++模板类库,小巧.精妙.效率极高.它的主要作用是为我们编写COM/DOM/COM+程序提供了丰富的支持.但是ATL只能写COM么?我以前只是MFC程序员的 ...

  7. 深度解析VC中的消息(转发)

    http://blog.csdn.net/chenlycly/article/details/7586067 这篇转发的文章总结的比较好,但是没有告诉我为什么ON_MESSAGE的返回值必须是LRES ...

  8. ATL的GUI程序设计(4)

    第四章 对话框和控件 对于Win32 GUI的程序设计来说,其实大部分的情况下我们都不需要自己进行窗口类的设计,而是可以使用Win32中与用户交互的标准方式--对话框(Dialog Box).我们可以 ...

  9. 如何给对话框中的控件发送消息呢?Windows消息分类

    以博文CTabCtrl中介绍的那样,给Tab添加子对话框来显示Tab内容.那么如果这个子对话框中含有个CTreeCtrl控件,有个Button控件,我想要模拟给这两个控件发送消息,该怎么办呢?直接把给 ...

随机推荐

  1. SSO 证书配置

    ssodev.crt为开发环境证书ssotest.crt为测试环境证书 将证书拷贝到目录:{JDK}\jre\lib\security 其中 {JDK} 是实际安装JDK的位置.然后cmd进入命令窗口 ...

  2. SpiralOrderTraverse,螺旋遍历二叉树,利用两个栈

    问题描述:s型遍历二叉树,或者反s型遍历二叉树 算法分析:层序遍历二叉树只需要一个队列,因为每一层都是从左往右遍历,而s型遍历二叉树就要用两个栈了,因为每次方向相反. public static vo ...

  3. 异步编程——promise

    异步编程--promise 定义 Promise是异步编程的一个解决方案,相比传统的解决方法--回调函数,使用Promise更为合理和强大,避免了回调函数之间的层层嵌套,也使得代码结构更为清晰,便于维 ...

  4. vue组件化开发-vuex状态管理库

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试工具 ...

  5. Spring3: 在Bean定义中使用EL-表达式语言

    5.4.1  xml风格的配置 SpEL支持在Bean定义时注入,默认使用“#{SpEL表达式}”表示,其中“#root”根对象默认可以认为是ApplicationContext,只有Applicat ...

  6. 'yii\base\InvalidRouteException' with message 'Unable to resolve the request "site/error".'

    引用:http://www.linuxidc.com/Linux/2015-02/114116.htm Yii2高级版本复制新项目会遇到下面的报错信息: exception 'yii\base\Inv ...

  7. python脚本1_给一个半径求圆的面积和周长

    #给一个半径,求圆的面积和周长,圆周率3.14 r = int(input('r=')) print('area='+str(3.14*r*r)) print('circumference='+str ...

  8. 用WebClient在异步下载或上传时每次只进行一个任务 C#

    当在每次上传或者下载的时候,我只想进行一个任务的,我用的是WebClient类,但是我又不想用同步的方法UploadFile.DownloadFile,因为WebClient这个类的同步方法没有Upl ...

  9. 案例学习:留言本制作V1、V2

    需求V1: 请设计一个留言本功能的程序,包括普通用户发布和查看留言,管理员登录.查看和删除留言. 实验指导内容详见留言本制作(1) 需求V2: 1.请修改留言本程序的功能,添加普通用户添加登录功能,用 ...

  10. Educational Codeforces Round 23D

    给n个数求每个子区间的价值,区间的价值是最大值-最小值 套路题= =,分别算最大值和最小值的贡献,用并查集维护,把相邻点连一条边,然后sort,求最大是按边价值(两个点的最大价值)小的排,求最小是按最 ...