Overview
In Win32 applications, menus are defined in a resource script (.rc) file using the MENU
and MENUITEM
statements. The resource compiler translates these definitions into binary menu resources that the system loads at runtime.
Why use menu resources?
- Separate UI definition from code, enabling localization.
- Allows the system to automatically handle accelerator keys.
- Facilitates dynamic loading and merging of menus.
Typical structure
// Sample.rc
MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "E&xit", IDM_EXIT
END
POPUP "&Help"
BEGIN
MENUITEM "&About", IDM_ABOUT
END
END
Menu Resource Syntax
The MENU
block consists of POPUP
and MENUITEM
entries. Each entry can include flags to control behavior.
Key symbols
&
– Marks the following character as the accelerator.CHECKED
– Displays a check mark.GRAYED
– Disables the item.SEPARATOR
– Inserts a horizontal line.
Example with flags
MENU
BEGIN
POPUP "&View"
BEGIN
MENUITEM "&Toolbar", IDM_VIEW_TOOLBAR, CHECKED
MENUITEM "Status &Bar", IDM_VIEW_STATUS, CHECKED
MENUITEM "-", 0, SEPARATOR
MENUITEM "Zoom &In", IDM_ZOOM_IN, GRAYED
MENUITEM "Zoom &Out", IDM_ZOOM_OUT
END
END
Loading Menus in Code
Typical usage in a Win32 application involves calling LoadMenu
or LoadMenuW
and attaching the menu to a window with SetMenu
.
#include <windows.h>
HMENU hMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDR_MAINMENU));
SetMenu(hWnd, hMenu);
// To handle a command:
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDM_ABOUT:
DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_ABOUT), hWnd, AboutDlgProc);
break;
}
break;