Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C_Kurs_Lekt / C_III_семестр / 17-2_bgi_graph

.pdf
Скачиваний:
13
Добавлен:
13.02.2016
Размер:
97.1 Кб
Скачать

initgraph

Инициализирует графическую систему

 

 

 

-----------------------------------------------------------------

Назначение

Инициализирует графическую систему.

 

Синтаксис

#include<graphics.h>

 

 

 

 

 

void far initgraph(int far *graphdriver,

 

 

 

 

 

 

int far *graphmode,

 

 

 

 

 

char far *pathtodriver);

 

г=======T======T=========T========T=========¬

 

¦

DOS

¦ UNIX ¦ Windows ¦ ANSI C ¦ C++ only¦

 

¦

-------*

+------

 

+---------

 

+--------

 

+---------

¦

 

¦

¦

 

¦

 

¦

 

¦

¦

 

L=======¦======¦=========¦========¦=========-

Замечания

initgraph инициализирует

графическую

систему

 

посредством загрузки с диска графического драй-

 

вера (или подтверждения работоспособности заре-

 

гистрированного

драйвера) и перевода системы в

 

графический режим.

 

 

 

 

 

 

Для запуска графической системы,

прежде всего,

 

следует вызвать функцию initgraph, которая заг-

 

рузит графический драйвер и переведет систему в

 

графический режим.

Вы можете указать initgraph

 

использование конкретного графического драйвера

 

и режима,

либо задать автоматическое распозна-

 

вание

подсоединенного

видеоадаптера с выбором

 

соответствующего драйвера в

процессе

выполне-

 

ния.

 

 

 

 

 

 

 

 

 

Если для

initgraph

задано автоматическое рас-

 

познавание, то для определения графического

 

драйвера и режима эта функция обращается к

 

detectgraph. Кроме того

initgraph

сбрасывает

 

все графические параметры в их значения по

 

умолчанию (текущая позиция, палитра, цвет, гра-

 

фическое

окно

и

т.д.)

и

устанавливает

graphresult в 0.

Обычно initgraph загружает графический драйвер путем выделения памяти для драйвера (с помощью функции _graphgetmem), а затем загружает с диска соответствующий файл .BGI. В качестве альтернативы такой динамической схемы загрузки, вы можете при компоновать файл графического драйвера (или несколько таких файлов) непосредственно к файлу выполняемой программы. (См. описание BGIOBJ в файле UTIL.DOS на дистрибутивных дисках.)

 

Параметр pathtodriver задает маршрут к катало-

 

гу,

 

в котором initgraph будет искать графичес-

 

кие

 

драйверы. initgraph вначале просматривает

 

маршрут, заданный в pathtodriver, а затем, (ес-

 

ли

драйверы не найдены) продолжает поиск в те-

 

кущем

каталоге.

Таким

образом,

если

 

pathtodriver

равен

NULL, то

файлы драйвера

 

(*.BGI) должны быть в текущем

каталоге.

Таким

 

же

способом

1функция settextstyle будет искать

12

файлы (*.CHR), содержащие векторные шрифты.

Параметр *graphdriver представляет собой целое, задающее используемый графический драйвер. Вы можете задавать его значение, используя константы из приведенного ниже перечисляемого типа graphics_drivers, определенного в graphics.h и

представленного в следующей таблице:

Константы графических драйверов

-----------------------------------------------

Константа graphics_drivers Числовое значение

-----------------------------------------------

DETECT

0

(требование

CGA

1

автоопределения)

 

MCGA

2

 

EGA

3

 

EGA64

4

 

EGAMONO

5

 

IBM8514

6

 

HERCMONO

7

 

ATT400

8

 

VGA

9

 

PC3270

10

 

-----------------------------------------------

Параметр *graphmode представляет собой целое, задающее начальный графический режим (если

*graphdriver не равен DETECT, *graphmode уста-

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

*graphmode, используя константу graphics_modes

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

Параметрам graphdriver и graphmode должны быть присвоены значения из таблиц "Константы графических драйверов" и "Графические режимы", в противном случае возможны непредсказуемые ре-

зультаты. Исключение: graphdriver = DETECT.

В нижеприведенной таблице "Графические режимы" перечень элементов C0, C1, C2, C3 столбца "Палитра" соответствует четырем ранее определенным четырехцветным палитрам, доступным для CGA и совместимых систем. В каждой из этих палитр вы можете выбирать цвет фона (элемент #0), но остальные цвета не меняются. Эти палитры более детально описаны в Главе 11 "Видео функции" "Руководства программиста" (в конце главы в разделе "Управление цветом") и сведены в следующую таблицу:

2

-18 grInvalidVersionnum Invalid version

Некорректный номер

number

версии

-----------------------------------------------------------------

Отметим,

что

после

завершения

вызова

graphresult

переменная,

полученная

от

graphresult, сбрасывается

в 0.

Поэтому следует

сохранять значение graphresult

во временной пе-

ременной

и затем проверять его.

 

 

Возвращаемое graphresult возвращает номер текущей графичесзначение кой ошибки, который представляет собой целое в диапазоне от -15 до 0. grapherrormsg возвращает указатель на строку, связанную со значением,

возвращаемым graphresult.

Смотри также detectgraph, drawpoly, fillpoly, floodfill, grapherrormsg, initgraph, pieslice, registerbgidriver, registerbgifont, setallpalette, setcolor, setfillstyle, setgraphmode, setlinestyle, setpalette, settextjustify, settextstyle, setusercharsize, setveiwport, setvisualpage

Пример

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h>

int main(void)

{

/* автоопределение адаптера */

int gdriver = DETECT, gmode, errorcode;

/* инициализация графики и локальных переменных */ initgraph(&gdriver, &gmode, "");

/* чтение результатов инициализации */ errorcode = graphresult();

if (errorcode != grOk) /* если ошибка */

{

printf("Ошибка графики: %s\n", grapherrormsg(errorcode)); printf("Нажмите любую клавишу для останова:");

getch();

/* завершение с кодом ошибки */

exit(1);

}

 

/* начертить линию */

line(0, 0, getmaxx(), getmaxy());

/* очистка */ getch(); closegraph(); return 0;

}

11

В следующей таблице приводятся коды ошибок, возвращаемых graphresult. Перечисляемый тип graph_errors определяет ошибки в данной табли-

це. graph_errors определен в graphics.h.

-----------------------------------------------------------------

Код

Константа

Сообщение, соответ-

Значение

ошибки

graphics_errors ствующее коду ошибки

 

-----------------------------------------------------------------

0

grOK

No error

 

Нет ошибки

 

-1

grNoInitGraph

(BGI) graphics not

 

Графика (BGI) не

 

 

installed (use

 

установлена

 

 

initgraph)

(используйте initgraph)

-2

grNotDetect

Graphics hardware

 

Не определена

 

 

not detected

графическая аппаратура

-3

grFileNotFound

Device driver file

 

Не найден файл

 

 

not found

 

 

драйвера

-4

grInvalidDriver

Invalid device dri-

 

Некорректный файл

 

 

ver file

 

 

драйвера

-5

grNoLoadMem

Not enough memory

Не

хватает

памяти

 

 

to load driver

для загрузки драйвера

-6

grNoScanMem

Out of memory in

 

Выход за пределы

 

 

scan fill

 

памяти при

 

 

 

 

 

сканирующем

-7

grNoFloadMem

Out of memory in

 

заполнении

 

 

Выход за пределы

 

 

flood fill

 

памяти при

 

 

 

 

 

лавинном заполнении

-8

grFontNotFound

Font file not found

 

Не найден файл

-9

grNoFontMem

Not enough memory

 

 

шрифта

 

Не хватает памяти

 

 

to load found

 

для загрузки шрифта

-10

grInvalidMode

Invalid graphics mode

Недопустимый для

 

 

for select driver

 

выбранного драйвера

 

 

 

 

графический режим

-11

grError

Graphics error

 

Графическая ошибка

-12

grIOerror

Graphics I/O error

 

Ошибка графического

 

 

 

 

ввода/вывода

-13

grInvalidFont

Invalid font file

 

Некорректный файл

 

 

 

 

 

шрифта

-14

grInvalidFontNum

Invalid font number

 

Некорректный номер

 

 

 

 

 

шрифта

-15 grInvalidDeviceNum

Invalid device number

Некорректный номер

 

 

 

 

устройства

 

 

10

 

 

 

Палитры цветов.

-----------------------------------------------------------------

Номер

1

Цвет, соответствующий значению пикселя

палитры

2

3

-----------------------------------------------------------------

0

светло-зеленый

светло-красный

желтый

1

светло-голубой

светло-малиновый

белый

2

зеленый

красный

коричневый

3

голубой

малиновый

светло-серый

-----------------------------------------------------------------

После вызова

initgraph

*graphdriver

и

*graphmode устанавливаются в

значения текущего

графического

драйвера

и текущего графического

режима соответственно.

 

 

 

Графические режимы

-----------------------------------------------------------------

графический

graphics_modes Значение Колонок

Палитра Количество

драйвер

X строк

страниц

-----------------------------------------------------------------

CGA

CGAC0

0

 

320

X 200

C0

 

1

 

CGAC1

1

 

320

X 200

C1

 

1

 

CGAC2

2

 

320

X 200

C2

 

1

 

CGAC3

3

 

320

X 200

C3

ЦВЕТА

1

 

CGAHI

4

 

640

X 200

2

1

MCGA

MCGAC0

0

 

320

X 200

C0

 

1

 

MCGAC1

1

 

320

X 200

C1

 

1

 

MCGAC2

2

 

320

X 200

C2

 

1

 

MCGAC3

3

 

320

X 200

C3

ЦВЕТА

1

 

MCGAMED

4

 

640

X 200

2

1

 

MCGAHI

5

 

640

X 480

2

ЦВЕТА

1

EGA

EGALO

0

 

640

X 200

16

ЦВЕТОВ

4

 

EGAHI

1

 

640

X 350

16

ЦВЕТОВ

2

EGA64

EGA64LO

0

 

640

X 200

16

ЦВЕТОВ

1

 

EGA64HI

1

 

640

X 350

4

ЦВЕТА

1

EGAMONO

EGAMONOHI 3

 

640

X 350

2

ЦВЕТА

1*

 

EGAMONOHI 3

 

640

X 350

2

ЦВЕТА

2**

HERC

HERCMONOHI

 

0

720

X 348

2

ЦВЕТА

2

ATT400

ATT400C0

 

0

320

X 200

C0

 

1

 

ATT400C1

 

1

320

X 200

C1

 

1

 

ATT400C2

 

2

320

X 200

C2

 

1

 

ATT400C3

 

3

320

X 200

C3

ЦВЕТА

1

 

ATT400MED

 

4

640

X 200

2

1

 

ATT400HI

 

5

640

X 400

2

ЦВЕТА

1

VGA

VGALO

 

0

640

X 200

16

ЦВЕТОВ

2

 

VGAMED

 

1

640

X 350

16

ЦВЕТОВ

2

 

VGAHI

 

2

640

X 480

16

ЦВЕТОВ

1

PC3270

PC3270HI

 

0

720

X 350

2

ЦВЕТА

1

IBM8514

IBM8514HI

 

1

1024 X 768

256 ЦВЕТОВ

 

 

3

 

 

 

 

 

 

 

IBM8514LO 0 640 X 480 256 ЦВЕТОВ

*64 K на плате EGAMONO

**256 K на плате EGAMONO

-----------------------------------------------------------------

Возвращаемое initgraph всегда устанавливает внутренний код значение ошибки; причем в случае успешного завершения данный код устанавливается в 0. В случае ошибки

*graphdriver устанавливается в -2, -3, -4 или

-5, а graphresult такие же значение, как представлено ниже:

grNotDetected

-2

Не может определить тип

 

 

 

графической платы

 

grFileNotFound

-3

Не может найти файл драйвера

grInvalidDriver

-4

Неправильный драйвер

 

grNoLoadMem

-5

Для загрузки

драйвера

не

 

 

хватает памяти

 

Смотри также

 

 

getdefaultpalette,

closegraph, detectgraph,

getdrivername,

getgraphmode,

getmoderange,

graphdefaults,

 

_graphgetmem,

graphresult,

installuserdriver,

 

registerbgidriver,

registerbgifont,

 

 

 

restorecrtmode,

setgraphbufsize, setgraphmode.

Пример

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h>

int main(void)

{

/* автоопределение адаптера */

int gdriver = DETECT, gmode, errorcode;

/* инициализация графического режима */ initgraph(&gdriver, &gmode, "");

/* чтение результата инициализации */ errorcode = graphresult();

if (errorcode != grOk) /* если ошибка */

{

printf("Ошибка графики: %s\n", grapherrormsg(errorcode)); printf("Нажмите любую клавишу для останова:");

getch();

exit(1);

/* завершение с кодом ошибки */

}

 

/* начертить линию */

line(0, 0, getmaxx(), getmaxy());

/* очистка */

4

#include <stdio.h> #include <conio.h>

int main()

{

/* автоопределение адаптера */

int gdriver = DETECT, gmode, errorcode;

/* запись имени драйвера устройства */ char *drivername;

/* инициализация графики и локальных переменных */ initgraph(&gdriver, &gmode, "");

/* чтение результата инициализации */ errorcode = graphresult();

if (errorcode != grOk) /* если ошибка */

{

 

printf("Ошибка графики: %s\n", grapherrormsg(errorcode));

printf("Нажмите любую клавишу для останова:");

getch();

/* завершение с кодом ошибки */

exit(1);

}

 

setcolor(getmaxcolor());

/* получить имя используемого драйвера устройства */

drivername = getdrivername();

/* центрирование текста на экране */

settextjustify(CENTER_TEXT, CENTER_TEXT);

/* вывести имя драйвера */

outtextxy(getmaxx() / 2, getmaxy() / 2, drivername);

/* очистка */

 

getch();

 

closegraph();

 

return 0;

 

}

 

graphresult

Возвращает код ошибки последней неудачной

 

графической операции

-----------------------------------------------------------------

Назначение

Возвращает

код ошибки последней неудачной гра-

 

фической операции.

 

 

 

Синтаксис

#include<graphics.h>

 

 

 

 

int far

graphresult(void);

 

 

 

г=======T======T=========T========T=========¬

 

¦

DOS

¦ UNIX ¦ Windows ¦ ANSI C ¦ C++ only¦

 

¦

-------*

+------

+---------

+--------

+---------

¦

 

¦

¦

¦

¦

¦

¦

 

L=======¦======¦=========¦========¦=========-

Замечания graphresult возвращает код ошибки последней графической операции, которая сообщила об ошиб-

ке и устанавливает уровень ошибки в grОk.

9

}

/* Инициализация графики и локальных переменных */ initgraph(&gdriver, &gmode, "");

/* Чтение

результата инициализации */

errorcode

= graphresult();

Ошибка */

if (errorcode != grOk) /*

{

 

 

printf("Ошибка графики: %s\n", grapherrormsg(errorcode)); printf("Нажмите любую клавишу для останова:");

getch();

exit(1); /* Завершение с кодом 1 */

}

midx = getmaxx() / 2; midy = getmaxy() / 2;

/* Выбрать регистрируемый шрифт */ settextstyle(TRIPLEX_FONT, HORIZ_DIR, 4);

/* Вывести какой-нибудь текст */ settextjustify(CENTER_TEXT, CENTER_TEXT); outtextxy(midx, midy, "The TRIPLEX FONT");

/* Восстановление режима */ getch();

closegraph(); return 0;

}

getdrivername Возвращает указатель на строку, содержащую имя текущего графического драйвера

-----------------------------------------------------------------

Назначение

Возвращает указатель на строку, содержащую имя

 

текущего графического драйвера.

 

 

Синтаксис

#include<graphics.h>

 

 

 

 

char *far

getdrivername(void);

 

 

 

г=======T======T=========T========T=========¬

 

¦

DOS

¦

UNIX ¦ Windows ¦ ANSI C ¦ C++ only¦

 

¦

-------*

+

------+---------

+--------

+---------

¦

 

¦

¦

¦

¦

¦

¦

 

L=======¦======¦=========¦========¦=========-

Замечания

После вызова

функции

initgraph,

функция

 

getdrivername возвращает имя драйвера, который

 

загружен в данный момент.

 

 

Возвращаемое

getdrivername возвращает

указатель

на строку,

значение

которая содержит

имя

текущего графического

 

драйвера.

 

 

 

Смотри также

initgraph

 

 

 

Пример

 

 

 

 

#include <graphics.h>

#include <stdlib.h>

8

getch();

closegraph(); return 0;

}

registerbgidriver Связывает загруженный пользователем или встроенный в систему драйвер графической системы с самой графической системой

-----------------------------------------------------------------

Назначение

Связывает

загруженный

пользователем

или

 

встроенный в систему драйвер графической систе-

 

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

 

 

Синтаксис

#include<graphics.h>

 

 

 

 

 

 

int registerbgidriver(void (*driver)(void));

 

 

г=======T======T=========T========T=========¬

 

¦

DOS

¦ UNIX ¦ Windows ¦ ANSI C ¦ C++ only¦

 

¦-------+------+---------+--------+---------¦

 

¦

*

¦

 

¦

 

¦

 

¦

 

¦

 

L=======¦======¦=========¦========¦=========-

Замечания

registerbgidriver

 

позволяет

 

пользователю

 

загружать файл

драйвера и "регистрировать" его

 

в системе.

Адрес драйвера в памяти

передается

 

registerbgidriver

и

initgraph будет использо-

 

вать этот зарегистрированный драйвер. Зарегист-

 

рированный пользователем драйвер может быть

 

загружен с диска в

 

динамически

распределяемую

 

память или преобразован в объектный файл (.OBJ)

 

путем

использования

программы

BINOBJ.EXE

и

 

скомпонован в загрузочный модуль (.EXE).

 

 

Вызов функции

registerbgidriver

информирует

 

графическую систему о том,

что драйвер, на ко-

 

торый

указывает

driver,

был включен во время

 

компоновки. Эта функция проверяет, действитель-

 

но ли

скомпонованная программа является драйве-

 

ром,

и если является, то он регистрируется во

 

внутренних таблицах.

Встроенные драйверы более

 

подробно рассматриваются в UTIL.DOC, имеющийся

 

в полученных вами дисках.

 

 

 

 

 

Указывая имя компонуемого драйвера

при вызове

 

registerbgidriver,

 

вы также сообщаете компиля-

 

тору (и компоновщику) о необходимости компонов-

 

ки объектного файла с этим именем.

 

 

Возвращаемое

registerbgidriver

возвращает отрицательный код

значение

ошибки

графической

системы,

если

указанный

драйвер некорректен. В противном случае функция registerbgidriver возвращает номер драйвера.

Если вы регистрируете созданный пользователем драйвер, то должны передать результат выполнения функции registerbgidriver функции initgraph, для того чтобы номер драйвера мог

быть использован.

5

См. также

graphresult,

initgraph,

installuserdriver,

 

registerbgifont

 

 

Пример

 

 

 

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h>

int main(void)

{

/* автоопределение адаптера */

int gdriver = DETECT, gmode, errorcode;

/* Регистрация драйвера, который был добавлен в graphics.lib */

errorcode = registerbgidriver(EGAVGA_driver);

/* Сообщение о любых регистрируемых ошибках */ if (errorcode < 0)

{

printf("Ошибка графики: %s\n", grapherrormsg(errorcode)); printf("Нажмите любую клавишу для останова:");

getch();

exit(1); /* завершение с кодом ошибки */

}

/* Инициализация графики и локальных переменных */ initgraph(&gdriver, &gmode, "");

/* Чтение

результата инициализации */

errorcode

= graphresult();

Ошибка */

if (errorcode != grOk) /*

{

 

 

printf("Ошибка графики: %s\n", grapherrormsg(errorcode)); printf("Нажмите любую клавишу для останова:");

getch();

exit(1); /* Завершение с кодом 1 */

}

/* Вычерчивание линии */

line(0, 0, getmaxx(), getmaxy());

/* Восстановление режима */ getch();

closegraph(); return 0;

}

registerbgifont Регистрирует скомпонованные коды шрифта

-----------------------------------------------------------------

Назначение

Регистрирует скомпонованные коды шрифта.

Синтаксис

#include<graphics.h>

 

int registerbgifont(void (*font)(void));

 

6

 

г=======T======T=========T========T=========¬

 

¦

DOS

¦ UNIX ¦ Windows ¦ ANSI C ¦ C++ only¦

 

¦-------+------+---------+--------+---------¦

 

¦

*

¦

 

¦

¦

 

¦

 

¦

 

L=======¦======¦=========¦========¦=========-

Замечания

Вызов registerbgifont

информирует

графическую

 

систему о том,

 

что шрифт, на который указывает

 

font, был включен во время компоновки. Эта

 

функция

проверяет,

действительно ли скомпоно-

 

ванные коды являются кодами шрифта,

и если яв-

 

ляются,

то эти коды регистрируются во внутрен-

 

них таблицах.

 

Встроенные шрифты более подробно

 

рассматриваются

в документе UTIL.DOC в BGIOBJ,

 

который можно найти в полученных Вами дисках.

 

Указывая имя компонуемого шрифта при вызове

 

registerbgifont, вы также сообщаете компилятору

 

(и компоновщику) о необходимости компоновки

 

объектного файла с этим именем.

 

 

 

 

Если вы

регистрируете

созданный

пользователем

 

шрифт,

то должны передать результат выполнения

 

функции registerbgifont функции

settextstyle,

 

для

того,

чтобы

номер

шрифта

мог

быть

 

использован.

 

 

 

 

 

 

 

Возвращаемое

registerbgifont

возвращает

отрицательный

код

значение

ошибки

графической

системы, если

указанный

 

шрифт некорректен.

В

противном

случае

 

registerbgifont возвращает номер

зарегистриро-

 

ванного шрифта.

 

 

 

 

 

 

См. также

graphresult,

 

initgraph,

installuserdriver,

 

registerbgdriver, settextstyle

 

 

 

Пример

#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h>

int main(void)

{

/* автоопределение адаптера */

int gdriver = DETECT, gmode, errorcode; int midx, midy;

/* Регистр файла шрифта, который был добавлен в graphics.lib */ errorcode = registerbgifont(triplex_font);

/* Сообщение о любых регистрируемых ошибках */ if (errorcode < 0)

{

printf("Ошибка графики: %s\n", grapherrormsg(errorcode)); printf("Нажмите любую клавишу для останова:");

getch();

exit(1); /* завершение с кодом ошибки */

7