首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

MFC 單一文件介面 (SDI) 移除預設選單列的兩種方法

     編輯:ASP.NET 基礎

情境說明

MFC SDI 專案預設會依據資源 ID 建立選單列。若需完全移除選單列(如全螢幕模式、自訂工具列介面),可採用以下兩種方式。

方法一:覆寫 CFrameWnd::CreateEx 傳入 NULL 選單控制代碼

在主框架類別 CMainFrame 覆寫 Create,改呼叫 CreateEx 並將選單參數設為 NULL:

BOOL CMainFrame::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, 
                        DWORD dwStyle, const RECT& rect, 
                        CWnd* pParentWnd, LPCTSTR lpszMenuName, 
                        DWORD dwExStyle, CCreateContext* pContext)
{
    // 不呼叫基類 Create,改用 CreateEx 並傳入 NULL 選單
    HMENU hMenu = NULL;
    return CFrameWnd::CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,
                               rect.left, rect.top, 
                               rect.right - rect.left, rect.bottom - rect.top,
                               pParentWnd->GetSafeHwnd(),
                               hMenu,        // 關鍵:傳入 NULL 移除選單列
                               (LPVOID)pContext);
}

優點:從視窗建立階段就不載入選單資源,最乾淨。
缺點:若專案後續需動態加入選單,需自行管理 HMENU。

方法二:在 OnCreate 中列舉並刪除所有選單項目

保留視窗建立流程,於 OnCreate 取得選單控制代碼後逐項刪除:

// 輔助函數:遞迴刪除所有選單項目
static void DeleteAllMenuItems(HMENU hMenu)
{
    int count = GetMenuItemCount(hMenu);
    for (int i = count - 1; i >= 0; --i)
    {
        DeleteMenu(hMenu, i, MF_BYPOSITION);
    }
}

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

    // 建立工具列、狀態列等既有程式碼...
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("工具列建立失敗\n");
        return -1;
    }
    // ... 狀態列建立碼略 ...

    // 關鍵:取得選單控制代碼並清空
    CMenu* pMenu = GetMenu();
    if (pMenu != NULL)
    {
        DeleteAllMenuItems(pMenu->GetSafeHmenu());
    }

    return 0;
}

優點:保留原始視窗建立流程,若未來需動態重建選單較靈活。
缺點:選單資源仍會載入再刪除,稍微浪費資源。

比較與建議

比較項目方法一 (CreateEx + NULL)方法二 (OnCreate + 刪除)
實作複雜度低中
資源載入時機完全不載入載入後刪除
動態恢復選單需自行建立 HMENU可重新 LoadMenu
適用情境永久無選單介面條件式隱藏/顯示選單

常見問題排除

  • 工具列未顯示:確認 EnableDocking、DockControlBar 呼叫順序正確。
  • 快速鍵失效:移除選單後,對應的快速鍵(Accelerator)也會失效,需另行處理。
  • 系統選單 (SysMenu) 殘留:標題列右鍵仍會出現系統選單(還原/移動/關閉),屬視窗樣式 WS_SYSMENU 控制,非 MFC 選單資源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved