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

C++Builder 系統選單擴展:新增選單項與事件響應

     編輯:VC 教學

目標:在視窗標題列系統選單(左上角圖示選單)新增自訂項目並響應點擊

核心 API

  • GetSystemMenu(hwnd, FALSE):取得系統選單控制代碼(FALSE 表示不重置)。
  • AppendMenu(hMenu, flags, id, text/bitmap):追加選單項。
    Flags:MF_STRING 文字、MF_SEPARATOR 分隔線、MF_BITMAP 位圖、MF_POPUP 子選單。
  • LoadBitmap(hInst, MAKEINTRESOURCE(resID)):載入位圖資源。

實現步驟

1. 定義命令 ID (Unit1.h 或專案共用頭檔)


#define IDM_HELP1     1001
#define IDM_HELP2     1002
#define IDM_REMOVE    1003
#define IDM_SEP1      1004
#define IDM_SEP2      1005

2. 表單 OnCreate 事件建立選單


void __fastcall TForm1::FormCreate(TObject* Sender) {
    HMENU hSysMenu = GetSystemMenu(Handle, FALSE);
    if (!hSysMenu) return;

    // 追加分隔線與文字項
    AppendMenu(hSysMenu, MF_SEPARATOR, IDM_SEP1, NULL);
    AppendMenu(hSysMenu, MF_STRING, IDM_HELP1, "說明(&H)");
    AppendMenu(hSysMenu, MF_SEPARATOR, IDM_SEP2, NULL);
    AppendMenu(hSysMenu, MF_STRING, IDM_REMOVE, "移除自訂項(&R)");

    // 追加位圖項(需專案資源包含 IDB_HELP 位圖)
    HBITMAP hBmp = LoadBitmap((HINSTANCE)HInstance, MAKEINTRESOURCE(IDB_HELP));
    if (hBmp)
        AppendMenu(hSysMenu, MF_BITMAP, IDM_HELP2, (LPCTSTR)hBmp);
}

3. 響應選單命令:覆寫 WndProc


void __fastcall TForm1::WndProc(TMessage& Message) {
    if (Message.Msg == WM_SYSCOMMAND) {
        switch (Message.WParam & 0xFFF0) {  // 系統命令低 4 位保留
            case IDM_HELP1:
                ShowMessage("這是自訂說明項目!");
                return;
            case IDM_HELP2:
                ShowMessage("位圖項目被點擊!");
                return;
            case IDM_REMOVE: {
                HMENU hSysMenu = GetSystemMenu(Handle, FALSE);
                DeleteMenu(hSysMenu, IDM_SEP1, MF_BYCOMMAND);
                DeleteMenu(hSysMenu, IDM_HELP1, MF_BYCOMMAND);
                DeleteMenu(hSysMenu, IDM_SEP2, MF_BYCOMMAND);
                DeleteMenu(hSysMenu, IDM_REMOVE, MF_BYCOMMAND);
                DeleteMenu(hSysMenu, IDM_HELP2, MF_BYCOMMAND);
                return;
            }
        }
    }
    TForm::WndProc(Message);  // 傳遞給基類處理標準系統命令
}

關鍵細節

  • ID 範圍:自訂命令 ID 建議使用 0x1000 以上避免與系統命令 (SC_CLOSE=0xF060 等) 衝突。
  • 位圖資源:使用 Tools → Image Editor 建立 .bmp 並加入專案資源 (Project → Resources)。
  • 移除選單項:DeleteMenu(hMenu, id, MF_BYCOMMAND) 依命令 ID 刪除;MF_BYPOSITION 依位置刪除。
  • 系統選單重置:GetSystemMenu(hwnd, TRUE) 會還原預設系統選單,移除所有自訂項。

現代替代:應用程式選單列 / Ribbon / 右鍵選單

系統選單空間有限、使用者發現性低、觸控不友好。現代 UI 設計建議:

  • 主要功能放在**選單列**或 **Ribbon**。
  • 次要/情境功能放在**右鍵情境選單** (PopupMenu)。
  • 系統選單僅保留「關於」「設定」「最小化到托盤」等極少項目。

總結

透過 GetSystemMenu + AppendMenu + WndProc 攔截 WM_SYSCOMMAND,即可在 C++Builder 中擴展系統選單。注意 ID 衝突、資源管理、清理邏輯。新專案優先考慮標準選單列與情境選單,系統選單作為輔助入口。

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