MFC - 在运行时更改 CMFCMenuBar 内容

问题描述 投票:0回答:1

我创建了一个 MFC 应用程序,它有一个 CMFCMenuBar 对象来处理主菜单。
在软件初始化过程中,该对象将使用默认的IDR_MAINFRAME。

CMainFrame* pMainFrame = new CMainFrame;

if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
{
    delete pMainFrame;
    return FALSE;
}

而在CMainFrame类中,默认的初始化如下:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    if (!m_wndMenuBar.Create(this))
    {
        TRACE(_T("Failed to create menu-bar\n"));
        return -1;      // fail to create
    }

    m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);

    CMFCPopupMenu::SetForceMenuFocus(FALSE);

    m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockPane(&m_wndMenuBar);

    CDockingManager::SetDockingMode(DT_SMART);
    EnableAutoHidePanes(CBRS_ALIGN_ANY);

    return 0;
}

我有另一个菜单资源IDR_MAINFRAME_02。

如何在运行时从 IDR_MAINFRAME 切换到 IDR_MAINFRAME_02 ?

c++ mfc
1个回答
0
投票

您可以通过

CMFCMenuBar
(我认为几乎在任何时候)更改“拥有”(和显示)的菜单,只需将新菜单加载到
HMENU
对象中,然后使用该对象重新创建菜单栏对象加载的对象。

在您的情况下,执行此操作的

CMainFrame
类的成员函数将如下所示:

void CMainFrame::SwitchMenu(int menuID) // Pass, e.g., IDR_MAINFRAME_02 here
{
    HMENU newMenu = LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(menuID));
    m_wndMenuBar.CreateFromMenu(newMenu, TRUE, TRUE);
}

注意:当我在我的一个 MFC MDI 应用程序中对此进行测试时,它按预期工作(当我加载添加新子菜单的插件时,我使用一种非常相似的技术来更新菜单栏)。但是,“框架”似乎会记住新菜单并在下次启动应用程序时加载该菜单(默认情况下)。因此,要在启动时使用原始菜单每次,您只需在程序初始化期间(靠近

IDR_MAINFRAME
函数末尾)使用
_02
(不带
OnCreate
后缀)调用此函数即可.


CreateFromMenu
功能的文档

© www.soinside.com 2019 - 2024. All rights reserved.