2851

Работа в графическом режиме видеоадаптера в ОС MS-DOS

Домашняя работа

Информатика, кибернетика и программирование

Работа в графическом режиме видеоадаптера в ОС MS-DOS Функции для работы в графическом режиме определены в стандартном заголовочном файле graphics.h. Так же, как и в текстовом режиме, графические функции оперируют с окнами. При запуске программы исх...

Русский

2012-10-20

131 KB

4 чел.

Работа в графическом режиме видеоадаптера в ОС 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

0

EGA

3

VGA

9

Если задана константа DETECT, то тип видеоадаптера и драйвер определяются автоматически во время выполнения программы. Константы, задающие режимы для данных драйверов, приведены в таблице ниже.

Драйвер и режим

Значение

Разрешение

Палитра

Количество страниц

EGALO

0

640 X 200

16 цветов

4

EGAHI

1

640 X 350

16 цветов

2

VGALO

0

640 X 200

16 цветов

4

VGAMED

1

640 X 350

16 цветов

2

VGAHI

2

640 X 480

16 цветов

1

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)

1

0

0

1

1

0

1

0

0

0

1

0

1

1

1

1

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

0

Заполнение цветом фона

SOLID_FILL

1

Сплошное заданным цветом

LINE_FILL

2

Горизонтальными линиями

LTSLASH_FILL

3

Косыми линиями ///

SLASH_FILL

4

Толстыми косыми линиями

BKSLASH_FILL

5

Толстыми обратными косыми линиями \\\

LTBKSLASH_FILL

6

Обратными косыми линиями

HATCH_FILL

7

Светлая штриховка сеткой

XHATCH_FILL

8

Крестообразная штриховка

INTERLEAVE_FILL

9

Перекрестная штриховка

WIDE_DOT_FILL

10

Заполнение редкими точками

CLOSE_DOT_FILL

11

Заполнение частыми точками

USER_FILL

12

Шаблон задаётся пользователем

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};

A9

1

0

1

0

1

0

0

1

27

0

0

1

0

0

1

1

1

3B

0

0

1

1

1

0

1

1

8C

1

0

0

0

1

1

0

0

4D

0

1

0

0

1

1

0

1

10

0

0

0

1

0

0

0

0

FE

1

1

1

1

1

1

1

0

56

0

1

0

1

0

1

1

0

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

0

Слева направо

VERT_DIR

1

Снизу вверх

Поле charsize определяет размер одного знакоместа в пикселах. Варианты значений приведены в таблице.

Значение

Размер знакоместа в пикселах

1

8X8

2

16X16

10

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, их численные значения и соответствующие текстовые сообщения об ошибках.

Код

Константа

Тестовая строка

0

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


 

А также другие работы, которые могут Вас заинтересовать

62880. Великий Нехочуха, или почему ребенок не делает уроки 15.73 KB
  Рассмотрим основные причины невыполнения домашних заданий: отсутствие желания и мотивации особенно ярко это может проявиться в том случае если ребенок неуспешен в учебе не понимает изученного материала или много пропустил...
62882. Використання відео на уроках англійської мови 28.92 KB
  Останнім часом приділяється велика увага комунікативній підготовці. Мета навчання іноземній мові часто формулюється як навчання спілкуванню на іноземній мові. Опанувати комунікативну компетенцію англійською мовою, не знаходячись в країні мови, що вивчається, справа дуже важка.
62884. Виды работы с задачами на уроках математики 25.54 KB
  Текстовые задачи на уроке математики в начальных классах могут быть использованы для самых разных целей: для подготовки к введению новых понятий в частности арифметических действий; для ознакомления с новыми понятиями свойствами понятий...