怎么响应不同的树结点?谢谢大家了

tanwei1002 2008-06-23 09:29:49
比如右键树控件的不同结点,弹出不同的快捷菜单
下面这段代码并没有实现这功能,不知道怎么修改,谢谢大家了
CPoint curPoint;
GetCursorPos(&curPoint) ;
CMenu menu;
HANDLE hItem = m_BandWTree.GetSelectedItem ();
if(hItem == m_BandWTree.GetRootItem())
{
menu.LoadMenu(IDR_MENU1);

CMenu*pPopup = menu.GetSubMenu(0);

pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,curPoint.x,curPoint.y,this);
}
else
{
menu.LoadMenu(IDR_MENU2);

CMenu*pPopup = menu.GetSubMenu(0);

pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,curPoint.x,curPoint.y,this);
}
...全文
85 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanwei1002 2008-06-23
  • 打赏
  • 举报
回复
谢谢大家了 呵呵
谢谢大家了 呵呵
tanwei1002 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Mackz 的回复:]
C/C++ codevoidCDlgTestDlg::OnContextMenu(CWnd*pWnd, CPoint point)
{//TODO: 在此处添加消息处理程序代码if(pWnd&&(pWnd->GetDlgCtrlID()==IDC_TREE1))
{
CTreeCtrl*pTree=reinterpret_cast<CTreeCtrl*>(pWnd);
CPoint ptTree(point);
pTree->ScreenToClient(&ptTree);
UINT nFlags;
HTREEITEM hItem=pTree->HitTest(ptTree,&nFlags);if(hItem&&(nFlags&TVHT_ONITEMLABEL))

[/Quote]

恩 谢谢你了 你说的方法很对,这问题已经解决
谢谢啦
tanwei1002 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 datoucaicai 的回复:]
只显示的那个是不是IDR_MENU2啊?
感觉你的if(hItem == m_BandWTree.GetRootItem())条件有问题
[/Quote]

是的,就显示了IDR_MENU2,并且在树的任意位置都响应了
菜牛 2008-06-23
  • 打赏
  • 举报
回复

void CDlgTestDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: 在此处添加消息处理程序代码
if (pWnd && (pWnd->GetDlgCtrlID() == IDC_TREE1))
{
CTreeCtrl* pTree = reinterpret_cast<CTreeCtrl*>(pWnd);
CPoint ptTree(point);
pTree->ScreenToClient(&ptTree);
UINT nFlags;
HTREEITEM hItem = pTree->HitTest(ptTree, &nFlags);
if (hItem && (nFlags & TVHT_ONITEMLABEL))
{
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu* pSubMenu = NULL;
if (NULL == pTree->GetParentItem(hItem)) // 根节点
{
pSubMenu = menu.GetSubMenu(0);
}
else // 子节点
{
pSubMenu = menu.GetSubMenu(1);
}
if (pSubMenu)
pSubMenu->TrackPopupMenu(0, point.x, point.y, pWnd);
}
}
}
datoucaicai 2008-06-23
  • 打赏
  • 举报
回复
可以在Tree插入Item的时候,将每个Item的HTREEITEM保存到一个vector中

比如vector<HTREEITEM> vTree;
vector<HTREEITEM>::iterator itTree;

在右键响应函数中
HTREEITEM hSelectItem = m_BandWTree.GetSelectedItem ();
for(itTree = vTree.begin(); itTree!=vTree.end(); it++)
{
if((*it) == hSelectItem)
{
if(hSelecgtItem == hRootItem)
... //load menu1
else
... //load menu2
}
}

//随手写的,不保证完全正确

datoucaicai 2008-06-23
  • 打赏
  • 举报
回复
只显示的那个是不是IDR_MENU2啊?
感觉你的if(hItem == m_BandWTree.GetRootItem())条件有问题
tanwei1002 2008-06-23
  • 打赏
  • 举报
回复
补充说明:上面代码是在右键消息响应函数中,但是,现在是在树控件的任一位置右键都显示了快捷菜单,而且只显示了一个。
我现在是想实现仅仅只是在右键树结点的时候才响应,右键不同的结点,显示不同的快捷菜单。

哪位兄弟指点下,谢谢啦

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧