Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП 1,2.doc
Скачиваний:
11
Добавлен:
05.11.2018
Размер:
2.77 Mб
Скачать

Int MessageBox(hwnd hwnd, lpcstr lpText, lpcstr lpCaption, uint wMbType);

где hwnd – дескриптор родительского окна, lpText – выводящаяся на экран строка внутри окна сообщения, lpCaption – заголовок окна сообщения. Параметр wMBType является комбинацией значений, определяющих свойства окна сообщения, включающих типы кнопок и дополнительную иконку рядом с текстом сообщения. Возвращаемые значения зависят от реакции пользователя: если нажата кнопка OK, то возвращается значение IDOK, Abort – IDABORT, Retry – IDRETRY, Ignore – IDIGNORE, Cancel – IDCANCEL, No – IDNO, Yes – IDYES.

Ниже приведены значения, используемые для параметра wMBType:

Значение

Отображаются на экран

MB_ABORTRETRYIGNORE

кнопки Abort, Retry и Ignore

MB_ICONEXCLAMATION

иконка “восклицательный знак”

MB_ICONHAND

иконка “знак Стоп”

MB_ICONINFORMATION

иконка “информация”

MB_ICONQUESTION

иконка “вопросительный знак”

MB_ICONSTOP

иконка “знак Стоп”

MB_OK

кнопка Ok

MB_OKCANCEL

кнопки Ok и Cancel

MB_RETRYCANCEL

кнопки Retry и Cancel

MB_YESNO

кнопки Yes и No

MB_YESNOCANCEL

кнопки Yes, No и Cancel

Если в рассмотренной нами каркасной программе, в оконной функции добавить переменную

Int response;

а для обработки сообщения о нажатии правой кнопки добавить операторы

case WM_RBUTTONDOWN: //по нажатию правой кнопки мыши

response=MessageBox(hwnd, “Нажмите кнопку”, “Окно сообщения”, MB_YESNO);

switch(response) //посмотрим, какую кнопку нажал пользователь

{

case IDYES: //если YES

MessageBox(hwnd, “”, “Yes”, MB_OK); // скажем ему об этом

break;

case IDNO: //если NO

MessageBox(hwnd, “”, “No”, MB_OK); // скажем ему об этом

break;

} break;

то при нажатии правой кнопки мыши в окне появится окно сообщения с заголовком “Окно сообщения”, надписью “Нажмите кнопку” и двумя кнопками – “Yes” и “No”.

5.4. Меню в системе Windows

В системе Windows меню являются наиболее часто применяемыми элементами интерфейса. Включение меню в программу требует следующих шагов:

 определения формы меню в файле ресурсов;

 загрузки меню при создании главного окна;

 обработки событий меню.

Файл ресурсов. Ресурсы – это объекты, которые используются в программе, но не определяются в ней. Например, меню, иконки, диалоги, графические растровые изображения. Ресурсы определяются отдельно от текстов программы и связываются с приложением при сборке. Они содержатся в текстовом файле с расширением RC и обычно имеют имя nprog.rc, где nprog – имя программы. Файл ресурсов обычно компилируется в файл nprog.res с помощью компилятора rc.exe. (Компиляция происходит автоматически, вместе с компиляцией программы).

Меню создается в файле ресурсов с помощью определений, имеющих следующий формат:

MenuName MENU[параметры]

{

Элементы меню

}

Здесь MenuName – имя меню. Можно использовать следующие параметры:

DISCARDABLE - неиспользуемое меню может быть удалено из памяти;

FIXED - меню фиксировано в памяти;

LOADONCALL - меню загружается только перед непосредственным использованием;

MOVEABLE - меню может перемещаться;

PRELOAD - меню загружается в момент старта программы.

Обычно параметр не указывается, и используются значения параметров по умолчанию.

Имеется два типа элементов меню: MENUITEM и POPUP; MENUITEM определяет конечный элемент меню, а POPUP – элемент, который может содержать подменю. Они определяются в файле ресурсов с помощью операторов:

MENUITEM “Имя”, MenuID[, параметры]

POPUP “Имя”[, параметры]

Имя ставится в кавычках и является текстом соответствующей опции, как, например, File в текстовых редакторах. Для конечного элемента меню число MenuID – это идентификатор, по которому в оконной функции обрабатывается данный элемент меню.

Параметры могут задаваться по умолчанию, они имеют следующие значения:

CHECKED - рядом с меню отображается “птичка”; не применимо к элементам верхнего уровня;

GRAYED - элемент меню недоступен и отображается серым цветом;

HELP - связан с элементом “Помощь”, только для MENUITEM.

MENUBARBREAK - для горизонтальных меню верхнего уровня приводит к размещению элемента в новой строке, а для вертикальных – к размещению элемента в новой колонке (с разделением вертикальной линией);

MENUBREAK - то же самое, но без разделения вертикальной линией.

Пример. Рассмотрим следующий файл ресурсов:

MYMENU MENU

{

POPUP “&Раз”

{

MENUITEM “&Альфа”, 100

MENUITEM “&Бета”, 101

}

POPUP “&Два”

{

MENUITEM “&Гамма”, 102

POPUP “&Дельта”

{

MENUITEM “&Эпсилон”, 104

MENUITEM “&Зета”, 105

}

MENUITEM “&Эта”, 106

MENUITEM “&Тета”, 107

}

MENUITEM “&Помощь”, 108

}

Поскольку идентификаторы 100, 101, …, 108 будут использоваться в оконной функции, то целесообразно присвоить им символические имена в файле menu.h, с помощью директив

#define IDM_ALPHA 100

#define IDM_BETA 101

и в оконной функции обрабатывать опции меню по этим символическим именам. В этом случае в файле menu.h и в программе необходимо поставить директиву включения

#include “menu.h”

Обработка команд меню. Для загрузки меню полю класса окна lpszMenuName следует присвоить указатель на строку, содержащую имя меню из файла ресурсов. В нашем примере это имя равно MYMENU, значит, необходима операция:

wcl.lpszMenuName = “MYMENU”;

Выбор пользователем команд меню приводит к передаче сообщения WM_COMMAND. Если выбран элемент, определенный как MENUITEM, то его числовой идентификатор будет содержаться в LOWORD(wParam). Отсюда следует, что в нашем примере в оконной функции нужно добавить обработку сообщения WM_COMMAND. В случае вложенных меню используется вложенный оператор switch. Например:

switch(message)

{

case WM_COMMAND: //проанализируем выбор пользователя

switch(LOWORD(wParam))

{

case 100: MessageBox(hwnd, “Альфа”, “”, MB_OK);

break;

case 101: MessageBox(hwnd, “Бета”, “”, MB_OK);

break;

case 102: MessageBox(hwnd, “Гамма”, “”, MB_OK);

break;

case 104: MessageBox(hwnd, “Эпсилон”, “”, MB_OK);

break;

case 105: MessageBox(hwnd, “Зета”, “”, MB_OK);

break;

case 106: MessageBox(hwnd, “Эта”, “”, MB_OK);

break;

case 107: MessageBox(hwnd, “Тета”, “”, MB_OK);

break;

case 108:

MessageBox(hwnd,“Программа демонстрации меню”, “Помощь”, MB_OK);

break;

}

break; // конец обработки сообщения WM_COMMAND

}

Для компиляции и сборки программы, демонстрирующей меню, следует выполнить действия:

  • дополнить karkas.c оператором

wcl.lpszMenuName = “MYMENU”;

  • и обработкой опции WM_COMMAND оконной функцией, назвать программу nprog.c;

  • набрать текст файла ресурсов nprog.rc;

  • создать проект, выбрав опции компилятора

File  New  Project

  • и вывести для файла проекта имя nprog.ide, а затем удалить из списка участвующих в проекте файлов имя nprog.def (нажав правую кнопку мыши);

  • запустить компиляцию, сборку и выполнение с помощью комбинации клавиш [Ctrl]+F9.

Горячие клавиши. Это клавиатурные комбинации, нажатие которых приводит к выбору соответствующей команды меню. Эти клавиши называются также акселераторами. При помощи акселератора можно выбирать соответствующий элемент меню, не обращаясь к самому меню.

Для определения акселераторов составляется таблица и записывается в файл ресурсов. Таблица составляется следующим образом:

Имя_Таблицы ACCELERATORS

{

Клавиша1, MenuID1[, тип][, параметр]

Клавиша2, MenuID2[, тип][, параметр]

}

где Клавиша1, Клавиша2, … определяют клавиши или комбинации клавиш акселераторов, а значения MenuID – идентификаторы элементов меню. Аргумент типа указывает, является ли клавиша стандартной или виртуальной.

Виртуальная клавиша – это системно-независимый код, определенный для основного набора служебных клавиш. Виртуальные клавиши включают функциональные клавиши F1F12, стрелки и другие клавиши, не имеющие коды ASCII. Макроимена этих клавиш начинаются с букв VK, например VK_F1, и определены в файле windows.h.

Параметр может быть одним из макросов NOINVERT, ALT, SHIFT, CONTROL. Наличие NOINVERT означает, что соответствующий элемент меню при использовании акселератора не будет подсвечен, ALT указывает, что должна быть дополнительно нажата клавиша ALT, аналогичный смысл имеют параметры SHIFT и CONTROL.

Клавиши могут быть символами в кавычках либо кодом ASCII символа, либо виртуальными. В последнем случае тип - VIRTKEY.

Например,

“a”, 100; нажатие a;

“^A”, 100; нажатие Ctrl+A;

“a”, 100, ALT; нажатие Alt+A;

VK_F2, 100, SHIFT; нажатие Shift+F2.

Если добавить в проект предшествующего примера таблицу акселераторов, то файл nprog.rc будет выглядеть следующим образом:

#include <windows.h>

MYMENU MENU

{

POPUP “&Раз”

{

MENUITEM “&Альфа \tF2”, 100

MENUITEM “&Бета \tF3”, 101

}

POPUP “&Два”

{

MENUITEM “&Гамма \tShift+Г”, 102

POPUP “&Дельта”

{

MENUITEM “&Эпсилон \tCtrl+E”, 104

MENUITEM “&Зета \tCtrl+Z”, 105

}

MENUITEM “&Эта \tCtrl+F4”, 106

MENUITEM “&Тета \tF5”, 107

}

MENUITEM “&Помощь”, 108

}

MYMENU ACCELERATORS

{

VK_F2, 100, VIRTKEY

VK_F3, 101, VIRTKEY

“Г”, 102

“^E”, 104

“^Z”, 105

VK_F4, 106, VIRTKEY, CONTROL

VK_F5, 107, VIRTKEY

VK_F1, 108, VIRTKEY

}

В главной программе акселераторы могут быть загружены, например, с помощью объявления

HACCEL hAccel;

и вызова фунции

hAccel = LoadAccelerators(hThisInst, “MYMENU”);

а затем они должны обрабатываться с помощью фунции TranslateAccelerator() в цикле обработки сообщений, который с этой функцией будет выглядеть так:

while(GetMessage(&msg, NULL, 0, 0))

{

if(!TranslateAccelerator(hwnd, hAccel. &msg)

{

TranslateMessage(&msg);

DispatchMesage(&msg);

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]