本系列旨在從零開始使用純 Win32 API 模仿 Windows 記事本,實現外觀與功能的高度一致。第一步構建完整的菜單系統。
創建 menu.rc 文件,定義所有菜單項的命令 ID 與層級結構。參照系統記事本,菜單包含「文件」「編輯」「格式」「查看」「幫助」五大類。
0x2000 起始0x41xx0x42xx0x43xx0x44xx0x45xx// menu.rc
#define IDM_MAIN 0x2000
#define IDM_NEW 0x4101
#define IDM_OPEN 0x4102
#define IDM_SAVE 0x4103
#define IDM_SAVEAS 0x4104
#define IDM_SETTING 0x4105
#define IDM_PRINT 0x4106
#define IDM_EXIT 0x4107
#define IDM_UNDO 0x4201
#define IDM_CUT 0x4202
#define IDM_COPY 0x4203
#define IDM_PASTE 0x4204
#define IDM_DELETE 0x4205
#define IDM_FIND 0x4206
#define IDM_FINDNEXT 0x4207
#define IDM_REPLACE 0x4208
#define IDM_GOTO 0x4209
#define IDM_SELECTALL 0x4210
#define IDM_DATETIME 0x4211
#define IDM_WORDWRAP 0x4301
#define IDM_FONT 0x4302
#define IDM_STATUS 0x4401
#define IDM_HELP 0x4501
#define IDM_ABOUT 0x4502
IDM_MAIN MENU DISCARDABLE
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "新建(&N)", IDM_NEW
MENUITEM "打開文件(&O)", IDM_OPEN
MENUITEM "保存(&S)", IDM_SAVE
MENUITEM "另存為(&A)", IDM_SAVEAS
MENUITEM SEPARATOR
MENUITEM "頁面設置(&U)", IDM_SETTING
MENUITEM "打印(&P)", IDM_PRINT
MENUITEM SEPARATOR
MENUITEM "退出(&E)", IDM_EXIT
END
POPUP "編輯(&E)"
BEGIN
MENUITEM "撤銷(&U)", IDM_UNDO, GRAYED
MENUITEM SEPARATOR
MENUITEM "剪切(&T)", IDM_CUT, GRAYED
MENUITEM "復制(&C)", IDM_COPY, GRAYED
MENUITEM "粘貼(&P)", IDM_PASTE
MENUITEM "刪除(&L)", IDM_DELETE, GRAYED
MENUITEM SEPARATOR
MENUITEM "查找(&F)", IDM_FIND, GRAYED
MENUITEM "查找下一個(&N)", IDM_FINDNEXT, GRAYED
MENUITEM "替換(&R)", IDM_REPLACE
MENUITEM "轉到(&G)", IDM_GOTO, GRAYED
MENUITEM SEPARATOR
MENUITEM "全選(&A)", IDM_SELECTALL
MENUITEM "時間日期(&D)", IDM_DATETIME
END
POPUP "格式(&O)"
BEGIN
MENUITEM "自動換行(&T)", IDM_WORDWRAP
MENUITEM "字體(&T)", IDM_FONT
END
POPUP "查看(&V)"
BEGIN
MENUITEM "狀態欄(&S)", IDM_STATUS, GRAYED
END
POPUP "幫助(&H)"
BEGIN
MENUITEM "查看幫助(&H)", IDM_HELP
MENUITEM SEPARATOR
MENUITEM "關於記事本(&A)", IDM_ABOUT
END
END
在 WinMain 的窗口創建階段,通過 LoadMenu 載入菜單資源並關聯到窗口類:
HWND hwnd = CreateWindow(
szAppName,
TEXT("無標題 - 記事本"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
LoadMenu(hInstance, MAKEINTRESOURCE(IDM_MAIN)), // 關鍵:傳入菜單句柄
hInstance,
NULL
);
MAKEINTRESOURCE(IDM_MAIN) 將整數 ID 轉換為資源字符串指針LoadMenu 返回菜單句柄 HMENU,作為 CreateWindow 的第 9 參數DISCARDABLE 標記允許系統在內存緊張時卸載菜單資源GRAYED 狀態表示菜單項初始禁用(如「撤銷」「剪切」需有編輯操作後啟用)菜單骨架已就緒,後續將實現:
EDIT 控件子類化)敬請期待《Win32 記事本開發實戰(二):編輯控件與文件 IO》