1.1. Загрузка графического драйвера

Среди функций настройки графического режима следует выделить следующие:

void far detectgraph(int far *gdriver, int far *gmode);

void far initgraph(int far *gdriver, int far *gmode,

char far *pathdriver).

Функция detectgraph предназначена для определения типа графического адаптера. Эта функция возвращает значения по адресам, указанным первым и вторым параметрами. Здесь gdriver — указатель на целое число, содержащее номер графического драйвера. Например, для CGA этот номер будет равен 1, для EGA — 3, для VGA — 9, для Hercules — 7. Можно придавать значения с помощью констант, описанных в graphics.h, как CGA = 1, EGA = 3, Herc = 7 и VGA = 9. Вторым параметром функции detectgraph будет указатель на целое число, содержащее номер графического режима, обеспечивающего максимальную разрешающую способность экрана. Если нет графического адаптера, то функция detectgraph присваивает *gdriver = -2.

Функция initgraph предназначена для загрузки графического драйвера, имеющего номер *gdriver, и для установки графического режима номер  *gmode.  Если  по адресу gdriver записан нуль (*gdriver=DETECT), то функция  вначале обращается к функции detectgraph, а затем загружает драйвер, номер которого был установлен функцией detectgraph. (При этом устанавливается наибольший из возможных номеров режимов.) Необхо­димая память для загрузки драйвера предоставляется в "куче". В зависимости от графического режима максимальная разрешающая способность экрана равна

для адаптера CGA:

CGACi=i (i=0,1,2,3)  —  320×200;

для адаптера EGA:

EGALO=0 — 640×200, EGAHI=1 — 640×350;

для адаптера VGA:

VGALO=0 — 640×200, VGAMED=1-640×350, VGAHI=2-640×480.

Для выгрузки графического драйвера применяется функция, объявленная как voidclosegraph(void). Эта функция освобождает память из "кучи", занятую графическим драйвером.

Чтобы вычислить разрешающую способность экрана по x и y, применяются функции voidfargetmaxx(void), voidfargetmaxy(void).

Пример 1.1. В данном примере номеру графического драйвера придается значение EGA=3, номеру графического режима — EGALO=3. Определяются разрешающие способности по x и y.

#include <stdio.h>

#include <graphics.h>

#include <conio.h>

main()

{

int gdriver = EGA, gmode = EGALO;

int maxx, maxy;

initgraph (&gdriver, &gmode, "С:\BC\BGI");

maxx = getmaxx();

maxy = getmaxy();

closegraph();

printf("maxx = %d , maxy = %d n", maxx, maxy);

}

После запуска данной программы на экран будет выдано сообщение: maxx=639,maxy=199.

Модули драйвера можно преобразовать в объектный файл с помощью утилиты BGIOBJ.EXE. Затем полученный объектный файл подши­вается к программе с помощью указания имени объектного файла в проекте (после имени главного модуля). В этом случае перед инициализацией графического режима следует вызвать функцию intregisterbgidriver(void(*driver)(void)) подтверждения графического драйвера.

Пример 1.2. После команды BGIOBJ С:BCBGIEGAVGA будет создан файл EGAVGA.OBJ. Теперь надо включить имя EGAVGA.OBJ в проект .prj. Инициализация графического режима производится следующим образом:

main()

{

int driver, mode;

driver=registerbgidriver(EGAVGA_driver);

driver = VGA; mode = VGAHI;

initgraph (&driver, &mode, "");

…// вывод на экран

closegraph();

}

После установки графического режима с помощью initgraph экран монитора представляет собой прямоугольную область, разбитую на (getmaxx()+1)´(getmaxy()+1) одинаковых прямоугольников — пикселов, стороны которых параллельны верхней и нижней границам экрана. Слово пиксел (pixels) образовалось от слияния двух английских слов: picture и elemets. Под пикселом понимается минимальный элемент изображения на экране, состоящий из нескольких (цветных) точек и рассматриваемый в программе как одна точка определенной яркости или цвета. Под координатами пиксела подразумеваются  целочисленные координаты центров этих прямоугольников, отсчитываемые от координат центра левого верхнего прямоугольника. Координаты пикселов (X,Y) изменяются в диапазонах 0£X£getmaxx(), 0£Y£getmaxy().

Графические функции, с которыми мы можем работать после установки графического режима, условно можно разделить на три группы. Первая группа состоит из функций, которые ничего не выводят на экран, но устанавливают некоторые параметры. Например, функция setcolor задает номер цвета для дальнейшего вывода линий. Вторая группа состоит из функций, которые осуществляют вывод на экран. Чтобы  вывести точку заданного цвета, применяется функция  voidputpixel(intx,inty,intcolor). Третья группа состоит из функций, которые ничего не выводят на экран, но позволяют получить информацию о выведенном изображении. Например, для чтения цвета пиксела предназначена функция intgetpixel(intx,inty). Имена функций первой группы начинаются, как правило со слова set (ставить, помещать), а функции третьей группы – со слова get (получать, доставать).

Графические функции производят вывод в страницу, которая называется активной.

Коэффициентом сжатия экрана называется отношение ширины пикселя к высоте пиксела. Коэффициент сжатия можно узнать с помощью функции voidgetaspectratio(intfar*xasp,intfar*yasp). Эта функция записывает по адресу yasp число 10000, а по адресу xasp — произведение коэффициента сжатия  на 10000.

Коэффициент сжатия учитывается  при выводе окружностей, дуг окружностей и секторов круга. Коэффициент сжатия  устанавливается при инициализации графического режима, исходя из режима, соответствующего максимальной разрешающей способности экрана, и может быть изменен с помощью функции voidsetaspectratio(intxasp,intyasp); в этом случае новым коэффициентом сжатия будет отношение  yasp/xasp.

Ниже (в примере 1.3) будет рассмотрено использование функции  определения коэффициента сжатия.