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

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() – подпрограммы обработки сообщений, полученных выбором кнопки, указания сегмента, нажатием клавиши.

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