
- •Введение
- •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
- •Варианты заданий
- •Пример выполнения задания
4. Графический интерфейс
В данной главе будут рассмотрены методы организации меню и окон в графическом режиме, а также принципы организации графического диалога. Будет изучена структура видеопамяти в графических режимах и способы обращения к видеоадаптеру через регистры графического контроллера. Затем будут рассмотрены форматы хранения графических файлов.
4.1. Организация меню в графическом режиме
Для вывода текста в графическом режиме используется подпрограмма (функция)
Void outtextxy ( int X, int y, char *s);
аргументами которой являются координаты левого верхнего угла области вывода строки S. Строка S должна заканчиваться нулем.
Для организации меню определяется массив фреймов и подпрограммы иерархического меню, аналогичного тому, как это делалось для текстового режима. Подпрограммы иерархического меню для работы в графическом режиме должны быть преобразованы следующим образом:
1) Подпрограммы сохранения и восстановления области вывода меню используют функции getimage() и putimage(). Указатель на область сохранения frame[i].p должен инициализироваться не при создании меню, а в тех случаях, когда i-е меню становится активным. Это экономит память.
2) Подпрограмма вывода курсора goto_xy() должна быть написана для графического режима. Она выводит прямоугольник с помощью функции putimage() в режиме XOR_PUT. При приеме символа с клавиатуры с помощью bioskey() нужно выводить курсор в позицию (getx(), gety()), или (8*getx(), 8*gety()).
3) Изменить подпрограммы вывода нижнего уровня write_char(), write_string().
4) Если для вывода рисунков используется одно графическое окно, то вместо установки указателя vid_mem на видеопамять, указатель устанавливается на свободную память размером 160*25 байт. После этого подпрограмма сохранения области вывода не требует изменения. Можно считать, что текстовый видеобуфер находится в памяти и имитирует обычную видеопамять, работающую в текстовом режиме. В подпрограмме сохранения restore_video() нужно добавить вывод символов на экран при записи в этот видеобуфер. Это приводит к дальнейшей экономии памяти, но применимо лишь для случая, когда имеется одно графическое окно. Текстовая информация на экране при таком подходе восстанавливается, графическая – нет.
Аналогичным образом организуются графические окна. Как и в текстовом режиме, для каждого окна определяется фрейм, и функции ввода-вывода в качестве аргумента получают номер окна. Перед выводом окна на экран, содержимое области вывода меню сохраняется, после окончания работы с окном – восстанавливается.
4.2. Организация графического диалога
Рассмотрим на примере системы Core основные элементы, на базе которых реализуется диалог, осуществляющий ввод и вывод графических данных.
Окна и отсечение. Вывод производится в окна. При программировании на языке С++ в системе MS DOS это можно осуществлять с помощью любых графических функций, предварительно вызвав функцию
setviewport (startx, starty, endx, endy, 1)
последний аргумент clipflag = 1. В противном случае при clipflag = 0, не производится отсечение справа и внизу.
Сегментация. Изображение в окне строится из частей, которые называются сегментами. Каждый сегмент имеет имя и состоит из набора вызовов подпрограмм построения графических примитивов. Под графическими примитивами понимаются точки, отрезки, дуги, многоугольники, текстовые строки и т.д. Сформированный сегмент нельзя вновь открывать и модифицировать. Его можно сделать видимым или невидимым с помощью функции set_visibility (имя_сегмента, v), где v = 0 делает его невидимым, а v = 1 – видимым. Таким образом, изображение состоит из сегментов, а сегменты – из примитивов и каждый сегмент создается один раз.
Логические интерактивные устройства. Для ввода информации при графическом диалоге применяются следующие устройства:
-
кнопка - устройство для задания выбора;
-
селектор - устройство для указания информации, выведенной на экран;
-
клавиатура - устройство для ввода цепочки литер;
-
валюатор - устройство для генерации величин с плавающей точкой;
-
локатор - устройство для задания экранных координат.
Обычно клавиатура и локатор (''мышь'') выполнены физически. Под кнопкой подразумевается прямоугольник, выведенный на экран, активация которого осуществляется нажатием клавиши <ENTER> или двойным щелчком левой кнопки мыши в области прямоугольника. Селектор моделируется с помощью набора кнопок, которые называются селекторными. Разрешается выбирать несколько кнопок. Селектор можно моделировать как символьную строку, указывающую, например, сегмент по его имени. Валюатор моделируется с помощью прямоугольника или сектора круга. Часть прямоугольника закрашивается при нажатии специальных клавиш. Введенное число определяется как отношение площади закрашенной части прямоугольника к площади всего прямоугольника и принимает значение от 0 до 1. Аналогично площадь сектора круга к площади всего круга определяет число, которое вводится с помощью валюатора.
Обработка сообщений. Каждое окно имеет подпрограмму, которая называется оконной функцией и обрабатывает сообщения, поступающие для данного окна. В системе Core оконная функция работает следующим образом:
while (1)
{
wait (сообщение)
switch (сообщение)
{
case (кнопка): button(имя_кнопки); break;
case (сегмент): segment(имя_сегмента); break;
case (клавиша): keyboard(имя_клавиши); break;
...
}
}
Здесь button(), segment(), keyboard() – подпрограммы обработки сообщений, полученных выбором кнопки, указания сегмента, нажатием клавиши.