- •Введение
- •1. Общие принципы создания интерфейса
- •1.1. Эргономические характеристики интерфейса
- •1.2. Составные части интерфейса
- •1.3. Виды диалога
- •1.4. Процессы ввода – вывода
- •1.5. Методы разработки подпрограмм нижнего уровня
- •Int int86(int num, union regs *inregs, union regs *outregs);
- •Void pokeb(unsigned seg, unsigned off, char value);
- •Int getch();
- •2. Исчезающее меню
- •2.1. Алгоритм создания исчезающего меню
- •2.2. Сохранение и восстановление экрана
- •2.3. Вывод меню и рамки
- •2.4. Определение выбора пользователя
- •2.5. Подпрограмма исчезающего меню
- •3. Иерархическое меню
- •3.1. Фреймы меню
- •3.2. Подпрограмма активизации меню
- •3.3. Организация иерархического меню
- •3.4. Всплывающие окна
- •Void window(int num);
- •Void deactivate(int num);
- •4. Графический интерфейс
- •4.1. Организация меню в графическом режиме
- •Void outtextxy ( int X, int y, char *s);
- •4.2. Организация графического диалога
- •4.3. Особенности графического режима
- •Void putpixel (int color, int X, int y)
- •4.4. Форматы хранения графических файлов
- •5. Прикладной интерфейс для windows
- •5.1. Приложения Windows
- •5.2. Каркас приложения
- •5.3. Обработка сообщений в системе Windows
- •Int ReleaseDc(hwnd hwnd, hdc hdc);
- •Int MessageBox(hwnd hwnd, lpcstr lpText, lpcstr lpCaption, uint wMbType);
- •Int response;
- •5.4. Меню в системе Windows
- •5.5. Диалоги в системе Windows
- •Int DialogBox(hinstance hThisInst,
- •5.6. Пример программы, использующей список и окно ввода
- •6. Лабораторная 1
- •Варианты заданий
- •Пример выполнения задания
- •7 Лабораторная 2
- •Варианты заданий
- •Пример выполнения задания
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 – идентификаторы элементов меню. Аргумент типа указывает, является ли клавиша стандартной или виртуальной.
Виртуальная клавиша – это системно-независимый код, определенный для основного набора служебных клавиш. Виртуальные клавиши включают функциональные клавиши F1 – F12, стрелки и другие клавиши, не имеющие коды 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);
}
}