Следующий пример показывает, как создать меню класса для прикладной программы, создать окно, которое использует меню класса и как обрабатывать команды меню в оконной процедуре.
Ниже следует важная часть заголовочного файла прикладной программы:
// Идентификатор ресурса шаблона меню #define IDM_MYMENURESOURCE 3 |
Ниже следуют необходимые части самого приложения:
HINSTANCE hinst; int APIENTRY WinMain(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) // для того, чтобы система использовала меню класса для окна. 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) != 0 && GetMessage(&msg, (HWND) NULL, 0, 0) != -1) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; UNREFERENCED_PARAMETER(hPrevInstance); } LRESULT APIENTRY MainWndProc(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; }
|