銷毀 AppWizard 產生的預設選單資源,改用 `SetMenu` 動態載入不同模式對應的選單資源,實現介面模式熱切換。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
cs.style &= ~FWS_ADDTOTITLE;
cs.style &= ~(WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
if (cs.hMenu) { DestroyMenu(cs.hMenu); cs.hMenu = NULL; }
return CFrameWnd::PreCreateWindow(cs);
}
// 切換模式
void CMainFrame::SetMode(UINT nMenuID) {
CMenu* pMenu = new CMenu; pMenu->LoadMenu(nMenuID);
SetMenu(pMenu); // 舊選單自動銷毀
}
MDI 子視窗啟動時會自動切換選單,必須攔截並禁用:
// 1. 保留 IDR_MAINFRAME 資源 (防 MFC 斷言),刪除子視窗選單資源 (IDR_XXXTYPE)
BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwStyle, CWnd* pParent, CCreateContext* pContext) {
return CFrameWnd::LoadFrame(nIDResource, dwStyle, pParent, pContext); // 不載入選單
}
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {
return CreateClient(lpcs, NULL); // 傳 NULL 阻止 MFC 建立預設客戶區/選單切換
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
cs.style &= ~FWS_ADDTOTITLE;
cs.style &= ~(WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
if (cs.hMenu) { DestroyMenu(cs.hMenu); cs.hMenu = NULL; }
return CFrameWnd::PreCreateWindow(cs);
}
enum ViewMode { MODE_NORMAL, MODE_SIMPLE, MODE_MINIMAL };
void CMainFrame::SwitchMode(ViewMode mode) {
UINT menuID = 0;
switch (mode) {
case MODE_NORMAL: menuID = IDR_MENU_NORMAL; break;
case MODE_SIMPLE: menuID = IDR_MENU_SIMPLE; break;
case MODE_MINIMAL: menuID = IDR_MENU_MINIMAL; break;
}
if (menuID) SetMode(menuID);
}


