NMHDR和NM_TREEVIEW转换问题

 CTreeCtrl树控件中有一个消息响映函数如下:
void CCTreeCtrlDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;
}
为什么NMHDR*类型可以强至转换成NM_TREEVIEW*类型?这两个类型根本就不一样
NMHDR是如下结构,一个窗口句柄和两个UINT类型的结构体.
typedef struct tagNMHDR
{
    HWND  hwndFrom;
    UINT  idFrom;
    UINT  code;         // NM_ code
}   NMHDR;
而NM_TREEVIEW如下结构
typedef struct tagNMTREEVIEWA {
    NMHDR       hdr;
    UINT        action;
    TVITEMA    itemOld;
    TVITEMA    itemNew;
    POINT       ptDrag;
}NMTREEVIEWA, FAR *LPNMTREEVIEWA;

 

 

回答:

 

1.

Windows 传的就是NMTREEVIEW* 你放心吧.
为什么能转换:
NMHDR 结构在 NMTREEVIEW 的开头.
所以NMHDR的那些成员在NMTREEVIEW中具有相同的位置. 所以可以通用:)
你可以想像 NMTREEVIEW 是NMHDR 的子类

Windows 是故意的 就想让它这样.

 

2.

它们都是指向结构的指针。
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
pNMTreeView 指向了和pNMHDR相同的地址。
你在调用pNMTreeView 时调用的也是pNMHDR的内容,只不过是按照NM_TREEVIEW的结构格式化了。

你可能感兴趣的:(MFC)