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); }