• WM_COMMAND 和 WM_NOTIFY 的区别


    当我们按下一个菜单选项,或者一个控件需要通知父窗口一个事件发生(如鼠标单击、双击等),或者快捷键被按下时,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消息横空出世:

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


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

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

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

    [cpp] view plaincopy
     
    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。

  • 相关阅读:
    Pyton项目打包成exe文件
    App数据指标
    电商基础指标体系
    Matplotlib复杂作图
    Sklearn之聚类分析
    Seaborn可视化
    Matplotlib可视化2
    Matplotlib可视化1
    Pandas可视化
    Linux常用指令(3)
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/5098214.html
Copyright © 2020-2023  润新知