问题: 在CTreeCtrl中有 + 一个根节点(m_hRoot),
+ 一个子节点(m_hGroup),
一个成员节点(m_hMember)想问的是: 当我右单击子节点(m_hGroup)时,显示一个菜单,当我右单击成员节点(m_hMember)时显示另一个菜单,不如如何做到?
PS: 我是在void CAPDlg::OnRClkTree(NMHDR* pNMHDR, LRESULT * pResult)事件处理的。不知道该如何做,给我提示也是好的?感谢啦 ^_^
+ 一个子节点(m_hGroup),
一个成员节点(m_hMember)想问的是: 当我右单击子节点(m_hGroup)时,显示一个菜单,当我右单击成员节点(m_hMember)时显示另一个菜单,不如如何做到?
PS: 我是在void CAPDlg::OnRClkTree(NMHDR* pNMHDR, LRESULT * pResult)事件处理的。不知道该如何做,给我提示也是好的?感谢啦 ^_^
if(ItemHasChildren(hItem))
{
显示m_hGroup菜单
}
else
{
显示m_hMember菜单
}
{
if(ItemHasChildren(hItem))
{
显示m_hGroup菜单
}
else
{
显示m_hMember菜单
}
}
可以这样:
在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);
//判断有没有子节点,弹出不同的菜单
,,,,,,
}
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就可知期其类型. 当然, 还需要一些相关代码支持.