以下例子摘自《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的派生类啊?
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的派生类啊?
typedef struct tagNMLISTVIEW
{
NMHDR hdr;
int iItem;
int iSubItem;
UINT uNewState;
UINT uOldState;
UINT uChanged;
POINT ptAction;
LPARAM lParam;
} NMLISTVIEW, *LPNMLISTVIEW;
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR;
不是派生,只是指针传递
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR; NMHDR是WM_NOTIFY消息的通用参数。该结构体只是一个更大的结构体的头部,
NM_LISTVIEW型结构体是NMHDR型结构体的扩展,不是派生类
所以通过强制类型转换就可以使WM_LISTVIEW得到NMHDR中的数据