在用VS做MFC编程时,新建的工程中自带了文件视图/类视图/属性窗口/输出窗口等内容。文件视图FileView中具有初始右键菜单,如图所示:
那么如果想要给这个右键菜单增加菜单项,该如何实现呢?
1. 首先可以看一下这个右键菜单是在哪里响应的,打开FileView.cpp,里面有一个OnContextMenu响应事件,其代码如下:
代码语言:javascript复制void CFileView::OnContextMenu(CWnd* pWnd, CPoint point) //右键菜单
{
CTreeCtrl* pWndTree = (CTreeCtrl*) &m_wndFileView;
ASSERT_VALID(pWndTree);
if (pWnd != pWndTree)
{
CDockablePane::OnContextMenu(pWnd, point);
return;
}
if (point != CPoint(-1, -1))
{
// 选择已单击的项:
CPoint ptTree = point;
pWndTree->ScreenToClient(&ptTree);
UINT flags = 0;
HTREEITEM hTreeItem = pWndTree->HitTest(ptTree, &flags);
if (hTreeItem != NULL)
{
pWndTree->SelectItem(hTreeItem);
}
}
pWndTree->SetFocus();
theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EXPLORER, point.x, point.y, this, TRUE);
}
在网上找了很多关于右键菜单的实现方法,与FileView相关的很难找到,应该是因为平常多数人用到的右键菜单都是给某个对话框窗体添加自定义的菜单,会涉及到右键点击事件OnRButtonDown ; WM_CONTEXTMENU消息等。
然而这里我是想给文件视图中已有的右键菜单添加几个菜单项,增加功能。通过仔细分析上面的代码发现,在最后一句通过ShowPopupMenu方法绑定了ID为IDR_POPUP_EXPLORER的资源,这才是真正的菜单所在,于是转到IDR_POPUP_EXPLORER的定义,发现是在Resource.h中定义的。
因此打开资源视图(在VS顶部的菜单项:视图->其他窗口->资源视图),如下图,Menu中ID为IDR_POPUP_EXPLORER的菜单项,即打开了该右键菜单。
打开后可以添加/修改/删除菜单项,如图:
最后给菜单项添加响应事件,实现代码即可。