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

在 MFC 中動態修改選單:完整實作教學

     編輯:VC 教學

前言

Windows 應用程式普遍使用下拉式選單提供功能入口。靜態選單在編譯後固定不變,但實際開發中常需依使用者權限、設定或情境動態調整選單項目。本文以 MFC SDI 專案為例,詳細說明如何在執行期建立、切換、新增、插入與修改選單項目。

步驟 1:建立基礎 SDI 專案

  1. 啟動 AppWizard,專案名稱設為 mymenu。
  2. 步驟 1 選擇 Single Document,其餘採預設值完成建立。
  3. 編譯執行,觀察預設選單結構。

步驟 2:新增選單資源

  1. 選單列 Insert → Resource → Menu → New,建立新選單資源,資源 ID 為 IDR_MENU1。
  2. 編輯選單,加入數個主選單項目與子選單,供後續程式碼操作。

步驟 3:建立設定對話框

  1. Insert → Resource → Dialog → New,建立對話框資源 IDD_DIALOG1。
  2. 放置六個按鈕,ID 分別為:ID_CLEAR、ID_GOONE、ID_GOTWO、ID_ADD、ID_ADDITEM、ID_EDIT。
  3. 使用 ClassWizard 為對話框建立類別 CChangeMenu,並為六個按鈕加入預設處理函式。

步驟 4:主視窗選單加入「彈出設定對話框」項目

  1. 在 IDR_MAINFRAME 選單加入新項目,ID 為 ID_SET,標題「彈出設定對話框」。
  2. 為其加入命令處理函式 OnSet():
void CMainFrame::OnSet()
{
    CChangeMenu dlg;
    dlg.DoModal();
}

記得在 MainFrm.cpp 頂端加入 #include "ChangeMenu.h"。

步驟 5:實作動態選單操作函式

在 CChangeMenu 中實作六個按鈕的處理邏輯:

清除選單

void CChangeMenu::OnClear()
{
    AfxGetMainWnd()->SetMenu(NULL);
    AfxGetMainWnd()->DrawMenuBar();
}

載入 IDR_MENU1 選單

void CChangeMenu::OnGoone()
{
    if (!menu1) // menu1 為 CMenu 成員變數
    {
        menu1.LoadMenu(IDR_MENU1);
        AfxGetMainWnd()->SetMenu(&menu1);
        AfxGetMainWnd()->DrawMenuBar();
        menu1.Detach(); // 避免析構時銷毀 HMENU
    }
}

切回原始主選單 (IDR_MAINFRAME)

void CChangeMenu::OnGotwo()
{
    if (!menu2) // menu2 為 CMenu 成員變數
    {
        menu2.LoadMenu(IDR_MAINFRAME);
        AfxGetMainWnd()->SetMenu(&menu2);
        AfxGetMainWnd()->DrawMenuBar();
        menu2.Detach();
    }
}

在主選單末尾追加項目

void CChangeMenu::OnAdd()
{
    static int x = 400; // 命令 ID 從 400 起始遞增
    AfxGetMainWnd()->GetMenu()->AppendMenu(MF_STRING, x, "mynew");
    AfxGetMainWnd()->DrawMenuBar();
    x++;
}

在第一個下拉選單插入項目

void CChangeMenu::OnAdditem()
{
    static int y = 500;
    AfxGetMainWnd()->GetMenu()->GetSubMenu(0)->InsertMenu(1, MF_BYPOSITION, y, "mynewitem");
    AfxGetMainWnd()->DrawMenuBar();
    y++;
}

修改第一個主選單項目文字

void CChangeMenu::OnEdit()
{
    AfxGetMainWnd()->GetMenu()->ModifyMenu(0, MF_BYPOSITION, 402, "dfd");
    AfxGetMainWnd()->DrawMenuBar();
}

關鍵點總結

  • SetMenu + DrawMenuBar:變更選單後必須呼叫 DrawMenuBar() 重繪。
  • CMenu::Detach():將 HMENU 從 CMenu 物件分離,防止物件銷毀時連帶銷毀系統選單控制代碼。
  • 命令 ID 範圍:動態加入的項目 ID 應避開系統保留範圍,建議使用 0x8000 以上或自訂範圍。
  • 子選單索引:GetSubMenu(0) 取得第一個下拉選單,索引從 0 開始。

執行結果

編譯執行後,點選主選單「彈出設定對話框」,在對話框中點擊各按鈕即可觀察主視窗選單動態變化:清空、切換不同選單資源、追加項目、插入子項目、修改文字等效果。

結語

掌握 MFC 動態選單技術,能讓應用程式根據使用者角色、授權或偏好即時調整介面,提升使用體驗。本文範例涵蓋最常見的操作情境,開發者可據此擴充更複雜的選單管理邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved