WM_COMMAND 和 WM_NOTIFY 的区别

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


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

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


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


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


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


于是,WM_NOTIFY消息横空出世:


消息类型WPARAMLPARAM
WM_NOTIFY发生 WM_NOTIFY 消息的控件 IDNMHDR 指针

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

[cpp]  view plain copy
  1. typedef struct tagNMHDR  
  2. {  
  3.     HWND      hwndFrom;     // 控件句柄.  
  4.     UINT_PTR  idFrom;       // 控件 ID.  
  5.     UINT      code;         // NM_ code.  
  6. }   NMHDR;  
这只是一个一般的结构,如果我们需要知道  ListView 选中的行和列,那么需要:

[cpp]  view plain copy
  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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值