MFC CTreeView学习之右键菜单_获取选中节点的方式HitTest和GetSelectedItem的区别(二)

本文介绍如何在MFC中使用树视图控件获取选中节点的文本,并展示如何加载和显示上下文菜单。具体步骤包括获取鼠标位置、转换坐标、通过树视图HitTest获取选中项、加载菜单资源、获取子菜单句柄以及使用TrackPopupMenu显示菜单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CPoint pt;
UINT nFlags;
GetCursorPos(&pt);
::ScreenToClient(m_TreeCtrl->m_hWnd, &pt);
HTREEITEM hItem2 = m_TreeCtrl->HitTest(pt, &nFlags); //获取选中节点  注:此处获取的是当前选中的节点
CString sMsg;
sMsg.Format(_T("%s"), m_TreeCtrl->GetItemText(hItem2));
AfxMessageBox(sMsg);

HTREEITEM hItem = m_TreeCtrl->GetSelectedItem(); //获取选中节点  注:此处为获取上一次选中的节点
sMsg.Format(_T("%s"), m_TreeCtrl->GetItemText(hItem));
AfxMessageBox(sMsg);

CMenu menu;
if (!menu.LoadMenuW(IDR_TREE_MENU)) //IDR_TREE_MENU为添加菜单ID
return;
/*
***************API函数***************
GetSubMenu函数功能:该函数取得被指定菜单激活的下拉式菜单或子菜单的句柄。
函数原型:HMENU GetSubMenu(HMENU hMenu,int nPos;
参数:
hMenu:菜单句柄。
nPos:激活下拉式菜单或子菜单的菜单项相对于零的位置。
返回值:如果函数调用成功,返回值是菜单项激活的下拉式菜单或子菜单的句柄。如果菜单项没有激活一个下拉式菜单或子菜单,返回值是NULL。

***********MFC类成员函数************
CMenu::GetSubMenu
CMenu* GetSubMenu( int nPos ) const;
返回值:
若弹出菜单位于指定的位置,则返回CMenu 对象的指针,其中CMenu对象要包含弹出菜单的句柄;否则为NULL。如果CMenu 对象不存在,那么将创建临时的CMenu 对象。但返回的CMenu指针不应被存储。
参数:nPos 指定包含在菜单中的弹出菜单的位置。对于第一个菜单项,位置值开始为0。弹出菜单的标识符不能被该函数使用。
*/

CMenu*   pSubMenu = menu.GetSubMenu(0);
if (!pSubMenu)
return;
/*
函数功能:该函数在指定位置显示快捷菜单,并跟踪菜单项的选择。快捷菜单可出现在屏幕上的任何位置
函数原型:BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, int nReserved, HWND hWnd, CONST RECT* prcRect);
参数:
hMenu:被显示的快捷菜单的句柄。此句柄可为调用CreatePopupMenu创建的新快捷菜单的句柄,也可以为调用GetSubMenu取得的与一个已存在菜单项相联系的子菜单的句柄。
uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:
TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。
TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。
TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。
用下列标志位之一来确定函数如何垂直放置快捷菜单:
TPM_BOTTOMALIGN:若设置此标志,函数使快捷菜单的下边界与由参数y指定的坐标对齐。
TPM_TOPALIGN:若设置此标志,函数使快捷菜单的上边界与由参数y指定的坐标对齐。
TPM_VCENTERALIGN;若设置此标志,函数将按参数y指定的坐标垂直居中放置快捷菜单
用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:
TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。
TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。
(注意:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。当不设置TPM_NONOTIFY和TPM_RETURNCMD时,程序给自己发送了一个WM_COMMAND消息,以返回的ID号为参数wParam的值)
用下列标志位之一来确定在快捷菜单跟踪哪一个鼠标键:
TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。
TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标右键选择菜单项。
X:在屏幕坐标下,快捷菜单的水平位置。
Y:在屏幕坐标下,快捷菜单的垂直位置。
NReserved:保留值,必须为零。
HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的WM_COMMAND消息。
如果在参数uFlags里指定了TPM_NONOTIFY值,此函数不向hWnd标识的窗口发消息。 但必须给hWnd里传一个窗口句柄,可以是应用程序里的任一个窗口句柄。
PrcRect:未用。
返回值:如果在参数uFlags里指定了TPM_RETURNCMD值,则返回值是用户选择的菜单项的标识符。如果用户未作选择就取消了菜单或发生了错误,则退回值是零。如果没在参数uFlags里指定TPM_RETURNCMD值,若函数调用成功,返回非零值,若函数调用失败,返回零。若想获得更多的错误信息,清调用GetLastError
*/

TrackPopupMenu(pSubMenu->m_hMenu, 0, pt.x, pt.y, 0, m_hWnd, NULL);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值