首页 > 解决方案 > 如何在 MFC 应用程序中添加文档菜单?

问题描述

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

标签: c++mfc

解决方案


你应该有不止一个菜单。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);
            }
        }
    }
}

推荐阅读