CMenu newMenu;
newMenu.LoadMenu(menuID);
SetMenu(&newMenu);
newMenu
является временным объектом.Он будет уничтожен, как только выйдет функция.Результатом является неопределенное поведение.
CMenu* pMenu = GetMenu();
if (pMenu == NULL) return;
pMenu->Detach();
Я не уверен, что этот код будет выполнять.Обратите внимание, что CWnd::SetMenu
заменит старое меню.Он не уничтожит старый дескриптор меню, но MFC будет обрабатывать очистку в конце (Detach
не уничтожит дескриптор, если это было целью)
Попробуйте вместо этого код:
Объявление объектов меню как члена класса:
class CMainFrame : public CMDIFrameWnd
{
CMenu m_menu1, m_menu2;
...
};
Загрузка меню один раз:
CMainFrame::CMainFrame()
{
m_menu1.LoadMenu(IDR_MENU1);
m_menu2.LoadMenu(IDR_MENU2);
...
}
Изменение меню:
void CMainFrame::OnChangeMenu()
{
if(want_menu1)
{
SetMenu(&m_menu1);
}
else if (want_menu2)
{
SetMenu(&m_menu2);
}
}