GetSystemMenu(hwnd, FALSE):取得系統選單控制代碼(FALSE 表示不重置)。AppendMenu(hMenu, flags, id, text/bitmap):追加選單項。MF_STRING 文字、MF_SEPARATOR 分隔線、MF_BITMAP 位圖、MF_POPUP 子選單。LoadBitmap(hInst, MAKEINTRESOURCE(resID)):載入位圖資源。
#define IDM_HELP1 1001
#define IDM_HELP2 1002
#define IDM_REMOVE 1003
#define IDM_SEP1 1004
#define IDM_SEP2 1005
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);
}
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); // 傳遞給基類處理標準系統命令
}
0x1000 以上避免與系統命令 (SC_CLOSE=0xF060 等) 衝突。.bmp 並加入專案資源 (Project → Resources)。DeleteMenu(hMenu, id, MF_BYCOMMAND) 依命令 ID 刪除;MF_BYPOSITION 依位置刪除。GetSystemMenu(hwnd, TRUE) 會還原預設系統選單,移除所有自訂項。系統選單空間有限、使用者發現性低、觸控不友好。現代 UI 設計建議:
透過 GetSystemMenu + AppendMenu + WndProc 攔截 WM_SYSCOMMAND,即可在 C++Builder 中擴展系統選單。注意 ID 衝突、資源管理、清理邏輯。新專案優先考慮標準選單列與情境選單,系統選單作為輔助入口。