После создания меню его можно вставить в программу, задав его имя при определении класса окна. Для этого полю lpszMenuName присваивается указатель на строку, содержащую имя меню. Например, для загрузки меню MYMENU используется следующая строка в определении класса окна:
wcl.lpszMenuName = "MYMENU"; // Главное меню
Обработка команд меню. Каждый раз, когда пользователь выбирает какую-либо команду меню, программе посылается сообщение WM_COMMAND. В этом сообщении LOWORD(wParam) содержит идентификатор выбранного элемента меню – значение, ассоциированное с этим элементом в RC-файле. Поскольку при выборе любого элемента меню программа получает сообщение WM_COMMAND, а значение, определяющее выбранный элемент, содержится в LOWORD(wParam), при обработке команд меню придется использовать вложенный оператор switch. Следующий фрагмент иллюстрирует обработку команд MYMENU:
switch(message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_ALPHA:
MessageBox(hwnd, "Альфа", "", MB_OK);
break;
case IDM_BETA:
MessageBox(hwnd, "Бета", "", MB_OK);
break;
case IDM_GAMMA:
MessageBox(hwnd, "Гамма", "", MB_OK);
break;
case IDM_EPSILON:
MessageBox(hwnd, "Эпсилон","", MB_OK);
break;
case IDM_ZETA:
MessageBox (hwnd, "Зета", "", MB_OK);
break;
case IDM_ETA:
MessageBox (hwnd, "Эта", "", MB_OK);
break;
case IDM_THETA:
MessageBox (hwnd, "Тэта", "", MB_OK);
break;
case IDM_HELP:
MessageBox (hwnd, "Помощи пока нет",
"Помощь",МВ_ОК);
break;
}
break;
В демонстрационных целях обработка команд меню в приведенном случае состоит лишь в подтверждении сделанного выбора в окне сообщения, появляющемся на экране. В реальных приложениях обработка команд меню, как правило, гораздо сложнее.
Пример 4-2. В следующей программе используется текст предыдущего примера, в который добавлена операция загрузки меню. Введите ее, назвав файл как Menu.cpp.
// Демонстрация меню
#include <Windows.h>
#include <String.h>
#include <Stdio.h>
#include "Menu.h"
LRESULT CALLBACK WindowFunc(HWND, UINT,
WPARAM, LPARAM);
char szWinName[]="МоеОкно"; // Имя класса окна
int WINAPI WinMain(HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASS wcl; // Определить класс окна
wcl.hInstance=hThisInst; // Дескриптор приложения
wcl.lpszClassName=szWinName; // Имя класса окна
wcl.lpfnWndProc=WindowFunc; // Функция окна
wcl.style=0; // Стиль по умолчанию
wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);// Иконка
wcl.hCursor=LoadCursor(NULL,IDC_ARROW); // Курсор
wcl.lpszMenuName="Mymenu"; // Главное меню
wcl.cbClsExtra=0; // Без дополнительной информации
wcl.cbWndExtra=0;
wcl.hbrBackground=
(HBRUSH)GetStockObject(WHITE_BRUSH); //Белый фон
if(!RegisterClass(&wcl)) // Регистрируем класс окна
return 0;
hwnd=CreateWindow(szWinName, // Создать окно
"Обработка команд меню",
WS_OVERLAPPEDWINDOW, // Стиль окна
CW_USEDEFAULT, // x-координата
CW_USEDEFAULT, // y-координата
CW_USEDEFAULT, // Ширина
CW_USEDEFAULT, // Высота
HWND_DESKTOP, // Нет родител. окна
NULL, // Нет меню
hThisInst,// Дескриптор приложения
NULL); // Нет дополнит. аргументов
ShowWindow (hwnd, nWinMode); // Показать окно
UpdateWindow (hwnd); // и перерисовать
while(GetMessage(&msg,NULL,0,0)) // Запустить цикл
{ // обработки сообщений
TranslateMessage(&msg); // Разреш. исп. клавиатуры
DispatchMessage (&msg); // Вернуть управл. Windows
}
return msg.wParam;
}
// Следующая функция вызывается операционной
// системой Windows и получает в качестве
// параметров сообщения из очереди сообщений
// данного приложения
LRESULT CALLBACK WindowFunc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int response;
switch(message)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_ALPHA:
MessageBox(hwnd, "Альфа", "", MB_OK);
break;
case IDM_BETA:
MessageBox(hwnd, "Бета", "", MB_OK);
break;
case IDM_GAMMA:
MessageBox(hwnd, "Гамма", "", MB_OK);
break;
case IDM_EPSILON:
MessageBox(hwnd, "Эпсилон","", MB_OK);
break;
case IDM_ZETA:
MessageBox (hwnd, "Зета", "", MB_OK);
break;
case IDM_ETA:
MessageBox (hwnd, "Эта", "", MB_OK);
break;
case IDM_THETA:
MessageBox (hwnd, "Тэта", "", MB_OK);
break;
case IDM_HELP:
MessageBox (hwnd, "Помощи пока нет",
"Помощь",МВ_ОК);
break;
}
break;
case WM_RBUTTONDOWN: // Нажата правая кнопка мыши
response = MessageBox(hwnd,
"Выберите действие",
"Правая кнопка",
МB_ABORTRETRYIGNORE);
switch(response)
{
case IDABORT:
MessageBox(hwnd, "", "Abort", MB_OK);
break;
case IDRETRY:
MessageBox(hwnd, "", "Retry", MB_OK);
break;
case IDIGNORE:
MessageBox(hwnd, "", "Ignore", MB_OK);
break;
}
break;
case WM_LBUTTONDOWN: // Нажата левая кнопка мыши
response = MessageBox(hwnd,
"Продолжить?",
"Левая кнопка",
MB_ICONHAND | MB_YESNO);
switch(response)
{
case IDYES:
MessageBox(hwnd, "Нажато", "Yes", MB_OK);
break;
case IDNO:
MessageBox(hwnd, "Нажато", "No", MB_OK);
break;
}
break;
case WM_DESTROY: // Завершение программы
PostQuitMessage(0);
break;
default:
// Все сообщения, не обрабатываемые в
// данной функции, направляются на обработку
// по умолчанию
return DefWindowProc(hwnd,message,
wParam,lParam);
}
return 0;
Рис. 4.2. Пример программы работы с меню
На рис. 4.2 показана работа этой программы: