以下例子摘自《vc++技术内幕(第四版)》第六章 6.11 列表 EX06B
void CEx06bDialog::OnItemchangedListview1(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CListCtrl* pList =
(CListCtrl*) GetDlgItem(IDC_LISTVIEW1);
int nSelected = pNMListView->iItem;
if (nSelected >= 0) {
CString strItem = pList->GetItemText(nSelected, 0);
SetDlgItemText(IDC_STATIC_LISTVIEW1, strItem);
}
*pResult = 0;
}问题:NM_LISTVIEW是什么结构,和NMHDR什么关系,是不是NMHDR的派生类啊?

解决方案 »

  1.   

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

  2.   

    typedef struct tagNMHDR { 
      HWND hwndFrom; 
      UINT idFrom; 
      UINT code; 
    } NMHDR; 
    不是派生,只是指针传递
      

  3.   

    typedef struct tagNMHDR { 
        HWND hwndFrom; 
        UINT idFrom; 
        UINT code; 
    } NMHDR; NMHDR是WM_NOTIFY消息的通用参数。该结构体只是一个更大的结构体的头部,
    NM_LISTVIEW型结构体是NMHDR型结构体的扩展,不是派生类
    所以通过强制类型转换就可以使WM_LISTVIEW得到NMHDR中的数据