如何在MFC应用程序中添加文档菜单?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MFC应用程序中添加文档菜单?相关的知识,希望对你有一定的参考价值。
当您单击右键单击visual studio中的任何选项卡时,将出现一个菜单,其中包含一些选项,如(保存,关闭除此之外的全部,复制完整路径,打开包含文件夹,....)。如何在MFC(doc / view)选项卡式应用程序中添加这样的菜单?提前致谢。
答案
你应该有多个菜单。 IDR_MAINFRAME
通常在没有打开文件时使用,这不是你想要的文件。
资源编辑器应该显示另一个主菜单(不是弹出菜单),其ID类似于IDR_MyAppTYPE
。此菜单ID应该已经在您的CWinAppEx
类中:
BOOL CMyApp::InitInstance()
{
...
pDocTemplate = new CMultiDocTemplate(IDR_MyAppTYPE, ...);
...
}
这是您的文档菜单。
使用资源编辑器编辑此菜单。添加命令"Close all but this"
,菜单命令的id将类似于ID_WINDOW_CLOSEALL_BUT_THIS
您必须在CView
派生类中处理此命令。例:
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_COMMAND(ID_WINDOW_CLOSEALL_BUT_THIS, OnCloseAllButThis)
...
END_MESSAGE_MAP()
void CMyView::OnCloseAllButThis()
{
POSITION p1 = AfxGetApp()->GetFirstDocTemplatePosition();
while(p1)
{
CDocTemplate *doctempl = AfxGetApp()->GetNextDocTemplate(p1);
POSITION p2 = doctempl->GetFirstDocPosition();
while(p2)
{
CDocument* doc = doctempl->GetNextDoc(p2);
POSITION p3 = doc->GetFirstViewPosition();
while(p3)
{
CView* view = doc->GetNextView(p3);
if(view && view->GetParentFrame() && view != this)
view->GetParentFrame()->SendMessage(WM_CLOSE);
}
}
}
}
另一答案
我已经在函数WM_RBUTTONUP
上处理了PreTranslateMessage
消息,如下所示:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
if( WM_RBUTTONUP == pMsg->message)
{
//check that the right click is on MDI tab area.
CWnd* pWnd = FromHandle(pMsg->hwnd);
CMFCTabCtrl* tabGroup = dynamic_cast<CMFCTabCtrl*>(pWnd);
if (tabGroup)
{
CPoint clickLocation = pMsg->pt;
tabGroup->ScreenToClient(&clickLocation);
int tabIndex = tabGroup->GetTabFromPoint(clickLocation);
if (tabIndex != -1)
{
CWnd* pTab = tabGroup->GetTabWnd(tabIndex);
if (pTab)
{
CPoint point = pMsg->pt;
ClientToScreen (&point);
ShowPopupTabOptions(point);
}
}
}
}
return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}
以上是关于如何在MFC应用程序中添加文档菜单?的主要内容,如果未能解决你的问题,请参考以下文章