问题: 在CTreeCtrl中有              + 一个根节点(m_hRoot), 
                +  一个子节点(m_hGroup), 
                     一个成员节点(m_hMember)想问的是: 当我右单击子节点(m_hGroup)时,显示一个菜单,当我右单击成员节点(m_hMember)时显示另一个菜单,不如如何做到? 
  PS:   我是在void CAPDlg::OnRClkTree(NMHDR* pNMHDR, LRESULT * pResult)事件处理的。不知道该如何做,给我提示也是好的?感谢啦 ^_^

解决方案 »

  1.   

    判断项目是否有子节点
    if(ItemHasChildren(hItem))
    {
      显示m_hGroup菜单
    }
    else
    {
      显示m_hMember菜单
    }
      

  2.   

    if(GetParentItem(hItem) != NULL)
    {
    if(ItemHasChildren(hItem))
    {
      显示m_hGroup菜单
    }
    else
    {
      显示m_hMember菜单
    }
    }
      

  3.   

    右键单击项的时候,把单击的项设为选中项,再根据是否有子节点显示不同的菜单
    可以这样:
    在void CAPDlg::OnRClkTree(NMHDR* pNMHDR, LRESULT * pResult)中         //得到右键单击的项
    CPoint pt;
    GetCursorPos(&pt);
    m_TreeCtrl.ScreenToClient(&pt);
    HTREEITEM hItem = m_TreeCtrl.HitTest(pt); if(hItem != NULL)
    {
    //设为当前选中的项
    m_TreeCtrl.Select(hItem,TVGN_CARET | TVGN_DROPHILITE);
                      //判断有没有子节点,弹出不同的菜单
                      ,,,,,,
             }
      

  4.   

    我一般在OnContextMenu事件中处理先把点击项变成选中项
    BOOL TracertSelectTree(CTreeCtrl *pTree)
    {
    if(pTree == NULL || !::IsWindow(pTree->m_hWnd))
    return FALSE; CPoint thePoint;
    GetCursorPos(&thePoint); CRect rcWin;
    pTree->GetWindowRect(rcWin);
    thePoint -= rcWin.TopLeft();
    HTREEITEM hItem = pTree->HitTest(thePoint);
    if(hItem != NULL)
    return pTree->Select(hItem, TVGN_CARET);
    else
    return FALSE;
    }然后对选中项进行判别, 方法很多, 可以是它的相对位置, 也可以是GetItemData反映出的不同值.我一般在tree结点的data上放一个CObject派生类的指针, 然后使用IsKindOf就可知期其类型. 当然, 还需要一些相关代码支持.