我创建了一个 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 ?
您可以通过
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
功能的文档。