Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)


 

 

 

 



Библиотека графики Turbo С. Основные компоненты графической модели



 

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

Использование библиотеки графики языке С намного со­кращает объем программирования для вывода основных гра­фических примитивов. Turbo С "маскирует" многие техниче­ские детали управления оборудованием, о которых пользова­тель должен быть осведомлен при работе с видеоадаптером через порты или BIOS. Платой за эти удобства является зна­чительное увеличение размера .ЕХЕ-файлов. Использование графической библиотеки Turbo С требует знакомства с мо­делью графической системы, применяемой Turbo С для пред­ставления графической системы компьютера. Можно сказать, что сложность овладения деталями аппаратных средств видеоадаптеров сравнима со сложностью освоения графической модели. Однако достоинство графической модели заключает­ся в ее относительной независимости от различных типов ви­деоадаптеров и открытости для дальнейших расширений. По­явление новых типов видеоадаптеров не потребует большой переработки программ, так как все новые особенности аппа­ратуры будут учитываться в средствах библиотеки Turbo С.

Весь код библиотеки графики Turbo С разбивается на две части: немобильную, которая зависит от типа видеоадаптера, и мобильную.

Немобильная часть представляет собой так называемый .BGI-драйвер (BGI - Borland Graphics Interface). Драйвер является обработчиком прерывания 10h, который должен дополнить сис­темный обработчик до того, как будут использоваться мобиль­ные функции. Перед завершением программы таблица век­торов прерывания восстанавливается.

Основные функции, выполняемые .BGI-драйвером, сводятся к установке и обновлению ряда внешних переменных, которые мо­гут изменяться как функциями системного обработчика прерыва­ния 10h (например, при переключении видеорежима, изменении регистров палитры и т.п.), так и мобильными функциями библио­теки графики. Turbo С включает целую коллекцию драйверов для каждого из типов адаптеров, хранимых обычно в отдельном подди­ректории. Система графики Turbo С является открытой для рас­ширений, так как позволяет использовать и собственные .BGI-драйверы. Сложность состоит в том, что фирма Borland International не раскрывает пока внутреннюю структуру драйвера.

Совокупность внешних переменных библиотеки графики и особенностей поведения мобильных функций образует мо­дель графики Turbo С. Подробно эти элементы модели рас­сматриваются в следующих параграфах.

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

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

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

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

Константа режима Характеристика режима Номер режима Тип адаптера и драйвер  
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  
                 

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

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

# include <graphics.h>

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

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

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

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

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

Табл. 2.2. Задание в Turbo C используемого .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 с аналоговым монитором

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

#include <graphics.h>

Void far closegraph(void)

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

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

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

Int main(void)

{

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

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

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

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

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

graph_error_code = graphresult( );

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

{

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

Return 255;

}

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

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

Closegraph();

}

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

#include <graphics.h>

void detectgraph (int *graphdriver, int *graphmode)

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

 

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

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

 



Просмотров 1587

Эта страница нарушает авторские права




allrefrs.su - 2025 год. Все права принадлежат их авторам!