使用 CreateMenu、CreatePopupMenu、AppendMenu、InsertMenuItem 建立:
HMENU hRoot;
void CreateMyMenu() {
hRoot = CreateMenu();
HMENU pop1 = CreatePopupMenu();
AppendMenu(hRoot, MF_POPUP, (UINT_PTR)pop1, L"操作");
AppendMenu(pop1, MF_STRING, IDM_OPT1, L"飛機");
MENUITEMINFO mif = { sizeof(MENUITEMINFO) };
mif.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
mif.fType = MFT_STRING;
mif.dwTypeData = L"機關槍";
mif.wID = IDM_OPT2;
mif.fState = MFS_ENABLED;
InsertMenuItem(pop1, IDM_OPT2, FALSE, &mif);
}
缺點:程式碼冗長、維護困難、無視覺化編輯。

IDR_MAIN)resource.h 自動產生 ID 宏定義





resource.h 亦可使用者點選選單項目產生 WM_COMMAND,LOWORD(wParam) 為選單項目 ID:
case WM_COMMAND: {
switch (LOWORD(wParam)) {
case IDM_PLANE: MessageBox(hwnd, L"灰機來了。", L"提示", MB_OK); break;
case IDM_GUN: MessageBox(hwnd, L"讓炮彈飛。", L"提示", MB_OK); break;
case IDM_MT_GUN:MessageBox(hwnd, L"山炮欲來風滿樓。", L"提示", MB_OK); break;
}
} return 0;
HWND hm = CreateWindow(..., LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MAIN)), ...);
LoadMenu 參數:實例控制代碼、資源 ID (需 MAKEINTRESOURCE 轉換)wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN) 為類別層級選單
#include <Windows.h>
#include "resource.h"
LRESULT CALLBACK MyWinProce(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nShow) {
WCHAR* cn = L"Myapp";
WNDCLASS wc = { };
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = cn;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.hInstance = hInstance;
wc.lpfnWndProc = (WNDPROC)MyWinProce;
RegisterClass(&wc);
HWND hm = CreateWindow(cn, L"我的應用程式", WS_OVERLAPPEDWINDOW,
20, 15, 420, 360, NULL,
LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MAIN)),
hInstance, NULL);
if (hm == NULL) return 0;
ShowWindow(hm, nShow);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK MyWinProce(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_COMMAND: {
switch (LOWORD(wParam)) {
case IDM_PLANE: MessageBox(hwnd, L"灰機來了。", L"提示", MB_OK); break;
case IDM_GUN: MessageBox(hwnd, L"讓炮彈飛。", L"提示", MB_OK); break;
case IDM_MT_GUN:MessageBox(hwnd, L"山炮欲來風滿樓。", L"提示", MB_OK); break;
}
} return 0;
case WM_DESTROY:
PostQuitMessage(0); return 0;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
}
resource.hCreateMenu/AppendMenu/InsertMenuItem,適合動態需求WM_COMMAND + LOWORD(wParam) 判斷使用者選擇的選單項目LoadMenu 載入資源選單,搭配 MAKEINTRESOURCEresource.h