如何在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应用程序中添加文档菜单?的主要内容,如果未能解决你的问题,请参考以下文章

mfc创建的单文档菜单栏按钮是灰的

mfc 多文档中怎样动态添加菜单项?

MFC 单文档添加自定义位图工具栏图标

MFC如何添加菜单快捷键

如何在mfc中动态添加子菜单

新建一个MFC单文档程序含有菜单和工具栏,又建了一个对话框,如何直接显示对话框?