Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Включение меню в программу. Обработка команд






 

После создания меню его можно вставить в программу, задав его имя при определении класса окна. Для этого полю 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 показана работа этой программы:







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.