C++ 在MDI应用程序中的不同功能区之间切换

C++ 在MDI应用程序中的不同功能区之间切换,c++,mfc,ribbon,mdi,mfc-feature-pack,C++,Mfc,Ribbon,Mdi,Mfc Feature Pack,我想在应用程序中为不同的MDI子帧在不同的色带之间切换。我知道用老式菜单是可能的,但我不能用功能包色带 使用旧式菜单时使用的代码: pDocTemplate = new CMultiDocTemplate( IDR_MAINFRAME,//Menu to load RUNTIME_CLASS(CModDoc), RUNTIME_CLASS(CModFrame), // custom MDI child frame RUNTIME_CLASS(CdotView));

我想在应用程序中为不同的MDI子帧在不同的色带之间切换。我知道用老式菜单是可能的,但我不能用功能包色带

使用旧式菜单时使用的代码:

pDocTemplate = new CMultiDocTemplate(
    IDR_MAINFRAME,//Menu to load
    RUNTIME_CLASS(CModDoc),
    RUNTIME_CLASS(CModFrame), // custom MDI child frame
    RUNTIME_CLASS(CdotView));
if (!pDocTemplate)
    return FALSE;
AddDocTemplate(pDocTemplate);

pDocTemplate = new CMultiDocTemplate(
    IDR_RES_RNGACTIV,//Menu to load
    RUNTIME_CLASS(CModRangeDoc),
    RUNTIME_CLASS(CModRangeFrame), //custom MDI child frame
    RUNTIME_CLASS(CBlankView));
if (!pDocTemplate)
    return FALSE;
AddDocTemplate(pDocTemplate);
我考虑的另一种方法是卸载当前功能区并从资源中加载新功能区

//Unload ribbon code?
m_wndRibbonBar.LoadFromResource(IDR_RIBBON);

我最终隐藏了原来的ribbonbar,然后加载并显示了一个新的ribbonbar。但不确定这是否是最好的方法

    CMultiDocTemplate *pDoc = GetDocTemplate(7);
    if (pDoc)
    {
        CFloorActivDoc* pDocument = (CFloorActivDoc*)pDoc->CreateNewDocument();
        CFloorFrame* pFrame = (CFloorFrame*)pDoc->CreateNewFrame(pDocument, NULL);
        if (pFrame)
        {
            pDoc->InitialUpdateFrame(pFrame, pDocument);
            m_wndRibbonBar.ShowPane(FALSE, FALSE, TRUE);//Hide original ribbon
            m_FloorRibbonBar.Create(this);
            m_FloorRibbonBar.LoadFromResource(IDR_RIBBON_FLOORACT);
        }

不需要有多个对象。如果不需要,可以使用,然后必须使用方法将更改应用到用户界面。
请记住检查的返回值,以确保加载成功,并且调用非常重要,否则您将看不到新功能区。

遗憾的是,正确答案来得太晚,但MFC标记不太受关注。哈哈哈,您是对的,但在某些情况下,您特别需要不同的功能区,因为仅具有上下文类别是不够的。您可以考虑使用不同的配置文件,但也有可能有用的功能区状态,但我从未在它们上花费时间。