Страница 13 из 26 Создание меню класса Следующий пример показывает, как создать меню класса для прикладной программы, создать окно, которое использует меню класса и обрабатывать команды меню в оконной процедуре. Ниже следует важная часть заголовочного файла прикладной программы: // Идентификатор ресурса шаблона меню #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; } |