如何在MFC应用程序中添加文档菜单?

时间:2018-06-07 09:41:51

标签: c++ mfc

当您单击右键单击visual studio中的任何选项卡时,将出现一个菜单,其中包含一些选项,如(保存,关闭除此之外的全部,复制完整路径,打开包含文件夹,....)。 如何在MFC(doc / view)选项卡式应用程序中添加这样的菜单? 提前谢谢。

2 个答案:

答案 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);
}