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




 

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




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: