如题。
一般的作法是:在树形控件区响应右键菜单,现在想只在选择的结点上响应右键菜单,困为选择的结点不同,菜单的内容是不同的。

解决方案 »

  1.   

    可以。
    BEGIN_MESSAGE_MAP(CMyTreeCtrl, CTreeCtrl)
    //{{AFX_MSG_MAP(CMyTreeCtrl)
    ON_NOTIFY_REFLECT(NM_RCLICK, OnRClick)
    ON_WM_CONTEXTMENU()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()void CMyTreeCtrl::OnRClick(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    TRACE0("CMyTreeCtrl::OnRClick()\n");
    // Send WM_CONTEXTMENU to self
    SendMessage(WM_CONTEXTMENU, (WPARAM) m_hWnd, GetMessagePos());
    // Mark message as handled and suppress default handling
    *pResult = 1;
    }void CMyTreeCtrl::OnContextMenu(CWnd* pWnd, CPoint ptMousePos) 
    {
    // if Shift-F10
    if (ptMousePos.x == -1 && ptMousePos.y == -1)
    ptMousePos = (CPoint) GetMessagePos(); ScreenToClient(&ptMousePos); UINT uFlags;
    HTREEITEM htItem;

    htItem = HitTest( ptMousePos, &uFlags ); if( htItem == NULL )
    return;

    m_hActiveItem = htItem; CMenu menu,menu2;
    CMenu* pPopup,pPopup2;
            
    // the font popup is stored in a resource
    menu.LoadMenu(IDR_TREEITEM_CONTEXTMENU);//菜单1
    pPopup = menu.GetSubMenu(0);
            menu2.LoadMenu(IDR_TREEITEM_CONTEXT);//菜单2
    pPopup2 = menu.GetSubMenu(0); ClientToScreen(&ptMousePos);
           //判断鼠标点击的节点
      //这里控制室pPopup->TrackPopupMenu还是pPopup2->TrackPopupMenu
    //pPopup->TrackPopupMenu( TPM_LEFTALIGN, ptMousePos.x, ptMousePos.y, this );
    }