我正在处理NM_TREEVIEW,从上面的结构我只专注于itemNew.lParam。
例如,
void CCtrlDlgTree::OnSelChangedTreeCtrl(
NMHDR* pNMHDR,
LRESULT* pResult
)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
pNMTreeView->itemNew.lParam;
}
在上面的例子中,我得到 NM_TREEVIEW 的正确指针。但是当我为下面的函数应用相同的逻辑时
void CCtrlModDefDlgTree::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
pNMTreeView->itemNew.lParam;
}
我获得 NM_TREEVIEW 指针的垃圾值。
请帮助我如何访问OnNMRClick中的NM_TREEVIEW或如何访问OnNMRClick中的pNMTreeView-> itemNew?
答案 0 :(得分:2)
如果您要实现的目的是显示上下文菜单,请参阅以下知识库文章:
How To Display a Context Menu for CTreeCtrl (KB222905)
至于代码,这个演员:
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
看起来不正确,因为“右键单击”通知消息不会将NM_TREEVIEW结构作为lParam发送,而只是发送NMHDR结构。
答案 1 :(得分:0)
正如你所说的那样你想在下面的函数中使用lParam of Tree节点,
void CCtrlModDefDlgTree::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
pNMTreeView->itemNew.lParam;
}
我不可能从* pNMHDR中检索lParam。但是如果你在这个函数中成功获得HTREEITEM,那么你可以像下面的例子一样轻松获得lParam,
CCtrlModDefDlgTree::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
/* Get the cursor position for this message */
DWORD dwPos = GetMessagePos();
/* Convert the co-ords into a CPoint structure */
CPoint pt( GET_X_LPARAM( dwPos ), GET_Y_LPARAM ( dwPos ) );
CPoint spt;
spt = pt;
/* convert to screen co-ords for the hittesting to work */
ScreenToClient( &spt );
UINT test;
HTREEITEM hti = HitTest( spt, &test );
TVITEM tvi;
tvi.hItem = hti;
tvi.mask = TVIF_PARAM;
TreeView_GetItem(GetSafeHwnd(),&tvi);
}
从 TVITEM * 你很容易得到树节点的lParam。
答案 2 :(得分:-1)
只需阅读码头。 NM_RCLICK没有给你一个指向树视图项的指针!
它只是指向NMHDR的指针! 请阅读MSDN docs。
如果您使用WM_RBUTTONDOWN并确定自己命中的项目可能会更容易(使用TVM_HITTEST)