Следующий пример показывает, как создать меню класса для прикладной программы, создать окно, которое использует меню класса и обрабатывать команды меню в оконной процедуре.
Ниже следует важная часть заголовочного файла прикладной программы:
// Идентификатор ресурса шаблона меню #define IDM_MYMENURESOURCE 3
Ниже следует важная часть самого приложения:
HINSTANCE hinst; int APIENTRY WinMain(hinstance, hPrevInstance, lpCmdLine, nCmdShow) HINSTANCE hinstance; HINSTANCE hPrevInstance; LPSTR lpCmdLine; int nCmdShow; { MSG msg; // сообщение WNDCLASS wc; // данные класса окна HWND hwnd; // дескриптор главного окна // Создадим класс окна для основного окна. // Определим идентификатор ресурса шаблона меню как // элемент lpszMenuName структуры WNDCLASS, чтобы // создать меню класса. wc.style = 0; wc.lpfnWndProc = (WNDPROC) MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hinstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = MAKEINTRESOURCE(IDM_MYMENURESOURCE); wc.lpszClassName = "MainWClass"; if (!RegisterClass(&wc)) return FALSE; hinst = hinstance; // Создадим основное окно. Установим параметр // hmenu в значение ПУСТО (NULL) так, чтобы Windows // использовал меню класса для окна. hwnd = CreateWindow("MainWClass", "Sample Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL); if (hwnd == NULL) return FALSE; // Сделаем окно видимым и передадим сообщение // WM_PAINT в оконную процедуру. ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // Запустим главный цикл сообщений. while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; UNREFERENCED_PARAMETER(hPrevInstance); } LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam) HWND hwnd; UINT uMsg; WPARAM wParam; LPARAM lParam; { switch (uMsg) { . . // Обработка других сообщений окна. . case WM_COMMAND: // Проверка идентификатора командного пункта меню. switch(LOWORD(wParam)) { case IDM_FI_OPEN: DoFileOpen(); // определяется программой break; case IDM_FI_CLOSE: DoFileClose(); // определяется программой break; . . // Обработка других команд меню. . default: break; } return 0; . . // Обработка других сообщений окна. . default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return NULL; }