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