![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Включение меню в программу. Обработка команд
После создания меню его можно вставить в программу, задав его имя при определении класса окна. Для этого полю 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 показана работа этой программы:
|