NMTREEVIEW *pNMTreeView = (NMTREEVIEW *)pNMHDR;
CMenu *pMenu;
CPoint ptPos;
HTREEITEM hTreeItem;
UINT uFlags; if(m_pTreeCtrl)
{
// ptPos = pNMTreeView->ptDrag;
GetCursorPos(&ptPos);
ScreenToClient(&ptPos);
hTreeItem = m_pTreeCtrl->HitTest(ptPos, &uFlags);
pMenu = m_mnuPopup.GetSubMenu(0);
if(hTreeItem)
{
m_pTreeCtrl->Select(hTreeItem, TVGN_CARET);
pMenu->EnableMenuItem(ID_POPUP_DELETE, MF_BYCOMMAND | MF_ENABLED);
pMenu->EnableMenuItem(ID_POPUP_EDIT, MF_BYCOMMAND | MF_ENABLED);
}
else
{
pMenu->EnableMenuItem(ID_POPUP_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
pMenu->EnableMenuItem(ID_POPUP_EDIT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
ClientToScreen(&ptPos);
pMenu->TrackPopupMenu(TPM_RIGHTBUTTON, ptPos.x, ptPos.y, this);
}

解决方案 »

  1.   

    用GetCursorPos(&ptPos);和ScreenToClient(&ptPos);
      

  2.   

    可以这样做,在建立Tree Ctrl时,将InsertItem所返回的HTREEITEM句柄保存在一个数组中,然后建立如下通知消息映射:
    ON_NOTIFY(TVN_SELCHANGED,ID_YOUR_TREECTRL,OnSelItemChanged)
    这个通知消息映射要手工建立,其中ID_YOUR_TREECTRL为Tree Control的ID,OnSelItemChanged为通知消息映射处理函数,其形式如下:
    OnSelItemChanged(NMHDR *pnmhdr, LRESULT *pResult)
    {
    //将pnmhdr转换成LPNMTREEVIEW 结构
             LPNMTREEVIEW pnmtreeview = (LPNMTREEVIEW)pnmhdr;
             //提取被选中的Tree Item
    TVITEM tviNewItem = pnmtreeview->itemNew; if (tviNewItem.hItem == m_hTreeItem[0])
    AfxGetMainWnd()->SendMessage(WM_COMMAND,ID_ITEM0SELECTED);
             //在这里是将处理交给主窗口来负责,当然你也可以作其它选择         ...... pResult = 0;
    }