Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Инициализация и деинициализация графического режима

 

Графическая библиотека инициализируется с помощью функции initgraph(). Ee прототип:

 

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

 

Данная функция инициализирует графическую систему, загружая с диска графический драйвер и переводя систему в графический режим. Первый параметр задает тип адаптера. Это целое, значение которого соответствует определенному типу адаптера. В заголовочном файле <graphics.h> числам с помощью директивы #define сопоставлены текстовые константы. Их значения: DETECT – 0, CGA – 1, MCGA – 2, EGA – 3,…, VGA – 9.

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

Обычно вызов detectgraph() необходим для изменения режима, который эта функция рекомендует для initgraph() по умолчанию. В случае ошибки (не подключена графическая библиотека, не идентифицирован тип адаптера и т.п.), функция initgraph() возвращает значение 2 или 3 или 4 или 5 в зависимости от типа ошибки. Ситуации, вызывающие ошибки, описаны в тексте помощи (Help) в оболочке TurboC (C++). В программе получить код ошибки можно с помощью функции graphresult(). Эта функция возвращает код завершения предыдущей графической операции. Успешному завершению соответствует константа grOk или 0.

Наиболее часто изменяют второй параметр функции initgraph()graphmode. Он определяет режим работы видеоадаптера. Если первый параметр определен как DETECT, draphmode не используется (не определяется программистом), т.к. по умолчанию выполняется настройка на максимальную разрешающую способность. Для каждого типа видеоадаптера имеется своя начинающаяся с 0 последовательность целых чисел, определяющая разрешение как количество точек и цветность. Для ранних типов адаптеров (например, CGA) это позволяло увеличить число точек ценой уменьшения количества цветов с 4 до 2. Для EGA и VGA остается 16 цветов, но уменьшается количество доступных страниц видеопамяти (см. далее). Более подробно о количественных данных можно узнать из Help. оболочки языка С (С++).

Третий параметр функции initgraph() задает путь к каталогу, где initgraph() ищет графический драйвер и файлы со шрифтами. Если путь не задан (указана пустая строка '' ''), каталог считается текущим. При задании пути часто делают типичную ошибку:

…,"c:\tcpp\bgi"… - НЕВЕРНО …,"c:\\tcpp\\bgi"... - ВЕРНО

Функция initgraph() при успешном завершении сбрасывает все графические параметры в значения по умолчанию (текущая позиция, палитра, цвет, графическое окно и т.д.) и устанавливает graphresult() в 0.

Для установки графического драйвера initgraph() выделяет требуемый объем памяти. Это производится при обращении к функции _graphgetmem(). Кроме драйверов в выделенной таким образом памяти размещаются внутренние буфера и наборы символов. По умолчанию функция _graphgetmem() распределяет память путем вызова malloc() с соответствующими параметрами. Таким образом осуществляется динамическая загрузка графического драйвера и всего другого, необходимого для графического режима. Достоинство - экономия памяти, недостаток - более длительное время за счет более частого обращения к диску при интенсивных переходах от текстового режима к графическому и наоборот.

Альтернативное решение - скомпоновать один или несколько графических драйверов вместе с исполняемым файлом. Для этого служит утилита BGIOBJ. Она преобразует файлы графических драйверов и шрифтов в объектные файлы. Затем эти файлы с помощью компоновщика включаются в объектный код. Достоинство - уменьшение обращений к диску ("я все свое ношу с собой"). Недостаток - увеличение размера загрузочного модуля. Вызов:

 

BGIOBJ <исходный файл (драйвер или файл шрифта)>

 

Объектный файл создается с именем исходного и расширением.obj (например, EGAVGA.BGI преобразуется в EGAVGA.OBJ).

Можно объявить свою функцию с именем _graphgetmem() и изменить управление распределением памяти.

Чтобы освободить ресурсы, занятые графическим режимом, используют функцию closegraph(). Эта функция не имеет параметров. Освобождение ресурсов памяти осуществляется через вызовы функции _graphfreemem с указанием соответствующего адреса и размера. По умолчанию освобождение выполняется через вызовы функции free(). Аналогично _graphgetmem() можно запрограммировать свою стратегию освобождения. После отключения графического режима выполняется очистка экрана.

Пример BGI\ex1.c показывает, что установлен текстовый режим (выдается значение 1, которое в файле graphics.h определено как соответствующее текстовому режиму).

 

#include <stdio.h>

#include <graphics.h>

main()

{

int cmode;

cmode=getgraphmode();

printf("\n%d\n",cmode);

}

 

Пример BGI\ex2.c показывает перевод в графический режим и параметры этого режима.

 

include <stdio.h>

#include <graphics.h>

main()

{

int grdriver=DETECT,grmode,grerror,cmode;

initgraph(&grdriver,&grmode,"c:\\tcpp\\bgi");

if ((grerror=graphresult()) < 0)

/* другой вариант - if (...)!= grOk */

{

printf("ОШИБКА initgraph: %s\n",grapherrormsg(grerror));

exit(1);

}

cmode=getgraphmode();

printf("\n%d% d% d\n",cmode,grdriver,grmode);

printf("\nx=%d y=%d xmax=%d, ymax=%d\n",getx(),gety(),getmaxx(),getmaxy());

getch(); /* ожидание нажатия клавиши, чтобы успели все рассмотреть */

closegraph()

}

 

<== предыдущая лекция | следующая лекция ==>
Графическая библиотека языков программирования фирмы Borland | Рисование линейных объектов
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 710; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.