Мегаобучалка Главная | О нас | Обратная связь


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



2018-06-29 572 Обсуждений (0)
Инициализация и закрытие системы графики 0.00 из 5.00 0 оценок




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

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

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

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

Таблица 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 .

Возможные значения для графических режимов даны в табл. 3.1. В табл. 3.2. приведены значения, определяющие графические драйверы при инициализации системы графики. Упомянутые в таблице символические константы определены в перечислимом типе graphics_drivers из заголовочного файла <graphics.h>.

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

 



2018-06-29 572 Обсуждений (0)
Инициализация и закрытие системы графики 0.00 из 5.00 0 оценок









Обсуждение в статье: Инициализация и закрытие системы графики

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (572)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)