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);
}
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);
}
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;
}