ЗНАЕТЕ ЛИ ВЫ?

Инициализация и закрытие системы графики



Прежде чем использовать функции графической библиотеки С++, необходимо инициализировать систему графики - загрузить соответствующий адаптеру или режиму .BGI-драйвер, установить в начальные значения внешние переменные и константы, выбрать шрифт и т.д.

Графические режимы, поддерживаемые библиотекой графики, задаются символическими константами, описанными в заголовочном файле <graphics.h> в перечислимом типе graphics_modes. Константы, определяющие видеорежим, приведены в табл. 3.1 вместе с информацией о выбираемом режиме и типе видеоадаптера, который может такой режим поддерживать.

 

 

Табл. 3.1. Видеорежимы в библиотеке графики

Константа режима Характеристика режима Номер режима Тип адаптера и драйвер
CGAC0 CGAC1 CGAC2 CGAC3 320x200, палитра 0 320x200, палитра 1 320x200, палитра 2 320x200, палитра 3 4,5 CGA, EGA, VGA, MCGA и др. в режи­ме эмуляции CGA. Используется CGA.BGI
CGAHI 640x200, 2 цвета
MCGAC0 MCGAC1 MCGAC2 MCGAC3 320x200, палитра 0 320x200, палитра 1 320x200, палитра 2 320x200, палитра 3 4,5 MCGA. Используется MCGA.BGI
MCGAMED 640x200, 2 цвета
MCGAHI 640x480, 2 цвета 11h
  EGALO 640x200, 16 цветов 0Eh EGA с памятью >128K байт, VGA при эмуляции EGA. Используется EGAVGA.BGI
EGAHI 640x350, 16 цветов 10h
EGA64LO 640x200, 16 цветов 0Eh EGA с памятью 64К байт, VGA при эмуляции EGA. Используется EGAVGA.BGI
EGA64HI 640x350, 4 цвета 10h
EGAMONOHI 640x350, 2 цвета 0Fh EGA, VGA при эму­ляции EGA Используется EGAVGA.BGI
HERCMONOHI 720x348. 7h    
АТТ400С0 АТТ400С1 АТТ400С2 АТТ400СЗ 320x200, палитра 0 320x200, палитра 1 320x200, палитра 2 320x200, палитра 3 4,5 AT&T. Используется ATT.BGI
VGALO 640x200, 16 цветов 0Eh VGA. Используется EGAVGA.BGI
VGAMED 640x350, 16 цветов 10h
VGAHI 640x480, 16 цветов 12h
PC3270HI 720x350, 1 с. ? IBM PC 3270. Используется PC3270.BGI
IBM8514LO 640x480, 256 цветов ? IBM 8514. Используется IBM8514.BGI
IBM8514HI 1024x768, 256 цветов ? IBM 8514. Используется IBM8514.BGI
             

 

Примечание. Символом “?” обозначены режимы, не вошедшие в табл. 2. 1 .

 

Инициализацию графической модели выполняет функция initgraph().

 

void far initgraph(int *graphdriver, int *graphmode, char * pathtodriver).

 

При вызове она инициализирует графическую систему, загружая .BGI-драйвер, определяемый указателем graphdriver, и устанавливая видеоадаптер в графический режим, задаваемый указателем graphmode. Аргумент pathtodriver указывает на ASCII-строку, хранящую спецификацию файла .BGI-драйвера. С++ поддерживает фиксированное число драйверов, каждый из которых, в свою очередь, поддерживает ряд режимов. Как тип драйвера, так и режим могут быть заданы числом или символической константой. Возможные значения для графических режимов даны в табл. 3.1. В табл. 3.2. приведены значения, определяющие графические драйверы при инициализации системы графики. Упомянутые в таблице символические константы определены в перечислимом типе graphics_drivers из заголовочного файла <graphics.h>.

Третий аргумент функции initgraph() задает маршрут поиска файла, со­держащего .BGI-драйвер. Если файл не найден в заданной директории, функция просматривает текущий директорий. Если pathtodriver = NULL, драйвер должен располагаться в текущей директории. В случае, когда при вызове initgraph() па­раметры видеосистемы неизвестны, значение для graphdriver следует задать рав­ным указателю на DETECT. Благодаря этому функция initgraph() вызывает другую библиотечную функцию – detectgraph() - для определения типа видеоадаптера, подходящего графического драйвера и графического режима максимального разрешения (максимального режима) для активного видеоадаптера системы. Значения для драйвера и максимального режима возвращаются в ячейках памяти, на которые указывают graphdriver и graphmode.

Табл. 3.2. Задание используемого .BGI-драйвера

Символическая константа из graphics_drivers Значение (в 10 c/с) Описание
DETECT Запрос автоматического определения типа драйвера
CGA Загрузка драйвера для CGA-адаптера или переключение старших адаптеров в режим эмуляции CGA и загрузка драйвера для CGA-адаптера
MCGA EGA 2 3 Загрузка драйвера для MCGA-адаптера Загрузка драйвера для EGA-адаптера с объемом видеопамяти 128К байт и более и ECD-монитором
EGA64 Загрузка драйвера для EGA-адаптера с объемом видеопамяти 64К байт и ECD-монитором
EGAMONO Загрузка драйвера для EGA-адаптера с объемом видеопамяти 64К байт и монохроматическим монитором
IBM8514 Загрузка драйвера для адаптера IBM 8514 с аналоговым монитором
HERCMONO Загрузка драйвера для адаптера HGC с монохроматическим монитором
ATT400 Загрузка драйвера для графического адаптера AT&T с разрешением 400 линий
VGA Загрузка драйвера для VGA-адаптера с аналоговым монитором
PC3270 Загрузка драйвера для графического адаптера IBM PC 3270 с аналоговым монитором

 

Помимо перевода видеоадаптера в заданный графический режим, функция initgraph() динамически распределяет оперативную память для загружаемого драйвера и хранения промежуточных результатов, возникающих при работе некоторых функций графики. После загрузки драйвера initgraph() устанавливает в значения по умолчанию ряд параметров графики: стиль линий, шабло­ны заполнения, регистры палитры. С этого момента прикладная программа может использовать любую функцию, прототип которой есть в заголовочном файле <graphics.h>.

Если при выполнении инициализации возникает противоречие между за­прашиваемым режимом и типом видеоадаптера, либо отсутствует достаточный объем свободной оперативной памяти и т.п., функция устанавливает код ошибки во внешней переменной, доступной после вызова функции graphresult(). Кроме того, код ошибки передается в точку вызова в ячейке памяти, на которую указывает graphdriver.

Если функции графической библиотеки больше не нужны при­кладной программе, следует вызвать функцию closegraph() "закрытия" графического режима и возвращения к текстовому режиму.

closegraph().

 

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

Приведем "скелет" программы, выполняющей все необходимые подготовительные действия для использования функ­ций библиотеки графики. Для определения типа видеоадаптера в ней используется функция initgraph() .

#include <graphics.h> /* все графические функции используют данный заголовочный файл */

int main(void)

{

int graph_driver; /* используемый драйвер */

int graph_mode; /* графический режим видеоадаптера */
int graph_error_code; /* внутренний код ошибки */

/* Определение типа видеоадаптера, загрузка подходящего .BGI-драйвера и установка максимального режима. Считается, что драйвер находится на диске d: в директории \bc\bgi. */ graph_driver = DETECT;

initgraph(&graph_driver, &graph_mode, "d:\\bc\\bgi” );

/* Определение кода ошибки при выполнении инициализации. */

graph_error_code = graphresult( );

if(graph_error_code != grOk) /* всегда следует проверять наличие ошибки ! */

{

/* Обработка ошибки . return 255; */

return 255;

}

 

/* Установка в случае необходимости режима, отличающегося от максимального; выбор палитры, цвета, стиля линий, маски заполнения и других параметров, отличающихся от значений по умолчанию. Вывод графических примитивов: прямых линий, окружностей, эллипсов, столбцовых диаграмм и т.п. */

/* 3акрытие графического режима */

closegraph();

}

Наиболее защищенный способ использования функции инициализации требует предварительного уточнения типа адаптера дисплея, активного в текущий момент времени. Для этого либо вызывается функция initgraph() со значением для graphdriver, равным указателю на DETECT, либо явно вызывается функция detectgraph(). Только после определения типа адаптера и его максимального режима выполняются установка нужного пользователю режима и загрузка .BGI-драйвера. Далее приводится описание функции detectgraph().

 

void detectgraph (int *graphdriver, int *graphmode).

 

Определяет тип активного видеоадаптера системы и тип подключенного мо­нитора в персональном компьютере. Затем устанавливает тип подходящего для комбинации адаптер/монитор .BGI-драйвера и режим, обеспечивающий макси­мальное разрешение (максимальный режим). Например, если активным является CGA-адаптер, С++ считает режим 640 х 200 максимальным. Информация о подходящем драйвере и максимальном режиме возвращается в точку вызова в двух переменных, на которые указывают graphdriver и graphmode соответственно.

 

Прикладная программа может интерпретировать тип драйвера и максимальный режим, сравнивая возвращаемые значения с символическими константами, приведенными в табл. 3.1. и 3.2. В случае, если адаптер не способен работать ни в одном из графических режимов, функция устанавливает внутреннюю переменную кода ошибки в значение, равное grNotDetected (-2). На это же значение будет указывать и graphdriver при завершении функции.

Как отмечалось ранее, функция detectgraph() вызывается автоматически из функции инициализации видеосистемы initgraph(), если последняя вызывается со значением для graphdriver, равным указателю на DETECT. В отличие от функции detectgraph() функция инициализации продолжает свою работу, загружает драй­вер и устанавливает максимальный режим, рекомендованный (возвращенный) функцией detectgraph(). Функция detectgraph(), вызванная явно, не производит загрузку драйвера или установку режима. Для этого прикладная программа выполняет обращение к функции инициализации. В случае, если для функции initgraph(), вызываемой после явного обращения к detectgraph(), передаются параметры, возвращенные detectgraph(), получается такой же результат, что и при обращении к initgraph() с параметром graphdriver, равным указателю на DETECT. В этой связи раздельное обращение к detectgraph() и initgraph() имеет смысл лишь в случае, когда предполагается установка режима адаптера, отличающегося от максимального, т.е. если неприемлемы автоматические выбор и установка режима адаптера.

 





Последнее изменение этой страницы: 2016-06-06; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.216.79.60 (0.006 с.)