树控件的NM_TREEVIEW *

时间:2013-11-15 12:05:01

标签: c++ visual-c++ mfc

我正在处理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?

3 个答案:

答案 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