多個選單項目中同一時間僅有一個被勾選,視覺上如單選鈕群組。

為了讓 CheckMenuRadioItem 能以 ID 範圍識別群組,三個選單項目 ID 必須連續(如 501、502、503)。



wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN); // 所有該類別視窗自動擁有此選單
HWND hm = CreateWindow(..., NULL, ...); // hMenu 參數給 NULL 也會有選單
// wc.lpszMenuName = NULL;
HWND hm = CreateWindow(..., LoadMenu(hInst, MAKEINTRESOURCE(IDR_MAIN)), ...);
第二種方式更有彈性,可依視窗決定是否載入選單。


需先取得彈出式選單控制代碼:
auto hmm = GetMenu(hwnd); // 取得選單列控制代碼
auto hfmn = GetSubMenu(hmm, 0); // 取得第一個彈出式選單 (水果)

case WM_COMMAND: {
switch (LOWORD(wParam)) {
case IDM_APPLE:
CheckMenuRadioItem(hfmn, IDM_APPLE, IDM_BANANA, IDM_APPLE, MF_BYCOMMAND);
MessageBox(hwnd, L"你選擇了蘋果。", L"提示", MB_OK); break;
case IDM_PEAR:
CheckMenuRadioItem(hfmn, IDM_APPLE, IDM_BANANA, IDM_PEAR, MF_BYCOMMAND);
MessageBox(hwnd, L"你選擇了梨子。", L"提示", MB_OK); break;
case IDM_BANANA:
CheckMenuRadioItem(hfmn, IDM_APPLE, IDM_BANANA, IDM_BANANA, MF_BYCOMMAND);
MessageBox(hwnd, L"你選擇了香蕉。", L"提示", MB_OK); break;
}
} return 0;
hMenu:彈出式選單控制代碼idFirst, idLast:群組 ID 範圍 (含首尾)idCheck:要勾選的項目 IDMF_BYCOMMAND:以命令 ID 方式指定 (而非索引)
#include <Windows.h>
#include "resource.h"
LRESULT CALLBACK WindowMainProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR cmdline, int nShow) {
WNDCLASS wc = { };
wc.lpszClassName = L"MainWd";
wc.hInstance = hThisInst;
wc.lpfnWndProc = WindowMainProc;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
HWND hm = CreateWindow(L"MainWd", L"我的應用程式", WS_OVERLAPPEDWINDOW,
25, 18, 380, 280, NULL,
LoadMenu(hThisInst, MAKEINTRESOURCE(IDR_MAIN)),
hThisInst, NULL);
if (hm == NULL) return 0;
ShowWindow(hm, SW_SHOW);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowMainProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
auto hmm = GetMenu(hwnd);
auto hfmn = GetSubMenu(hmm, 0); // [水果] 彈出式選單
switch (msg) {
case WM_COMMAND: {
switch (LOWORD(wParam)) {
case IDM_APPLE:
CheckMenuRadioItem(hfmn, IDM_APPLE, IDM_BANANA, IDM_APPLE, MF_BYCOMMAND);
MessageBox(hwnd, L"你選擇了蘋果。", L"提示", MB_OK); break;
case IDM_PEAR:
CheckMenuRadioItem(hfmn, IDM_APPLE, IDM_BANANA, IDM_PEAR, MF_BYCOMMAND);
MessageBox(hwnd, L"你選擇了梨子。", L"提示", MB_OK); break;
case IDM_BANANA:
CheckMenuRadioItem(hfmn, IDM_APPLE, IDM_BANANA, IDM_BANANA, MF_BYCOMMAND);
MessageBox(hwnd, L"你選擇了香蕉。", L"提示", MB_OK); break;
}
} return 0;
case WM_DESTROY:
PostQuitMessage(0); return 0;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
}
CheckMenuRadioItem 範圍判斷GetMenu → GetSubMenu(index)CheckMenuRadioItem(hMenu, idFirst, idLast, idCheck, MF_BYCOMMAND) 設定勾選狀態auto 關鍵字簡化控制代碼變數宣告