NMHDR和NM_TREEVIEW转换问题

在CTreeCtrl的OnSelchangedTree1事件处理中,NMHDR*类型的指针可以强制转换为NM_TREEVIEW*类型。这是因为NMHDR结构位于NMTREEVIEW结构的起始位置,使得两者在内存布局上有重叠。这种转换被Windows消息机制所允许,允许直接通过NM_TREEVIEW结构访问额外的成员如action和item信息。这是一种设计上的便利,让开发者能直接处理特定类型的控件事件。
摘要由CSDN通过智能技术生成

 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的结构格式化了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值