Кафедра: Автоматика и Информационные Технологии
ПРОГРАММИРОВАНИЕ В СИ РАБОТА В ГРАФИЧЕСКОМ РЕЖИМЕ
ОГЛАВЛЕНИЕ
1. ОБЗОР ГРАФИЧЕСКИХ ФУНКЦИЙ3
1.1. Общие сведения
1.2. Инициализация графического драйвера и режима
1.3. Работа с растром точек
1.4. Управление цветом
1.5. Базовые функции доступа к видеопамяти
1.6. Графические примитивы
1.7. Вывод графического текста
2. ПРИЕМЫ ПРОГРАММИРОВАНИЯ ГРАФИЧЕСКОГО РЕЖИМА
2.1. Подключение графической библиотеки
2.2. Инициализация графического режима
2.3. Включение драйвера и шрифтов в исполняемый файл
2.4. Рисование геометрических фигур
2.5. Выделение памяти под большие одномерные массивы
2.6. Вывод числовой информации
2.7. Задержка экрана
2.8. Реакция программы на нажатие конкретной клавиши
2.9. Организация ввода числовой информации
2.10.Проверка выхода аргумента функции из ОДЗ
2.11.Графическая и математическая системы координат
2.12.Использование двух видеостраниц
2.13.Рисование изображений в bmp-формате
2.14.Работа с мышью
3. ЗАДАНИЯ ДЛЯ ЛАБОРАТОРНОЙ РАБОТЫ
3.1. Звездное небо
3.2. Снегопад
3.3. Рисование графика функции
3.4. Вращение звезды
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
Графический режим персональных компьютеров является более привлекательным, чем текстовый режим. Серьезные программные приложения, написанные под DOS, как правило, имеют графическую оболочку.
В самых общих чертах работа с дисплеем ПК в графическом режиме может быть представлена следующим образом. Экран дисплейного монитора представляется как набор отдельных точек – пикселей (pixels, от английского picture elements), образующий прямоугольный растр. Число пикселей определяет разрешающую способность (разрешение) графической системы и обычно отражается парой чисел, первое из которых показывает количество пикселей в строке, а второе – число строк. Каждому пикселю экрана ставится в соответствие фиксированное количество битов (атрибут пикселя) в некоторой области адресного пространства центрального микропроцессора ПК. Эта область, называемая видеопамятью, как правило, является частью дисплейного адаптера (видеоадаптера) – специального устройства, управляющего работой монитора. Видеоадаптер, в частности, осуществляет циклическое воспроизведение содержимого видеопамяти на экране монитора. Причем изображение каждого пикселя определяется текущим значением его атрибута. Такой подход получил название битовой карты – bit-mapped graphics. Программе, выполняющейся на ПК в графическом режиме, доступны для чтения и записи все пиксели видеопамяти.
В ряде случаев возможно одновременное существование в видеопамяти двух или более областей одинаковой структуры, каждая из которых содержит атрибуты всех пикселей экрана. Такие области называются страницами. В определенный момент времени любая из страниц может отображаться видеоадаптером на дисплее, занимая при этом весь экран. Наличие страниц позволяет программе быстро менять изображение на экране, просто переключаясь с одной страницы на другую. В частности, это дает возможность проводить всю “черновую работу” по подготовке графического изображения на неотображаемой в настоящий момент времени странице, избегая появления на экране побочных графических эффектов.
Графическое отображение, возникающее на экране монитора, является результатом выполнения следующих действий:
· атрибуты пикселей изображения должны быть загружены в память. Обычно эту работу осуществляют специальные функции DOS или BIOS, однако возможна и прямая работа с видеопамятью;
· специальная схема видеоадаптера обеспечивает периодическое считывание видеопамяти и преобразование значений атрибутов пикселей в последовательность сигналов, управляющих монитором.
В персональных компьютерах используются различные типы дисплейных адаптеров (CGA, EGA, VGA и др.), большинство из которых может работать в различных режимах (текстовых и графических), называемых также видеорежимами (video modes). Графические режимы одного адаптера различаются разрешающей способностью, количеством цветов, количеством страниц видеопамяти и способом их адресации. Установкой графического режима управляет прерывание BIOS с номером 10h.
Поскольку объем страницы видеопамяти ограничен, то количество битов, приходящиеся на один пиксель, находится в обратной зависимости от общего количества пикселей на экране. Обычно атрибут пикселя состоит из 1, 2, 4 или 8 бит, в зависимости от графического режима. Все пиксели, имеющие одинаковое значение атрибута, отображаются на экране одинаковым образом.
Если атрибуту каждого пикселя в видеопамяти отводится только один бит, то графика будет двухцветной, например черно-белой (конкретные цвета зависят от типа монитора). Если каждый пиксель в графическом режиме представляется n битами, то в таком режиме имеется возможность одновременно представить на экране N_pallette=2n оттенков цвета (палитра режима). В некоторых графических системах принято в этом случае говорить о наличии n плоскостей цветов (color planes).
В дисплейных адаптерах с монохромным монитором значение атрибута управляет интенсивностью одного электронного луча, т. е. яркостью точки на экране, а с цветным монитором – интенсивностью трех лучей, составляющих цветовые компоненты изображения пикселя. Как правило, используется разделение цвета на RGB-компоненты – красную, зеленую и синюю. Если каждая компонента имеет N градаций, то общее число цветовых оттенков для такого адаптера составляет N_colors=N3, при этом в число цветовых оттенков включаются черный, белый и градации серого.
Цветной видеоадаптер имеет схему, которая осуществляет во время развертки кадра преобразование значения атрибута каждого пикселя в сигналы управления интенсивностью электронных лучей монитора, отвечающих за RGB-компоненты. Работу схемы можно представить таблицей, по каждому входу которой хранится описание цвета, используемого адаптером при выводе на экран всех пикселей, значения атрибутов которых равны номеру этого входа. Такая схема называется картой или таблицей цветов. Если максимальный размер пикселя в графических режимах, поддерживаемых данным адаптером, представляется m битами, то таблица цветов такого адаптера содержит N_table=2m строк (входов). Все три цветовые компоненты в карте цветов представлены, как правило, двоичными числами одинаковой разрядности. Способ кодирования цвета зависит от типа видеоадаптера.
Программное управление цветами пикселей на экране дисплея может осуществляться без изменений значений атрибутов пикселей в видеопамяти. Для этого нужно загрузить соответствующие значения RGB-компонент в таблицу цветов по входу с номером, равным значению нужного атрибута. Изменения карты цветов немедленно отображаются на экране изменением цвета пикселей.
Графическая система состоит из ядра и обширной библиотеки графических функций graphics.lib (ее нужно подключать при компоновке программного модуля). При создании программы, обращающейся к графическим функциям, в текст программы нужно включить файл, содержащий прототипы функций, константы, типы данных и различные перечислимые типы:
#include <graphics.h>Графический интерфейс фирмы Borland International (BGI – Borland Graphics Interface) состоит из двух компонент: постоянного ядра графической системы и набора графических драйверов. Ядро графической системы воспринимает все запросы прикладной программы на выполнение графических функций. Оно не зависит от типа подключенного дисплейного адаптера. Аппаратно-зависимой частью являются графические драйверы, осуществляющие интерфейс между ядром системы и конкретным дисплейным адаптером.
Графические драйверы содержатся в отдельных файлах с расширением .bgi. Каждый файл содержит бинарный образ (binary image) драйвера для одного или нескольких близких по типу адаптеров. Для использования в программе за каждым драйвером закреплен постоянный номер, которому соответствует макроподстановка, например, EGA или VGA.
Графические драйверы поддерживают многие (но не все) графические режимы дисплейных адаптеров, предусмотренные системой BIOS. Для указания в программах графических режимов, как и для драйверов, предусмотрены макроподстановки (EGALO,EGAHI, VGAHI и другие).
Прежде чем обращаться к графическим функциям, программа должна выбрать графический драйвер, соответствующий дисплейному адаптеру, и подключить его к ядру графической системы. Графическая библиотека содержит функцию detectgraph, предназначенную для тестирования аппаратуры и автоматического выбора подходящего драйвера и графического режима. Прототипэтойфункции –
void far detectgraph(int far *graph_driver,int far *graph_mode);Данная функция через свои аргументы возвращает номер графического драйвера и номер графического режима, обеспечивающего максимальное для адаптера разрешение. Возвращенные этой функцией значения в дальнейшем могут передаваться функции инициализации графической системы initgraph (но можно для инициализации выбрать и другой режим, поддерживаемый данным драйвером).
Если при тестировании аппаратуры дисплейного адаптера не обнаружено, то функция graphresult возвращает значение -2. Функция graphresult возвращает текущее значение внутренней переменной, содержащей код завершения работы графических функций. Ее прототип
int far graphresult(void);Отрицательное значение кода завершения, установленное какой-либо графической функцией, хранится во внутренней переменной вплоть до вызова функции graphresult, после чего оно обнуляется.
Имеется возможность получить строку, содержащую описание любого из допустимых кодов завершения графических функций. Для чего существует функция grapherrormsg. Прототип функции –
char far *grapherrormsg(int error_code);Если этой функции передать значение, возвращаемое функцией graphresult, то можно получить сообщение о коде завершения последней графической функции.