Creating Menus Example
#include <windows.h>
#define IDM_MENUITEM1 1
#define IDM_MENUITEM2 2
#define IDM_FILE_QUIT 3
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
const wchar_t CLASS_NAME[] = L"MyWindowClass";
WNDCLASSEXW wc = {0};
MSG msg;
// Register the window class
wc.cbSize = sizeof(WNDCLASSEXW);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
wc.lpszClassName = CLASS_NAME;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassExW(&wc))
return 0;
HWND hwnd = CreateWindowExW(
WS_EX_CLIENTEDGE,
CLASS_NAME,
L"Creating Menus",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
700,
200,
NULL,
NULL,
hInstance,
NULL);
if (!hwnd)
return 0;
// Message loop
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return static_cast<int>(msg.wParam);
}
LRESULT CALLBACK WndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
POINT point;
HMENU hContextMenu;
switch (msg)
{
case WM_CREATE:
{
// Create the menu bar and File menu
HMENU hMenubar = CreateMenu();
HMENU hMenu = CreateMenu();
// Add File menu to menu bar
AppendMenuW(hMenubar,
MF_POPUP,
(UINT_PTR)hMenu,
L"&File");
// Add menu items
AppendMenuW(hMenu,
MF_STRING,
IDM_MENUITEM1,
L"Item 1");
AppendMenuW(hMenu,
MF_STRING,
IDM_MENUITEM2,
L"Item 2");
AppendMenuW(hMenu,
MF_SEPARATOR,
0,
NULL);
AppendMenuW(hMenu,
MF_STRING,
IDM_FILE_QUIT,
L"Quit");
SetMenu(hwnd, hMenubar);
return 0;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDM_MENUITEM1:
MessageBeep(MB_ICONINFORMATION);
return 0;
case IDM_MENUITEM2:
MessageBeep(MB_ICONWARNING);
return 0;
case IDM_FILE_QUIT:
DestroyWindow(hwnd);
return 0;
}
break;
// Sent immediately before a menu is displayed.
case WM_INITMENU:
{
HMENU hMenu = (HMENU)wParam;
UNREFERENCED_PARAMETER(hMenu);
return 0;
}
// Sent whenever a menu item is selected or highlighted.
case WM_MENUSELECT:
{
UINT uItem = LOWORD(wParam);
UINT uFlags = HIWORD(wParam);
HMENU hMenu = (HMENU)lParam;
UNREFERENCED_PARAMETER(uItem);
UNREFERENCED_PARAMETER(uFlags);
UNREFERENCED_PARAMETER(hMenu);
return 0;
}
// Sent immediately before a submenu is displayed.
case WM_INITMENUPOPUP:
{
HMENU hPopup = (HMENU)wParam;
UINT uPos = LOWORD(lParam);
BOOL bSystemMenu = HIWORD(lParam);
UNREFERENCED_PARAMETER(hPopup);
UNREFERENCED_PARAMETER(uPos);
UNREFERENCED_PARAMETER(bSystemMenu);
return 0;
}
// Display a context menu
case WM_RBUTTONUP:
point.x = LOWORD(lParam);
point.y = HIWORD(lParam);
ClientToScreen(hwnd, &point);
hContextMenu = CreatePopupMenu();
AppendMenuW(hContextMenu,
MF_STRING,
IDM_MENUITEM1,
L"Option 1");
AppendMenuW(hContextMenu,
MF_STRING,
IDM_MENUITEM2,
L"Option 2");
AppendMenuW(hContextMenu,
MF_SEPARATOR,
0,
NULL);
AppendMenuW(hContextMenu,
MF_STRING,
IDM_FILE_QUIT,
L"Quit");
TrackPopupMenu(
hContextMenu,
TPM_RIGHTBUTTON,
point.x,
point.y,
0,
hwnd,
NULL);
DestroyMenu(hContextMenu);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProcW(hwnd,
msg,
wParam,
lParam);
}