Работа в графическом режиме видеоадаптера в ОС MS-DOS
Функции для работы в графическом режиме определены в стандартном заголовочном файле graphics.h.
Так же, как и в текстовом режиме, графические функции оперируют с окнами. При запуске программы исходное окно имеет размер всего экрана. Левый верхний угол окна имеет координаты (0,0).
Текущая графическая позиция – это точка экрана, на которой закончилось рисование предыдущей фигуры, положение этой точки зависит от истории рисования фигур.
Для работы в графическом видеорежиме его необходимо установить для видеоадаптера. В состав графического пакета среды Borland C++ 3.1 входят специальные драйверы графических устройств (*.bgi) и символьные шрифты (*.chr). Наиболее часто используемый драйвер – egavga.bgi.
Необходимо установать параметр компилятора Options > Linker > Libraries > Graphics library.
void far initgraph(int far* driver, int far* mode, char far* path);
Функция устанавливает графический видеорежим. Параметр driver определяет загружаемый драйвер, параметр mode определяет видеорежим драйвера, параметр path определяет путь к директории, в которой находится драйвер. Если маршрут не указан, то предполагается, что файл находится в текущей директории.
В заголовочном файле определены константы перечислимого типа, значения который соответствуют загружаемым драйверам. Ниже в таблице приведены некоторые из них.
Константа
| Значение
|
DETECT
|
|
EGA
|
|
VGA
|
|
Если задана константа DETECT, то тип видеоадаптера и драйвер определяются автоматически во время выполнения программы. Константы, задающие режимы для данных драйверов, приведены в таблице ниже.
Драйвер и режим
| Значение
| Разрешение
| Палитра
| Количество страниц
|
EGALO
|
| 640 X 200
| 16 цветов
|
|
EGAHI
|
| 640 X 350
| 16 цветов
|
|
VGALO
|
| 640 X 200
| 16 цветов
|
|
VGAMED
|
| 640 X 350
| 16 цветов
|
|
VGAHI
|
| 640 X 480
| 16 цветов
|
|
int far getmaxmode(void);
Функция возвращает значение максимального режима загруженного драйвера.
int far getgraphmode(void);
Функция возвращает значение текущего режима загруженного драйвера.
void far setgraphmode(int mode);
Функция устанавливает графический режим, значение которого принимает в качестве параметра, для загруженного драйвера.
void far closegraph(void);
void far restorecrtmode(void);
Функции используются для выхода из графического режима в текстовый.
В данных графических режимах из 64 доступных цветов можно одновременно использовать лишь 16, которые образуют цветовую палитру.
В зависимости от типа видеоадаптера и установленного видеорежима система может иметь от 1 до 4 буферных страниц. Каждая из страниц может быть указана как активная, в которую происходит вывод, и визуальная, которая отображается на экране. По умолчанию активная и визуальная тсраницы совпадают.
void far cleardevice(void);
Функция очищает активную страницу.
void far setactivepage(int page);
void far setvisualpage(int page);
Функции устанавливают номер активной и визуальной страниц соответственно.
void far setviewport(int left, int top, int right, int bottom, int clip);
Функция создает графическое окно, которое становится активным, координаты левой верхней (left, top) и правой нижней (right, bottom) вершин окна являются абсолютными в системе координат экрана и передаются в качестве параметров. Если параметр clip отличен от нуля, то вывод графической информации за границы окна автоматически прерывается, если равен нулю, то вывод не прерывается. В любом случае ошибка не фиксируется.
void far clearviewport(void);
Функция очищает текущее окно и устанавливает текущую графическую позицию в левый верхний угол окна.
Для получения параметров активного окна в файле graphics.h объявлена специальная структура.
struct viewporttype {
int left, top, right, bottom;
int clip;
};
Поля left, top, right и bottom содержат координаты вершин окна, поле clip хранит значение флага, определяющего возможность выхода за границы окна.
void far getviewsettings(struct viewporttype far* viewport);
Функция заполняет структуру, адрес которой передаётся в качестве параметра, параметрами текущего окна.
int far getmaxx(void);
int far getmaxy(void);
Функции возвращают соответствующую максимальную координату экрана (разрешение экрана по соответствующей координате –1).
unsigned far imagesize(int left, int top, int right, int bottom);
Функция возвращает число байт, необходимое для хранения образа части экрана, координаты левой верхней (left, top) и правой нижней (right, bottom) вершин этого образа передаются в качестве параметров. Если необходимый размер превышает (64K-1) байтов, функция возвращает 0xFFFF (-1).
void far getimage(int left, int top, int right, int bottom, void far* bitmap);
Функция копирует битовый образ экрана в буфер памяти, адрес буфера передаётся в качестве параметра bitmap, остальные параметры содержат координаты левой верхней (left, top) и правой нижней (right, bottom) вершин этого образа.
void far putimage(int left, int top, void far* bitmap, int op);
Функция выводит битовый образ на экран из буфера памяти, адрес буфера передаётся в качестве параметра bitmap, параметры left и top содержат координаты левой верхней вершины выводимого образа. Параметр op задаёт оператор способа вывода образа на экран. Для этого в файле graphics.h объявлен специальный перечислимый тип.
enum putimage_ops {
COPY_PUT,
XOR_PUT,
OR_PUT,
AND_PUT,
NOT_PUT
};
Смысл констант приведён в таблице ниже.
COPY_PUT
| Копирование образа из памяти на экран
|
XOR_PUT
| На экран выводится результат операции XOR между битами образа в памяти и битами образа на экране.
|
OR_PUT
| На экран выводится результат операции OR между битами образа в памяти и битами образа на экране.
|
AND_PUT
| На экран выводится результат операции AND между битами образа в памяти и битами образа на экране.
|
NOT_PUT
| На экран выводится результат операции NOT над битами образа в памяти
|
void far setpalette(int index, int color);
Функция устанавливает цвет текущей палитры с номером index в цвет из набора доступных цветов, номер которого задаётся параметром color. Изменения вступают в действия на экране немедленно.
void far setbkcolor(int color);
Функция устанавливает цвет фона, параметр color задаёт номер цвета из текущей палитры. Изменения вступают в действия на экране немедленно.
int far getbkcolor(void);
Функция возвращает код текущего цвета фона из цветовой палитры.
void far putpixel(int x,int y, int color);
Функция устанавливает цвет пиксела с координатами x и y, код цвета из палитры задаёт параметр color.
unsigned int far getpixel(int x,int y);
Функция возвращает код цвета пиксела с координатами x и y.
void far setcolor(int color);
Функция устанавливает текущий цвет (которым рисуются объекты), параметр задаёт код цвета из палитры. Изменения вступают в действия для вновь выводимых объектов на экране.
int far getcolor(void);
Функция возвращает код текущего цвета из цветовой палитры.
Графические функции рисования линий можно разделить на два основных класса: для одних функций координаты фигуры полностью определяются передаваемыми им параметрами; для других функций передается лишь часть координат фигуры, остальные координаты зависят от текущей графической позиции.
int far getx(void);
int far gety(void);
Функции возвращают координату текущей графической позиции по соответствующей оси координат. Возвращаемое значение является относительным относительно текущего графического окна.
void far moveto(int x, int y);
void far moverel(int dx, int dy);
Функции устанавливают новую графическую позицию. Функция moveto() принимает в качестве параметров координаты новой позиции в окне. Функция moverel() устанавливает новую позицию в результате смещения текущей позиции на dx и dy по соответствующей координате.
void far line(int x1, int y1, int x2, int y2);
void far linerel(int dx, int dy);
void far lineto(int x, int y);
Функция line() рисует линию из точки (x1, y1) в точку (x2, y2), не изменяя текущую графическую позицию. Функция linerel() рисует линию из текущей графической позиции в точку, смещенную относительно позиции на (dx, dy), изменяя текущую графическую позицию. Функция lineto() рисует линию из текущей графической позиции в точку (x, y), изменяя текущую графическую позицию.
Общие обозначения имён параметров:
radius – радиус объекта;
xradius и yradius - горизонтальная и вертикальная оси объекта,
stangle и endangle – углы начала и конца объекта.
void far circle(int x, int y, int radius);
void far arc(int x, int y, int stangle, int endangle, int radius);
Функция circle() рисует окружность. Функция arc() рисует дугу окружности. Параметры x и y задают центр окружности.
void far ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius);
Функция рисует эллипс. Параметры x и y задают центр эллипса.
void far drawpoly(int numpoints, int far* polypoints);
Функция рисует многоугольник, количество точек и массив, содержащий координаты точек, передаются в качестве параметров. Размер массива вдвое больше, чем число точек. Если необходимо нарисовать замкнутый многоугольник с N вершинами, необходимо передать в функцию N+1 точку, последняя точка должна совпадать с начальной.
void far rectangle(int left, int top, int right, int bottom);
Функция рисует прямоугольник, координаты левой верхней (left, top) и правой нижней (right, bottom) вершин передаются в качестве параметров.
Для шаблонов рисуемых линий в файле graphics.h объявлены специальная структура и перечислимые типы.
struct linesettingstype {
int linestyle;
unsigned upattern;
int thickness;
};
Первое поле структуры linestyle определяет стиль линии (сплошной, разрывный и другие) и может принимать одно из следующих значений перечислимого типа.
enum line_styles {
SOLID_LINE = 0,
DOTTED_LINE = 1,
CENTER_LINE = 2,
DASHED_LINE = 3,
USERBIT_LINE = 4,
};
Третье поле структуры thickness определяет ширину линии и может принимать одно из следующих значений перечислимого типа.
enum line_widths {
NORM_WIDTH = 1,
THICK_WIDTH = 3,
};
Второе поле структуры upattern используется только в том случае, если поле linestyle имеет значение USERBIT_LINE. Оно определяет шаблон линии, задаваемый пользователем. Это 16-битная маска для линии длиной 16 пикселов, значения единиц в разрядах маски определяют, будет ли данный пиксел прорисован (1 – да, 0 – нет).
Пример
upattern=39471(0x9A2F)
void far getlinesettings(struct linesettingstype far* lineinfo);
Функция заполняет структуру, адрес которой передаётся в качестве параметра, текущими параметрами выводимых линий.
void far setlinestyle(int linestyle, unsigned upattern, int thickness);
Функция устанавливает стиль выводимых линий. Смысл параметров такой же, как смысл полей структуры linesettingstype.
Для получения параметров закраски в файле graphics.h объявлена специальная структура.
struct fillsettingstype {
int pattern;
int color;
};
Поле color определяет цвет закраски, поле pattern определяет стиль закрашивания.
void far getfillsettings(struct fillsettingstype far* fillinfo);
Функция заполняет структуру, адрес которой передаётся в качестве параметра, текущими параметрами закраски.
void far setfillstyle(int pattern, int color);
Функция устанавливает шаблон и цвет закрашиваемых контуров. Параметр color определяет цвет закраски, параметр pattern определяет стиль закрашивания и может принимать одно из значений перечислимого типа fill_patterns. Ниже в таблице приведены имена и значения констант типа fill_patterns, а также пояснения.
Имя константы
| Значение
| Пояснение
|
EMPTY_FILL
|
| Заполнение цветом фона
|
SOLID_FILL
|
| Сплошное заданным цветом
|
LINE_FILL
|
| Горизонтальными линиями
|
LTSLASH_FILL
|
| Косыми линиями ///
|
SLASH_FILL
|
| Толстыми косыми линиями
|
BKSLASH_FILL
|
| Толстыми обратными косыми линиями \\\
|
LTBKSLASH_FILL
|
| Обратными косыми линиями
|
HATCH_FILL
|
| Светлая штриховка сеткой
|
XHATCH_FILL
|
| Крестообразная штриховка
|
INTERLEAVE_FILL
|
| Перекрестная штриховка
|
WIDE_DOT_FILL
|
| Заполнение редкими точками
|
CLOSE_DOT_FILL
|
| Заполнение частыми точками
|
USER_FILL
|
| Шаблон задаётся пользователем
|
void far getfillpattern(char far* pattern);
Функция записывает установленный пользователем шаблон закраски в 8-байтный массив, адрес которого передаётся в качестве параметра.
void far setfillpattern(char far* upattern, int color);
Функция устанавливает пользовательский шаблон закраски. Параметр color определяет цвет закраски. Параметр upattern является указателем на массив типа char длиной 8 элементов, задающих маску закрашивания 8X8 пикселов. Каждый элемент массива отвечает за соответствующую строку, каждый бит элемента массива – за соответствующий пиксел в строке. Если бит равен 1, соответствующий пиксел закрашивается, если 0 – нет.
Пример
char upattern [8]={169, 39, 59, 140, 77, 16, 254, 86};
void far floodfill(int x, int y, int bordercolor);
Функция закрашивает область заданным цветом по заданному шаблону. Параметры x и y – координаты точки области, bordercolor – цвет контура области (границы закрашиваемой области).
void far bar(int left, int top, int right, int bottom);
Функция рисует закрашенный прямоугольник, координаты левой верхней (left, top) и правой нижней (right, bottom) вершин передаются в качестве параметров.
void far bar3d(int left, int top, int right, int bottom, int depth, int topflag);
Функция рисует двухмерную проекцию закрашенного параллелепипеда, координаты левой верхней (left, top) и правой нижней (right, bottom) вершин ближней грани передаются в качестве параметров, параметр depth задаёт размер по оси аппликат, спроецированный на плоскость экрана. Если параметр topflag отличен от 0, то рисуется вся проекция, если равен 0, то не рисуется верхняя грань.
void far fillellipse(int x, int y, int xradius, int yradius);
Функция рисует закрашенный эллипс. Параметры x и y задают центр эллипса.
void far sector(int x, int y, int stangle, int endangle, int xradius, int yradius);
Функция рисует закрашенный эллиптический сектор. Параметры x и y задают центр сектора.
void far fillpoly(int numpoints, int far* polypoints);
Функция рисует закрашенный многоугольник, параметры функции такие же, как и у функции drawpoly().
void far pieslice(int x, int y, int stangle, int endangle, int radius);
Функция рисует закрашенный круговой сектор. Параметры x и y задают центр сектора.
void far outtext(char far* textstring);
void far outtextxy(int x, int y, char far* textstring);
Функции выводят на экран строку текста, адрес которой принимают в качестве параметра textstring. Функция outtext() выводит текст начиная с текущей графической позиции, функция outtextxy() начальную позицию для вывода текста принимает в качестве аргументов x и y.
int far textheight(char far* textstring);
int far textwidth(char far* textstring);
Функции возвращают высоту и ширину выводимой строки текста в пикселах.
Для получения параметров выводимого в графическом режиме текста в файле graphics.h объявлена специальная структура.
struct textsettingstype {
int font;
int direction;
int charsize;
int horiz;
int vert;
};
Поле font определяет тип используемого шрифта и может принимать значения констант специального перечислимого типа, объявленного в файле graphics.h.
enum font_names {
DEFAULT_FONT = 0, /* 8x8 bit mapped font */
TRIPLEX_FONT = 1, /* "Stroked" fonts */
SMALL_FONT = 2,
SANS_SERIF_FONT = 3,
GOTHIC_FONT = 4,
SCRIPT_FONT = 5,
SIMPLEX_FONT = 6,
TRIPLEX_SCR_FONT = 7,
COMPLEX_FONT = 8,
EUROPEAN_FONT = 9,
BOLD_FONT = 10
};
Для использования шрифтов, значения констант которых начинаются с 1, необходимо подгружать данные шрифты из *.chr файлов.
Поле direction определяет направление графического вывода. Для его задания в файле graphics.h объявлены соответствующие макросы, описанные в таблице ниже.
Имя
| Значение
| Направление вывода текста
|
HORIZ_DIR
|
| Слева направо
|
VERT_DIR
|
| Снизу вверх
|
Поле charsize определяет размер одного знакоместа в пикселах. Варианты значений приведены в таблице.
Значение
| Размер знакоместа в пикселах
|
| 8X8
|
| 16X16
|
…
| …
|
| 80X80
|
Поля horiz и vert определяют горизонтальное и вертикальное выравнивание текста соответственно и могут принимать значения констант специального перечислимого типа, объявленного в файле graphics.h.
enum text_just {
LEFT_TEXT = 0,
CENTER_TEXT = 1,
RIGHT_TEXT = 2,
BOTTOM_TEXT = 0,
/* CENTER_TEXT = 1, */
TOP_TEXT = 2
};
Поле
| Константа
| Выравнивание
|
horiz
| LEFT_TEXT
| Слева
|
horiz
| CENTER_TEXT
| Центрированный текст
|
horiz
| RIGHT_TEXT
| Справа
|
vert
| BOTTOM_TEXT
| Снизу
|
vert
| CENTER_TEXT
| Центрированный текст
|
vert
| TOP_TEXT
| Сверху
|
void far gettextsettings(struct textsettingstype far* texttypeinfo);
Функция заполняет структуру, адрес которой передаётся в качестве параметра, текущими параметрами выводимого текста.
void far settextstyle(int font, int direction, int charsize);
Функция устанавливает параметры выводимого текста, назначение параметров аналогично назначению одноимённых полей структуры textsettingstype.
void far settextjustify(int horiz, int vert);
Функция устанавливает параметры выравнивания выводимого текста, назначение параметров аналогично назначению одноимённых полей структуры textsettingstype.
void far setusercharsize(int multx, int divx, int multy, int divy);
Функция устанавливает пользовательский размер шрифта для подгружаемых из файлов шрифтов, параметры функции задают коэффициенты умножения и деления по соответствующим координатам. Исходный размер шрифта по соответствующей координате умножается на число mult/div.
void far graphdefaults(void);
Функция устанавливает значения всех графических параметров в значения по умолчанию.
Во время работы программы могут возникнуть ошибки выполнения.
int far graphresult(void);
Функция возвращает код ошибки выполнения последней графической операции, который может принимать значения констант специального перечислимого типа graphics_errors, объявленного в файле graphics.h.
char* far grapherrormsg(int errorcode);
Функция возвращает текстовую строку с сообщением об ошибке по заданному коду ошибки, который принимает в качестве параметра errorcode. Ниже в таблице приведены константы graphics_errors, их численные значения и соответствующие текстовые сообщения об ошибках.
Код
| Константа
| Тестовая строка
|
| grOk
| No error
|
-1
| grNoInitGraph
| (BGI) graphics not installed
|
-2
| grNotDetected
| Graphics hardware not detected
|
-3
| grFileNotFound
| Device driver file not found ()
|
-4
| grInvalidDriver
| Invalid device driver file ()
|
-5
| grNoLoadMem
| Not enough memory to load driver
|
-6
| grNoScanMem
| Out of memory in scan fill
|
-7
| grNoFloodMem
| Out of memory in flood fill
|
-8
| grFontNotFound
| Font file not found ()
|
-9
| grNoFontMem
| Not enough memory to load font
|
-10
| grInvalidMode
| Invalid graphics mode for selected driver
|
-11
| grError
| Graphics error
|
-12
| grIOerror
| Graphics I/O error
|
-13
| grInvalidFont
| Invalid font file ()
|
-14
| grInvalidFontNum
| Invalid font number
|
-18
| grInvalidVersion
| Invalid File Version Number
|