NMHDR 与 NM_LISTVIEW,NM_TREEVIEW 的关系

NMHDR   =   Notify   Message   Handler

[cpp] view plain copy
  1. typedef struct tagNMHDR   
  2. {  
  3.     HWND hwndFrom;  
  4.     UINT_PTR idFrom;  
  5.     UINT code;  
  6. } NMHDR;  

消息通过下面的宏定义之: 
  ON_NOTIFY(   wNotifyCode,   idControl,   memberFxn   ) 
  wNotifyCode   
  通知消息标识符代码,如   TBN_BEGINADJUST。   
  idControl   
  发送通知的控件的标识符。   
  memberFxn   
  接收到通知时调用的成员函数。

在WM_NOTIFY中,lParam中放的是一个称为NMHDR结构的指针。在wParam中放的则是控件的ID。  
   
    NMHDR结构是很值得一提的,该结构包括有关制作该通知的控件的任何内容,而不受空间和类型的限制,他的来历也是很有意思的。  
    在最初的windows3.x中,根本就不存在什么WM_NOTIFY,控件通知它们父窗口,如鼠标点击,控件背景绘制事件,通过发送一个消息到父窗口。简单的通知仅发送一个WM_COMMAND消息,包含一个通知码和一个在wParam中的控件ID及一个在lPraram中的控件句柄。这样一来,wParam和lParam就都被填充了,没有额外的空间来传递一些其它的消息,例如鼠标按下的位置和时间。  
     为了克服这个困难,windows3.x就提出了一个比较低级的解决策略,那就是给一些消息添加一些附加消息,最为明显的就是控件自画用到的DRAWITEMSTRUCT。不知道大家对这个结构熟悉不,不过,如果你是老手,你应该非常清楚这个结构,这个结构包含了9个内容,几乎你需要控制的信息都给你提供了。为什么说它比较低级呢?因为不同的消息附加的内容不同,结果就是一盘散沙,非常混乱。  
     在win32中,MS又提出了一个更好的解决方案:引进NMHDR结构。这个结构的引进就是消息统一起来,利用它可以传递复杂的信息。这个结构的布局如下:  
typedef struct tagNMHDR    

{  
    HWnd  hWndFrom;// 相当于原WM_COMMAND传递方式的lParam  
    UINT   idFrom;      // 相当于原WM_COMMAND传递方式的wParam(low-order)  
    UINT   code; // 相当于原WM_COMMAND传递方式的NotifyCode(wParam's high- order)          

}NMHDR;  
         

    对于这个结构的应用于WM_NOTIFY信息结构,结果WM_NOTIFY就变成了: 
          A、无附加信息。结构变得很简单,就是一个NMHDR结构。 
          B、有附加信息。定义一个大的结构,它的第一个元素就是NMHDR结构,它的后面放置附加信息。


举例://得到选中的列
void   CMyView::OnColumnclick(NMHDR*   pNMHDR,   LRESULT*   pResult)    
{       
      NM_LISTVIEW*   pNMListView   =   (NM_LISTVIEW*)pNMHDR;  
      //得到选中的列      
      int nColumn=pNMListView->iSubItem;  

  
  成员函数将用下列原型声明:  
 afx_msg   void   memberFxn(NMHDR *pNotifyStruct,LRESULT   *pResult); 

由此知识就可方便解释NM_LISTVIEW与NM_TREEVIEW了,

其实:

NM_LISTVIEW 为

 #define LPNM_LISTVIEW   LPNMLISTVIEW
 #define NM_LISTVIEW     NMLISTVIEW

而NMLISTVIEW结构为:
 

typedef struct tagNMLISTVIEW {
    NMHDR hdr;
    int iItem;
    int iSubItem;
    UINT uNewState;
    UINT uOldState;
    UINT uChanged;
    POINT ptAction;
    LPARAM lParam;
} NMLISTVIEW, *LPNMLISTVIEW;


你可能感兴趣的:(windows,ListView,struct,command)