- •Глава 12 графика
- •1. Общие сведения
- •2. Инициализация графической системы. Обработка ошибок. Переключение режимов
- •Initgraph (&gd, &gm,"путь к bgi-файлам");
- •3. Работа с окнами и координатами
- •4. Графические примитивы
- •1 Способ:
- •2 Способ:
- •Примеры решения задач Задача a
- •5. Включение .Bgi-драйверов в .Exe-файл
- •Задание для самостоятельной работы
- •Задача b
- •Задание для самостоятельной работы
- •Задача c
- •Задание на программирование Задача 1
- •Задача 2
- •Задача 3
- •Задача 4
- •Задача 5
- •Задача 6
- •Задача 7
- •Задача 8
- •Задача 9
- •Задача 14
- •Задача 15
- •Задача 16
- •Задача 17
- •Задача 29
- •Задача 37
- •Задача 39
- •Задача 40
2. Инициализация графической системы. Обработка ошибок. Переключение режимов
1). Выбор драйвера и графического режима выполняет функция
detectgraph (&gd, &gm);
Происходит тестирование аппаратуры видеоадаптера, автоматический выбор подходящего драйвера и графического режима. Целочисленные переменные, указатели на которые передаются функции в качестве аргументов, возвращают номер драйвера и номер режима.
2). Загрузку драйвера, инициализацию графической системы выполняет функция
Initgraph (&gd, &gm,"путь к bgi-файлам");
Значениями переменных gd и gm должны быть номер нужного драйвера и номер желаемого графического режима. Если файл с указанным драйвером найден, то ему динамически выделяется необходимая память и производится его загрузка.
Если памяти нет в достаточном количестве, функция завершится аварийно с кодом "-5". После же нормального размещения драйвера в памяти, функция initgraph() организует внутренний графический буфер, динамически запрашивая блок ОП размером 4К (по умолчанию). Затем происходит инициализация графических переменных (цвет символов, цвет фона, текущее окно и др.), и адаптер дисплея переводится в графический режим. При этом экран очищается и указатель текущей позиции устанавливается в левом верхнем углу.
Если BGI-файлы находятся в текущей директории, то в качестве третьего параметра функции initgraph() можно задать пустую строку
initgraph (&gd, &gm, " ");
3). Обработка ошибочных ситуаций. В ТС и С++ предусмотрены средства обработки ошибок, возникающих при работе с графикой. Функция
graphresult ();
возвращает код завершения последней используемой графической функции. В случае успеха возвращается "0".
Для различных типов ошибок предусмотрены свои коды завершения:
-
Константа
Код ошибки
Сообщение
grOK
0
Нет ошибки
grNoInitGraph
-1
Графика не инициализирована
. . .
. . .
. . .
grNoLoadMem
-5
Нехватка памяти для загрузки драйвера
. . .
. . .
. . .
grFontNotFound
-8
Файл шрифта не найден
. . .
. . .
. . .
Имеется возможность распечатать сообщение, соответствующее значению кода ошибки. Для этого используется функция
grapherrormsg (код ошибки);
Она возвращает указатель на строку, содержащую описание кода завершения, переданного в качестве аргумента.
Обычная начальная последовательность действий при работе с графикой выглядят таким образом:
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
void main ( )
{
int gd, gm, error;
detectgraph (&gd, &gm);
initgraph (&gd, &gm, " ");
error = graphresult ( );
if (error !=gr0k )
{
puts (" ошибка графики");
puts (grapherrormsg (error));
exit (1);
}
// Тело программы
. . . . . . . . . . . .
closegraph ( );
exit (0);
}
4). Переключение режимов. Для временного перехода в текстовый режим дисплейного адаптера в графической библиотеке предусмотрена функция
restorecrtmode ();
Она восстанавливает тот текстовый режим, который был перед обращением к функции initgraph() текстовое содержимое буфера (а, значит, и экрана) не восстанавливается, так как его уничтожает функция initgraph(). Вернуться в графический режим можно с помощью функции
setgraphmode (gm);
Аргументом ее является целочисленный номер режима, допустимый для данного драйвера. Можно восстановить прежний графический режим, если его номер был заблаговременно определен с помощью функции
getgraphmode ();
и сохранен в программе.
Получить максимальное значение номера графического режима, допустимое для текущего драйвера, можно с помощью функции
getmaxmode ();
По окончании работы с графической системой необходимо освободить память, выделенную динамически под нужды графики, очистить буфер видеоадаптера, восстановить предыдущий текстовый режим. Все эти действия выполняет функция
closegraph ();
5). Установка цветов, шрифтов, стилей линий и стилей закраски. Для указания цвета в программе можно пользоваться константами перечислимого типа или соответствующими им целыми значениями.
Стандартная цветовая палитра такова:
BLACK 0 черный
BLUE 1 синий
GREEN 2 зеленый
GRAY 3 серый
RED 4 красный
MAGENTA 5 малиновый
BROWN 6 коричневый
LIGHTGRАY 7 светло-серый
DARKGRАY 8 темно-серый
LIGHTBLUE 9 светло-синий
LIGHTGREEN 10 светло-зеленый
LIGHTCYAN 11 светло-бирюзовый
LIGHTRED 12 светло-красный
LIGHTMAGENTA 13 светло-малиновый
YELLOW 14 желтый
WHITE 15 белый
Цветом фона можно управлять с помощью функции
setbkcolor (цвет);
Текущее значение рисующего цвета (цвета выводимых символов и линий) устанавливается функцией
setcolor (цвет);
В графическом режиме при выводе текстового сообщения имеется возможность выбора одного из нескольких шрифтов, размера выводимых символов, и направления текста. Эти параметры задаются при помощи функции
settextstyle (шрифт, направление, размер);
Допустимые значения для параметра шрифт:
0 DEFAULT_FONT (стандартный)
1 TRIPLEX_FONT (типа триплекс; в файле TRIP.CHR)
2 SMALL_FONT (уменьшенный; в файле LITT.CHR)
3 SANS_SERIF_FONT (прямой; в файле SANS.CHR)
4 GOTHIC_FONT (готический; в файле GOTH.CHR)
Допустимые значения для параметра направление:
0 HORIZ_DIR (слева направо)
1 VERT_DIR (снизу вверх)
Аргумент, управляющий размером шрифта, может изменяться от 1 до 10. Для стандартного шрифта эта величина говорит, во сколько раз надо увеличить каждый символ (этот шрифт определен на матрице 8*8, значит, если размер равен 4, то символы будут увеличены до матрицы 32*32 пиксела). Для остальных шрифтов этот параметр задает не линейную, а экспоненциальную шкалу масштабирования. Базовый вариант символа соответствует размеру, равному 4. Поэтому если размер равен 7, то символы увеличатся в 2 раза; если 8 - то в 3 раза; если 9 - то в 4 раза.
Использование вертикального расположения строки делает символы ниже и шире, чем в горизонтальной строке. Это связано с эффектом "неквадратности" пикселов на некоторых типах дисплеев.
Символы текста всегда выводятся сплошными тонкими линиями.
Для установки характера и толщины линий геометрических обьектов используется функция
setlinestyle (вид, образец, толщина);
Допустимые значения для параметра толщина:
1 NORM_WIDTH (линия в один пиксел)
3 THICK_WIDTH (линия в три пиксела)
Коды для параметра вид (только для кусочно-линейных графических примитивов):
0 SOLID_LINE (сплошная)
1 DOTTED_LINE (из точек)
2 CENTER_LINE (из точек и тире)
3 DASHED_LINE (пунктирная)
4 USERBIT_LINE (определяемая пользователем)
Параметр образец задается только, если вид равен 4 (в остальных случаях он игнорируется, поэтому его можно делать равным 0). С его помощью можно задать любой периодически повторяющийся рисунок линии с периодом до 16 пикселов. Если в линии нужен светящийся пиксел - в шаблоне задается бит, равный 1; если нет - 0.
Например, шаблон для пунктирной линии может быть таким: 0x3333, что соответствует последовательности битов 0011001100110011.
В графическом режиме имеется возможность закрасить выделенную на экране замкнутую область определенным способом.
Для установки стиля закраски используется функция
setfillstyle (тип закраски, цвет);
Допустимые значения параметра тип закраски:
0 EMPTY_FILL (штриховка цветом фона)
1 SOLID_FILL (сплошное заполнение указанным цветом)
2 LINE_FILL (штриховка горизонтальными линиями)
3 LTSLASH_FILL (штриховка наклонными линиями ///// )
4 SLASH_FILL (штриховка утолщенными линиями ////// )
5 BKSLASH_FILL (штриховка утолщенными линиями \\\\\\ )
6 LTBKSLASH_FILL (штриховка наклонными линиями \\\\\ )
7 HATCH_FILL (прямоугольная горизонтальная штриховка)
8 XHATCH_FILL (косая штриховка)
9 INTERLEAVE_FILL (косая перекрывающаяся штриховка)
10 WIDE DOT_FILL (заполнение редко расположенными точками)
11 CLOSE_DOT_FILL (заполнение часто расположенными точками)
