首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ SDI/MDI 程式動態切換多種顯示模式 (正常/簡單/簡潔)

     編輯:VC 教學

核心思路

銷毀 AppWizard 產生的預設選單資源,改用 `SetMenu` 動態載入不同模式對應的選單資源,實現介面模式熱切換。

SDI 實作


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 實作 (關鍵差異)

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);
}

效果展示

MDI 正常模式

MDI 簡單模式

MDI 簡潔模式

注意事項

  • 各模式選單資源需預先在資源編輯器建立 (IDR_MENU_NORMAL 等)。
  • 工具列、狀態列可配合 `ShowControlBar` 顯示/隱藏。
  • MDI 子視窗最大化時選單合併行為已被禁用,若需保留需自行實作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved