当您单击右键单击visual studio中的任何选项卡时,将出现一个菜单,其中包含一些选项,如(保存,关闭除此之外的全部,复制完整路径,打开包含文件夹,....)。 如何在MFC(doc / view)选项卡式应用程序中添加这样的菜单? 提前谢谢。
答案 0 :(得分:1)
您应该有多个菜单。 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);
}
}
}
}
答案 1 :(得分:0)
我已经按照以下方式处理了函数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);
}