Видео-функции

Borland C++ поставляется с полной библиотекой графических функций, позволяющих создание экранных графиков и диаграмм. Графические функции доступных только для 16-разрядных приложений DOS. Ниже приведено краткое описание видеорежимов и окон. Затем объясняется, как программировать в текстовом и графическом режимах.

Видеорежимы

Ваш компьютер обязательно имеет некоторый видеоадаптер. Это может быть монохромный дисплейный адаптер (MDA) для базового (только текстового) дисплея, либо это может быть графический адаптер, например цветной графический адаптер (CGA), улучшенный графический адаптер (EGA), монохромный графический адаптер Hercules или видеографическая матрица (VGA/SVGA). Каждый из этих адаптеров может работать в нескольких режимах. Режим определяет величину экрана - 80 или 40 символов в строке (только в текстовом режиме), разрешающую способность экрана (только в графическом режиме) и тип дисплея (цветной или черно-белый).

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

В текстовом режиме позиция верхнего левого угла экрана определяется координатами (1,1), где x-координата растет слева-направо, а y-координата увеличивается сверху-вниз. В графическом режиме позиция верхнего левого угла определяется координатами (0,0), с теми же направления возрастания координат.

Текстовые и графические окна

Borland C++ обеспечивает функции для создания окон и управления ими в текстовом режиме (и графических окон в графическом режиме). Если вы не знакомы с текстовыми и графическими окнами, ознакомьтесь со следующим кратким их изложением. Функции Borland C++, позволяющие управлять текстовыми и графическими окнами, описаны ниже в разделах "Программирование в текстовом режиме" и "Программирование в графическом режиме".

Окно представляет собой прямоугольную область, определенную на видеоэкране вашего компьютера PC, когда он находится в текстовом режиме. Когда ваша программа выполняет вывод на экран, то область вывода будет в таком случае ограничена активным окном. Остальная часть экрана (вне окна) остается без изменений.

По умолчанию размер окна равен всему экрану. При помощи функции window ваша программа может изменить данное использование по умолчанию полноэкранного текстового окна на текстовое окно, меньшее, чем полный экран. Эта функция задает позицию окна в экранных координатах.

В графическом режиме вы также можете определить некоторую прямоугольную область экрана PC. Эта область называется графическим окном или областью просмотра (viewport). Когда ваша графическая программа выполняет вывод рисунков и т.д., графическое окно действует как виртуальный экран. Остальная часть экрана (вне графического окна) остается без изменений. Определить графическое окно можно через экранные координаты, вызвав функцию setviewport.

За исключением функций определения текстовых и графических окон, все остальные функции, как текстового, так и графического режимов, даются в локальных координатах активного текстового или графического окна, а не в абсолютных экранных координатах. При этом верхний левый угол текстового окна будет представлять собой начало координат (1,1). В графическом режиме начало координат графического окна будет равно (0,0).

Программирование в графическом режиме

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

Borland C++ имеет отдельную библиотеку с более чем 70 графическими функциями, начиная от функций высокого уровня (таких как setviewport, bar3d и drawpoly) и кончая бит-ориентированными функциями (типа getimage и putimage). Графическая библиотека поддерживает многочисленные типы линий и заполнителей, а также предоставляют вам различные текстовые шрифты, которые вы можете изменять по размерам, способу выравнивания, а также ориентировать их либо по горизонтали, либо по вертикали.

Эти функции находятся в библиотечном файле GRAPHICS.LIB, а их прототипы - в файле заголовка graphics.h. Кроме этих двух файлов, в состав графического пакета входят драйверы графических устройств (файлы *.BGI) и символьные шрифты (файлы *.CHR). Эти дополнительные файлы рассматриваются в следующих разделах.

Если вы используете компилятор BCC.EXE, нужно в командной строке указать библиотеку GRAPHICS.LIB. Например, если ваша программа, MYPROG.C, использует графику, то командная строка компилятора BCC должна иметь вид:


              BCC MYPROG GRAPHICS.LIB



При построении программы компоновщик автоматически компонует графическую библиотеку С++.

Поскольку графические функции используют указатели far, графика в случае модели памяти tiny не поддерживается.

Графическая библиотека только одна и не имеет версий по моделям памяти (по сравнению со стандартными библиотеками CS.LIB, CC.LIB, CM.LIB и т.д., которые зависят от используемой модели памяти). Каждая функция в файле GRAPHICS.LIB является far (дальней) функцией, а графические функции, использующие указатели работают с дальними указателями. Для правильной работы графических функций в каждом использующем графические функции модуле требуется директива #include graphics.h.

Функции библиотеки graphics

Графические функции Borland C++ делятся на несколько категорий:

Управление графической системой

Ниже приводится краткое перечисление всех функций управления графической системой:

Функция Описание
closegraph Закрывает графическую систему.
detectgraph Проверяет аппаратное обеспечение и определяет, какие графические драйверы использовать; рекомендует предпочтительный режим.
graphdefaults Сбрасывает все переменные графической системы в значения по умолчанию.
_graphfreemem Отменяет выделенную графике память. Используется для определения собственной подпрограммы.
_graphgetmem Распределяет память графике; используется для определения собственной подпрограммы.
getgraphmode Возвращает текущий графический режим.
getmoderange Возвращает минимальный и максимальный допустимые режимы для заданного драйвера.
initgraph Инициализирует графическую систему и переводит аппаратное обеспечение в графический режим.
installuserdriver Устанавливает дополнительный драйвер устройства в таблице драйверов устройства BGI.
installuserfont Загружает поставляемый файл векторного (штрихового) шрифта в таблицу символьных файлов BGI.
registerbgldriver Регистрирует внешний или загруженный пользователем файл драйвера для включения во время компоновки.
restorecrtmode Восстанавливает первоначальный (существовавший до Initgraph) режим экрана.
setgraphbufsize Задает размер внутреннего графического буфера.
setgraphmode Выбирает заданный графический режим, очищает экран и восстанавливает все умолчания.

Графический пакет компилятора Borland C++ обеспечивает графические драйверы для следующих графических адаптеров (и полностью совместимых с ними):

Для запуска графической системы вы должны прежде всего вызвать функцию initgraph. Функция initgraph загружает графический драйвер и переводит систему в графический режим.

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

После того, как графический драйвер загружен, вы можете определить его имя при помощи функции getdrivename, а число поддерживаемых драйвером режимов - при помощи функции getmaxmode. Функция getgraphmode сообщит вам, в каком графическом режиме вы находитесь в текущий момент. Имея номер режима, вы можете определить его имя при помощи функции getmodename. Вы также имеете возможность изменить графический режим при помощи функции setgraphmode и вернуть исходный видеорежим (тот, который был установлен до инициализации графики) с помощью restorecrtmode. Функция restorecrtmode вернет экран в текстовый режим, но не закроет при этом графическую систему (загруженные шрифты и драйверы останутся в памяти).

Функция graphdefaults сбрасывает установки состояния графической системы (размеры графического окна, цвет линий, цвет и шаблон заполнителя и т.д.) в исходное состояние. Функции installuserdriver и installuserfont позволяют установить в графической системе новые драйверы устройства и шрифты.

И наконец, закончив работу в графике, вы должны вызвать функцию closegraph для того, чтобы закрыть графическую систему. Функция closegraph выгружает драйвер из памяти и восстанавливает первоначальный видеорежим (через обращение к restorecrtmode).

Обычно подпрограмма initgraph загружает графический драйвер, распределяя для этого драйвера память и затем загружая туда с диска соответствующий файл .BGI. В качестве альтернативы данной схеме динамической загрузки вы можете скомпоновать нужный файл графического драйвера (или несколько таких файлов) непосредственно с файлом выполняемой программы. Для этого файл .BGI сначала преобразуется в файл .OBJ (при помощи утилиты BGIOBJ - см. документацию в файле UTIL.DOC, который поставляется на одном из дистрибутивных дисков), после чего в исходный код помещается вызов функции registerbgidriver (до вызова initgraph), чтобы зарегистрировать графический драйвер(ы) в системе. При построении программы вы должны выполнить компоновку файлов .OBJ всех зарегистрированных драйверов.

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

Использование функции registerbgidriver относится к более сложным методам программирования, не рекомендуемым для начинающих программистов.

Во время выполнения графической системе может понадобиться распределить память для драйверов, шрифтов и внутренних буферов. При необходимости она вызывает функцию _graphgetmem для распределения памяти и функцию _graphfreemem для ее освобождения. По умолчанию данные подпрограммы просто вызывают функции malloc и free, соответственно.

Действие этих функций по умолчанию можно переопределить, определив собственные функции _graphgetmem и _graphfreemem. Благодаря этому вы можете сами управлять распределением памяти для графики. Однако, ваши варианты функций управления распределением памяти должны иметь те же имена: они заменят собой используемые по умолчанию функции с теми же именами из стандартных библиотек языка Си.

Определив собственные функции _graphgetmem и _graphfreemem, вы можете получить предупреждение "duplicate symbols" ("повторение символических имен"). Это предупреждение можно игнорировать.

Черчение и заполнение

Ниже приводится краткий обзор функций черчения и закраски:

Функция черчения Описание
arc Чертит дугу окружности.
circle Чертит окружность.
drawpoly Чертит контур многоугольника.
ellipse Чертит эллиптическую дугу.
getarccoords Возвращает координаты последнего вызова arc или ellipse.
getaspectratio Возвращает коэффициент сжатия для текущего графического режима.
getlinesettings Возвращает текущий тип линии, шаблон линии и толщину линии.
line Чертит линию из точки (x0,y0) в (x1,y1).
linerel Чертит линию в точку, задаваемую относительным расстоянием от текущей позиции (CP).
lineto Чертит линию из текущей позиции (CP) в (x,y).
moveto Перемещает текущую позицию (CP) в (x,y).
moverel Перемещает текущую позицию (CP) на относительное расстояние.
rectangle Рисует прямоугольник.
setaspectratio Изменяет коэффициент сжатия по умолчанию.
setlinestyle Устанавливает толщину и тип текущей линии.

Функция закраски Описание
bar Чертит и закрашивает столбец.
bar3d Чертит и закрашивает трехмерный столбец.
fillellipse Чертит и закрашивает эллипс.
fillpoly Чертит и закрашивает многоугольник.
getfillpattern Возвращает определяемый пользователем шаблон закраски.
getfillsettings Возвращает информацию о текущем шаблоне и цвете закраски.
pieslice Чертит и закрашивает сектор окружности.
sector Чертит и закрашивает эллиптический сектор.
setfillpattern Выбирает шаблон закраски, определяемый пользователем.
setfillstyle Устанавливает шаблон и цвет закраски.

При помощи функций черчения и раскрашивания Borland C++ вы можете вычерчивать цветные линии, дуги, окружности, эллипсы, прямоугольники, секторы, дву- и трехмерные столбики, многоугольники, а также различные правильные или неправильные формы, являющиеся комбинациями перечисленных графических примитивов. Ограниченную форму изнутри или снаружи можно заполнить одним из 11 предопределенных шаблонов (образцов заполнителей), либо шаблоном, определенным пользователем. Можно также управлять толщиной и стилем линии вычерчивания, а также местоположением текущей позиции (CP).

Линии и незакрашенные формы вычерчиваются при помощи функций arc, circle, drawpoly, ellipse, line, linerel, lineto и rectangle. Затем можно закрасить эти формы с помощью floodfil, либо можно объединить вычерчивание/закраску в одном шаге при помощи функций bar, bar3d, fillellipse, fillpoly, pieslice и sector. Функция setlinestyle позволяет задать тип линий (и граничных линий форм): толстая или тонкая, сплошная, пунктир и т.д., либо для вычерчивания линии можно задать ваш собственный шаблон. При помощи функции setfillstyle можно выбрать предопределенный шаблон заполнения, либо определить собственный шаблон заполнения в setfillpattern. Функция moveto позволяет переместить CP в желаемую позицию, а функция moverel позволяет сдвинуть ее на желаемую величину смещения.

Выяснить текущий тип и толщину линии позволяет функция getlinesettings. Информацию о текущем шаблоне заполнения и цвете заполнителя можно получить через функцию getfillsettings. Определяемый пользователем шаблон заполнения можно получить при помощи функции getfillpattern.

Получить сведения о коэффициенте относительного удлинения (коэффициенте масштабирования, применяемом графической системой для того, чтобы окружности выглядели круглыми) позволяет функция getaspectratio, а получить координаты последней нарисованной дуги или эллипса - функция getarccoords. Если окружности не получаются идеально круглыми, можно исправить дело при помощи функции setaspectratio.

Манипулирование экраном и графическими окнами

Ниже приводится краткий обзор функций манипулирования с экраном, графическими окнами, битовыми образами и элементами изображения:

Функции работы с экраном Описание
cleardevice Очищает экран (активную страницу).
setactivepage Устанавливает активную страницу для графического вывода.
setvisualpage Устанавливает номер видимой графической страницы.

Функции работы с графическими окнами Описание
clearviewport Очищает текущее графическое окно.
getviewsettings Возвращает информацию о текущем графическом окне.
setviewport Устанавливает текущее графическое окно для направления на него графического вывода.

Функции работы с битовыми образами Описание
getimage Записывает битовый образ в заданный участок памяти.
imagesize Возвращает число байт, требуемых для хранения некоторой прямоугольной области экрана.
putimage Помещает на экран ранее записанный в память битовый образ.

Функции работы с элементами изображения Описание
getpixel Получает цвет элемента изображения в (x,y).
putpixel Помещает элемент изображения на экран в точку (x,y).

Помимо черчения и закрашивания, графическая библиотека предлагает несколько функций для манипулирования экраном, графическими окнами, образами и указателями. Вызвав функцию cleardevice, можно сразу очистить весь экран. Данная подпрограмма стирает экран и помещает текущую позицию в графическое окно, но при этом оставляет действующими все прочие установки графической системы (типы линии, заполнения и текста; раскраска, установки графического окна и т.д.).

В зависимости от имеющегося у вас графического адаптера, ваша система может иметь от одного до четырех буферов экранных страниц, представляющих собой области памяти, где хранится информация по точкам о конкретных полноэкранных образах. При помощи функций setactivepage и setvisualpage, соответственно, вы можете указать активную страницу экрана (т.е. куда будет направлен вывод графических функций), и визуальную (отображаемую) страницу экрана (т.е. страницу, находящуюся в текущий момент на дисплее).

Когда ваш экран находится в графическом режиме, с помощью функции setviewport вы можете определить графическое окно (или прямоугольное "виртуальное окно") на экране. Позиция графического окна задается в абсолютных экранных координатах. Кроме того, задается активное или неактивное состояние функции "отсечения". Очистка графического окна выполняется при помощи функции clearviewport. Для того, чтобы получить абсолютные экранные координаты и состояние "отсечения", следует воспользоваться функцией getviewsettings.

Можно взять часть экранного образа при помощи функции getimage, вызвать imagesize для вычисления числа байт для хранения этого образа в памяти, а затем вернуть образ на экран (в любую желаемую позицию) с помощью функции putimage. Координаты всех функций вывода (черчения, заполнения, тексты и т.д.) зависят от выбранного графического окна.

Благодаря функциям getpixel (возвращающей цвет данного элемента изображения) и putpixel (которая отображает данный элемент изображения на экране заданным цветом) можно также манипулировать цветом отдельных элементов изображения.

Текстовый вывод в графическом режиме

Ниже приводится краткое описание функций текстового вывода в графическом режиме:

Функция Описание
gettextsettings Возвращает текущий текстовый шрифт, направление, размер и выравнивание.
outtext Посылает строку на экран в текущую позицию (CP).
outtextxy Посылает текст на экран в заданную позицию.
registerbgifont Регистрирует компонуемый или определяемый пользователем шрифт.
settextjustify Устанавливает значения выравнивания текста, используемые функциями outtext и outtextxy.
settextstyle Устанавливает шрифт, тип и коэффициент увеличения текущего текста.
setusercharsize Устанавливает соотношение между высотой и шириной штриховых шрифтов.
textheight Возвращает высоту строки в элементах изображения.
textwidth Возвращает ширину строки в элементах изображения.

Графическая библиотека включает в себя матричный шрифт 8х8 и несколько векторных шрифтов для вывода текста в графическом режиме.

Преимущество использования векторных шрифтов становится очевидным, когда вы начинаете рисовать большие по размеру символы. Поскольку векторный шрифт определяется как последовательность векторов, при увеличении размера он сохранит хорошее разрешение и качество изображения. И напротив, когда вы увеличиваете битовый матричный шрифт, матрица умножается на соответствующий коэффициент масштабирования. Чем больше этот коэффициент, тем хуже становится разрешение символов. Для малых размеров такой вид шрифта вполне удовлетворителен, однако для больших размеров вам лучше выбрать векторный шрифт.

В графике текст выводится функциями outtext или outtextxy, а управление его выравниванием (относительно текущей позиции) выполняет функция settextjustify. При помощи функции settextstyle вы должны выбрать символьный шрифт, направление его размещения (горизонтальное или вертикальное) и размер (масштаб). Узнать текущие установки вывода текстов можно при помощи функции gettextsettings, которая возвращает текущий текстовый шрифт, выравнивание, увеличение и направление в структуре textsettings. Функция setusercharsize позволяет модифицировать ширину и высоту векторных шрифтов.

Если средство отсечения изображения включено, то выводимые функциями outtext и outtextxy текстовые строки будут отсекаться по границам графического окна. Если отсечение отключено, то тексты с матричным шрифтом, символы которых не помещаются целиком в окне, отбрасываются полностью. В случае же векторных шрифтов не поместившиеся тексты просто отсекаются по границе окна.

Для того, чтобы определить экранный размер данной текстовой строки, вызовите функцию textheight (которая измеряет высоту текста в элементах изображения) и textwidth (измеряющую его ширину в элементах изображения).

По умолчанию битовый матричный шрифт 8х8 встроен в графический пакет и поэтому всегда доступен во время выполнения. Векторные шрифты все хранятся в отдельных файлах .CHR. Они могут загружаться во время выполнения или преобразовываться в файлы .OBJ (при помощи утилиты BGIOBJ) и затем компоноваться с вашим файлом .EXE.

Обычно подпрограмма settextstyle загружает файл шрифта, распределяя память для него и затем загружая с диска соответствующий .CHR-файл. В качестве альтернативы данной схеме динамической загрузки вы можете скомпоновать файл шрифта (или несколько таких файлов) непосредственно с выполняемым файлом программы. Для этого сначала требуется преобразовать файл .CHR в файл .OBJ (с помощью утилиты BGIOBJ - прочтите об этом в файле документации UTIL.DOC, который находится на дистрибутивном диске), а затем поместить в исходную программу вызовы registerbgifont (перед вызовом функции settextstyle) для того, чтобы зарегистрировать данный символьный шрифт(ы). При построении программы для всех зарегистрированных вами векторных шрифтов необходимо скомпоновать полученные файлы .OBJ.

Использование функции registerbgifont относится к сложным методам программирования и не рекомендуется начинающим программистам. Более подробно эта функция описана в файле UTIL.DOC, который находится на дистрибутивном диске.

Управление цветом

Ниже приводится краткое описание функций для управления цветом изображений:

Функции получения информации о цвете Описание
getbcolor Возвращает текущий цвет фона.
getcolor Возвращает текущий цвет вычерчивания.
getdefaultpalette Возвращает структуру определения палитры.
getmaxcolor Возвращает максимальное значение цвета доступное в текущем графическом режиме.
getpalette Возвращает текущую палитру и ее размер.
getpalettesize Возвращает размер просмотровой таблицы палитры.

Функции установки одного или более цветов Описание
setallpalette Изменяет все цвета палитры, как задано.
setbkcolor Устанавливает текущий цвет фона
setcolor Устанавливает текущий цвет вычерчивания.
setpalette Изменяет один из цветов палитры, как указано ее аргументами.

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

Элементы изображения и палитры

Графический экран представляет собой массив элементов изображения. Каждый элемент изображения соответствует одной (цветной) точке на экране. Значение элемента изображения не задает точный цвет этой точки напрямую; на самом деле это некоторый индекс таблицы цветов, называемой палитрой. Каждый элемент палитры, соответствующий данному значению элемента изображения, содержит точную информацию о цвете, которым будет отображен этот элемент изображения.

Такая схема косвенных обращений имеет множество следствий. Хотя аппаратное обеспечение может позволять отображение множества цветов, одновременно на экране может находиться только некоторое их подмножество. Количество одновременно находящихся на экране цветов равно числу элементов палитры (размеру палитры). Например, EGA позволяет наличие 64 цветов, но лишь 16 из них может находиться на экране сразу; таким образом, размер палитры EGA равен 16.

Размер палитры определяет диапазон значений, которые может принимать элемент изображения, от 0 до (размер-1). Функция getmaxcolor возвращает максимальное допустимое значение элемента изображения (размер-1) для текущего графического драйвера и режима.

При обсуждении графических функций Borland C++ мы часто используем термин "цвет", например текущий цвет вычерчивания, цвет заполнения и цвет элемента изображения. Фактически цветом мы здесь называем значение элемента изображения: это некоторый индекс в палитре. Только палитра реально определяет фактический цвет на экране. Манипулируя палитрой, вы можете изменять фактические цвета, выводимые на дисплей, даже хотя значения элементов изображения (цвета вычерчивания, заполнения и т.д.) могут не изменяться.

Цвет фона и вычерчивания

Цвет фона всегда соответствует значению элемента изображения 0. Когда выполняется очистка области экрана в цвет фона, это означает просто установку всех элементов изображения этой области в значение 0.

Цветом вычерчивания (цветом переднего плана) называется значение, в которое устанавливаются элементы изображения при вычерчивании линий. Цвет вычерчивания устанавливается функцией setcolor(n), где n есть допустимое для текущей палитры значение элемента изображения

Управление цветом на CGA

Из-за различий в графическом аппаратном обеспечении фактическое управление цветами различно для CGA и EGA, что заставляет нас рассмотреть их по отдельности. Управление цветом для драйвера AT&T, а также режимы низкой разрешающей способности драйвера MCGA аналогичны управлению цветом CGA.

В случае адаптера CGA вы можете выбрать либо режим низкой разрешающей способности (320х200), который допускает использование четырех цветов, либо режим высокой разрешающей способностей (640х200), где допускается использование двух цветов.

CGA в режиме низкой разрешающей способности

В режиме низкой разрешающей способности вы имеете возможность выбрать одну из четырех четырехцветных палитр. В каждой из этих четырех палитр вы можете сами установить только первый (цвет 0) элемент; цвета 1, 2 и 3 являются фиксированными. Первый элемент палитры (цвет 0) - это цвет фона. Этот цвет может являться одним из 16 имеющихся цветов (см. таблицу цветов фона, приводимую ниже).

Вы выбираете желаемую палитру, выбирая соответствующий режим (CGAC0, CGAC1, CGAC2, CGAC3); эти режимы используют палитры цветов от 0 до 3, соответственно, как показано в следующей таблице. Цвета вычерчивания в CGA и эквивалентные им константы определяются в graphics.h.

Константа, присвоенная номеру цвета (значению эл. изображения)

Номер палитры 1 2 3
0 CGA_LIGHTGREEN CGA_LIGHTRED CGA_YELLOW
1 CGA_LIGHTCYAN CGA_LIGHTMAGENTA CGA_WHITE
2 CGA_GREEN CGA_RED CGA_BROWN
3 CGA_CYAN CGA_MAGENTA CGA_LIGHTGRAY

Для того, чтобы назначить один из этих цветов цветом вычерчивания CGA, нужно вызвать функцию setcolor, задав в ней в качестве аргумента либо номер цвета, либо имя соответствующей константы; например, если вы используете палитру 3 и желаете назначить цветом вычерчивания cyan, то можно записать:


            setcolor(1);



       или



            setcolor(CGA_CYAN);





В следующей таблице перечислены назначаемые для CGA цвета фона:

Числовое значение Символическое имя Числовое значение Символическое имя
0 BLACK 8 DARKGRAY
1 BLUE 9 LIGHTBLUE
2 GREEN 10 LIGHTGREEN
3 CYAN 11 LIGTHCYAN
4 RED 12 LIGHTRED
5 MAGENTA 13 LIGHTMAGENTA
6 BROWN 14 YELLOW
7 LIGHTGRAY 15 WHITE

Цвета CGA для переднего плана те же, что находятся в данной таблице. Для назначения одного из этих цветов в качестве фонового цвета служит функция setbkcolor(цвет), где цвет - это один из элементов приведенной выше таблицы. Отметим, что для CGA цвет не является значением элемента изображения (индексом в палитре). Он прямо задает фактический цвет, помещаемый в первый элемент палитры.

CGA в режиме высокой разрешающей способности

В режиме высокой разрешающей способности (640x200) CGA работает с двумя цветами - черным цветом фона и цветным передним планом. Элементы изображения могут принимать при этом значения только 0 или 1. В связи с особенностями CGA цветом переднего плана фактически является тот цвет, который аппаратное обеспечение считает цветом фона. Таким образом, цвет переднего плана устанавливается подпрограммой setbkcolor.

Цвет для переднего плана может быть выбран из предыдущей таблицы. CGA далее будет использовать этот цвет для отображения им всех элементов изображения, имеющих значение 1.

Режимы CGAHI, MCGAMED, MCGAHI, ATT400MED и ATT400HI работают аналогичным образом.

Подпрограммы управления палитрой в случае CGA

Поскольку палитра CGA является предопределенной, подпрограмму setallpalette использовать в данном случае нельзя. Также не следует использовать setpalette(индекс, фактический_цвет), за исключением индекс=0. (Это альтернативный способ установки фонового цвета CGA равным фактическому цвету)

Управление цветом для EGA и VGA

В случае EGA палитра содержит 16 элементов из общего количества 64 возможных цветов, причем каждый из элементов палитры может быть задан пользователем. Доступ к текущей палитре выполняется через функцию getpalette, которая заполняет структуру, включающую в себя размер палитры (16) и массив фактических элементов палитры ("аппаратные номера цветов", хранимые в палитре). Элементы палитры можно изменять как по отдельности при помощи setpalette, либо все сразу через функцию setallpalette.

Палитра EGA по умолчанию соответствует 16 цветам CGA, которые были даны в предыдущей таблице цветов: черный равен элементу 0, голубой равен элементу 1, ... , белый равен элементу 15. В graphics.h определены константы, которые содержат соответствующие цветам аппаратные значения: это EGA_BLACK, EGA_WHITE и т.д. Эти значения могут быть также получены через функцию getpalette.

Подпрограмма setbkcolor(цвет) на EGA работает несколько иначе, чем на CGA. На EGA setbkcolor копирует фактическое значение цвета, хранящееся в элементе #цвет, в элемент #0.

Что касается цветов, то драйвер VGA работает фактически так же, как и драйвер EGA; он просто имеет более высокое разрешение (и меньшие по размеру элементы изображения)

Обработка ошибок в графическом режиме

Ниже приведены функции обработки ошибок в графическом режиме:

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

Если ошибка произошла при вызове графической библиотечной функции (например, не найден шрифт, запрошенный функцией settextstyle), устанавливается внутренний код ошибки. Доступ к коду ошибки для последней графической операции, сообщившей об ошибке, выполняется при помощи функции graphresult. Вызов grapherrormsg(graphresult()) возвращает строку сообщения об ошибке из приведенной выше таблицы.

Код возврата ошибки накапливается, изменяясь только когда графическая функция сообщает об ошибке. Код возврата ошибки сбрасывается в 0 только при успешном выполнении initgraph, либо при вызове функции graphresult. Таким образом, если вы хотите знать, какая графическая функция возвратила ошибку, нужно хранить значение graphresult во временной переменной и затем проверять ее.

Код ошибки Константа графической ошибки Соответствующая строка с сообщением об ошибке
0 grOk No error (нет ошибки)
-1 grNoInitGraph (BGI) graphics not installed (use initgraph) (графика не инсталлирована используйте функцию initgraph)
-2 grNotDetected Graphics hardware not detecte (графическое аппаратное обеспечение не обнаружено)
-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 selеcted 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 (неверный номер устройства)
-18 grInvalidVersion Invalid version of file (неправильная версия файла)

Функции запроса состояния

Ниже приводится краткое изложение функций запроса состояния графического режима:

Функции запроса состояния графического режима

Функция Возвращаемое значение
getarccoords Возвращает информацию о координатах, заданных в последнем вызове arc или ellipse.
getaspectratio Возвращает коэффициент сжатия для графического экрана.
getbkcolor Возвращает текущий цвет фона.
getcolor Возвращает текущий цвет вычерчивания.
getdrivername Возвращает имя текущего графического драйвера.
getfillpattern Возвращает шаблон заполнения, определяемый пользователем.
getfillsettings Возвращает информацию о текущем шаблоне и цвете заполнения.
getgraphmode Возвращает текущий графический режим.
getlinesettings Возвращает текущие стиль, шаблон и толщину линии.
getmaxcolor Возвращает максимально допустимое на текущий момент значение элемента изображения.
getmaxmode Возвращает максимально допустимый номер режима для текущего драйвера.
getmaxx Возвращает текущее разрешение по оси x.
getmaxy Возвращает текущее разрешение по оси y.
getmodename Возвращает имя данного режима драйвера.
getmoderange Возвращает диапазон режимов для данного драйвера.
getpalette Возвращает текущую палитру и ее размер.
getpixel Возвращает цвет элемента изображения в (x,y).
gettextsettings Возвращает текущий шрифт, направление, размер и способ выравнивания текста.
getviewsettings Возвращает информацию о текущем графическом окне.
getx Возвращает координату x текущей позиции (CP).
gety Возвращает координату y текущей позиции (CP).

В каждой из категорий графических функций Borland C++ имеется хотя бы одна функция запроса состояния. Эти функции упоминались при рассмотрении соответствующих категорий и также рассматриваются здесь отдельно. Каждая из графических функций запроса состояния Borland C++ имеет имя вида "get что-то" (за исключением категории функций обработки ошибок). Некоторые из них не воспринимают никаких аргументов и возвращают единственное значение, представляющее собой искомую информацию. Прочие считывают указатель структуры, определяемой в файле graphics.h, заполняют эту структуру соответствующей информацией и не возвращают никаких значений.

Функциями запроса состояния категории управления графической системы являются getgraphmode, getmaxmode и getmoderange. Первая из них возвращает целое число, определяющее текущий графический драйвер и режим, вторая возвращает максимальный номер режима для этого драйвера, а третья возвращает диапазон режимов, поддерживаемых данным графическим драйвером. getmaxx и getmaxy возвращают соответственно максимальные экранные координаты x и y для текущего графического режима.

Функциями запроса состояния категории вычерчивания и заполнения являются функции getarccoords, getaspectratio, getfillpattern и getlinesettings. Функция getarccoords заполняет структуру, содержащую координаты, которые использовались при последнем вызове функций arc или ellipse. Функция getaspectratio сообщает текущий коэффициент сжатия, используемый графической системой для того, чтобы окружности выглядели круглыми. Функция getfillpattern возвращает текущий определяемый пользователем шаблон заполнения. Функция getfillsettings заполняет некоторую структуру текущим шаблоном и цветом заполнения. Функция getlinesettings заполняет структуру текущим стилем линии (сплошная, пунктир и т.д.), толщиной (обычная или увеличенная), а также шаблоном линии.

Функциями запроса состояния категории манипулирования графическим окном являются getviewsettings, getx, gety и getpixel. После того, как графическое окно определено, вы можете найти его абсолютные экранные координаты и выяснить состояние режима отсечения, вызвав getwiewsettings, которая заполняет соответствующей информацией некоторую структуру. Функции getx и gety возвращают (относительно графического окна) x- и y-координаты текущей позиции (CP). Функция getpixel возвращает цвет указанного элемента изображения.

Функция запроса состояния категории вывода текста в графическом режиме имеется только одна, и притом всеобъемлющая, - gettextsettings. Эта функция заполняет структуру информацией о текущем символьном шрифте, направлении вывода текста (по горизонтали или по вертикали), коэффициенте увеличения символов, а также виде выравнивания (как для горизонтально, так и для вертикально-ориентированных текстов).

Функциями запроса состоянии категории управления цветом Borland С++ являются функция getbkcolor, возвращающая текущий цвет фона, функция getcolor, возвращающая текущий цвет вычерчивания и функция getpalette, заполняющая структуру, которая включает в себя размер текущей палитры и ее содержимое. Функция getmaxcolor возвращает максимально допустимое значение элемента изображения для текущего графического драйвера и режима (размер палитры -1).

И наконец, функции getmodename и getdrivername возвращают имя заданного режима драйвера и имя текущего графического драйвера, соответственно.

Библиотеки DOS

Ниже представлен краткий обзор библиотечных программ Borland С++, доступных только для 16-разрядных приложений DOS. Библиотечные подпрограммы состоят из функций и макрокоманд, которые можно вызывать в программах Си и С++ для выполнения различных задач, включая ввод-вывод различного уровня, работу со строками и файлами, распределение памяти, управление процессом, преобразование данных, математические вычисления и др.

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

Библиотеки исполняющей системы

В приложениях DOS используются статические библиотеки исполняющей системы (OBJ и LIB). Эти приложения описаны в данном разделе. Дополнительные библиотеки вы найдете в справочнике по библиотекам.

Существует несколько версий библиотеки исполняющей системы. Это версии для конкретных моделей памяти и диагностические библиотеки. Имеются также дополнительные библиотеки, обеспечивающие контейнеры, графику и математические операции. При выборе используемых библиотек исполняющей системы следует иметь в виду что перечисленные ниже библиотеки используются только в 16-разрядных приложениях DOS. Об обработке исключительных ситуаций рассказывается выше.

Библиотеки поддержки DOS

Статические (OBJ и LIB) 16-разрядные библиотеки исполняющей системы Borland С++ после установки записываются в подкаталог LIB. Для каждого из имен этих библиотек символ '?' представляет одну и 6 поддерживаемых Borland моделей памяти. Каждая модель имеет собственный библиотечный файл и файл поддержки математических операций с версиями подпрограмм, написанных для конкретной модели.

В следующей таблице перечислены имена библиотек Borland С++, которые доступны только для 16-разрядных приложений DOS.

Имя файла Использование
BIDSH.LIB Библиотеки классов Borland модели памяти huge.
BIDSDBH.LIB Диагностическая версия той же библиотеки.
C?.LIB Библиотеки DOS.
C0F.OBJ MS-совместимые библиотеки запуска.
C0?.OBJ Библиотеки запуска BC.
EMU.LIB Эмуляция операций с плавающей точкой.
FP87.LIB Для программ, работающих на машинах с сопроцессором 80х87.
GRAPHICS.LIB Графический интерфейс Borland.
MATH?.LIB Математические подпрограммы.
OVERLAY.LIB Разработка оверлеев.

Графические подпрограммы

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

arc (graphics.h) fillellipse (graphics.h)
bar (graphics.h) fillpoly (graphics.h)
bar3d (graphics.h) floofill (graphics.h)
circle (graphics.h) getarccoords (graphics.h)
cleardevice (graphics.h) getaspectratio (graphics.h)
clearviewport (graphics.h) getbkcolor (graphics.h)
closgraph (graphics.h) getcolor (graphics.h)
detectgraph (graphics.h) getdefaultpallette(graphics.h)
drawpoly (graphics.h) getdrivername (graphics.h)
ellipse (graphics.h) getfillpattern (graphics.h)
getfillsettings (graphics.h) outtext (graphics.h)
getgraphmode (graphics.h) outtextxy (graphics.h)
getimage (graphics.h) pieslice (graphics.h)
getfinesettings (graphics.h) pufimage (graphics.h)
getmaxcolor (graphics.h) pulpixel (graphics.h)
getmaxmode (graphics.h) rectangle (graphics.h)
getmaxx (graphics.h) registerbgidriver (graphics.h)
getmaxy (graphics.h) registerbgifont (graphics.h)
getmodename (graphics.h) restorecrtmode (graphics.h)
getmoderange (graphics.h) sector (graphics.h)
getpalette (graphics.h) settaffpalette (graphics.h)
getpixel (graphics.h) setaspectratio (graphics.h)
gettextsettings (graphics.h) setbkcolor (graphics.h)
getviewsettings (graphics.h) setcolor (graphics.h)
getx (graphics.h) setcursortype (conio.h)
gety (graphics.h) setfillpattern (graphics.h)
graphdefaults (graphics.h) setfillstyle (graphics.h)
grapherrormsg (graphics.h) setgraphbufsize (graphics.h)
_graphfreemem (graphics.h) setgraphmode (graphics.h)
_graphgetmem (graphics.h) setlinestyle (graphics.h)
graphresult (graphics.h) setpalette (graphics.h)
imagesize (graphics.h) setrgbpalette (graphics.h)
initgraph (graphics.h) settextjunistify (graphics.h)
installuserdriver(graphics.h) settexttyle (graphics.h)
installuserfont (graphics.h) setusercharsize (graphics.h)
line (graphics.h) setviewport (graphics.h)
linerel (graphics.h) setvisualpage (graphics.h)
lineto (graphics.h) setwritemode (graphics.h)
moverei (graphics.h) textheight (graphics.h)
moveto (graphics.h) textwidth (graphics.h)

Интерфейсные подпрограммы

Следующие подпрограммы реализуют обращения к средствам DOS, BIOS и специфическым средствам данного компьютера.

absread (dos.h) _dos_freemem (dos.h)
abswrite (dos.h) freemem (dos.h)
bioscom (bios.h) _harderr (dos.h)
_bios_disk (bios.h) harderr (dos.h)
biosdisk (bios.h) _hardresume (dos.h)
_bios_keybrd (bios.h) hardresume (dos.h)
bioskey (bios.h) _hardretn (dos.h)
biosprint (dos.h) hardretn (dos.h)
_bios_printer (dos.h) keep (dos.h)
_bios_serialcom (dos.h) randbrd (dos.h)
_dos_keep (dos.h) randbwr (dos.h)

Подпрограммы управления памятью

Эти подпрограммы обеспечивают динамическое распределение памяти для моделей данных small и large.

allocmem (dos.h) coreleft (alloc.h, stdlib.h)
_dos_freemem (alloc.h, stdlib.h) _dos_allocmem (dos.h)
brk (alloc.h) farheapchecknode (alloc.h)
_dos_setblock (dos.h) farheapfree (alloc.h)
farcoreleft (alloc.h) farheapwalk (alloc.h)
farheapcheck (alloc.h) farrealloc (alloc.h)
farheapcheckfree (alloc.h) sbrk (alloc.h)

Разные подпрограммы

Эти подпрограммы предоставляют задержку времени, различные звуковые эффекты и локальные эффекты.

delay (dos.h) sound (dos.h)
nosound (dos.h)

Глобальные переменные DOS

В данном разделе представлены глобальные переменные Borland С++, доступные только для 16-разрядных приложений DOS.

_heaplen (dos.h)

Эта переменная содержит длину ближней динамически распределяемой области памяти в малых моделях данных (tinu. small, medium) и описывается следующим образом:


            extern unsigned _heaplen;





В моделях small и medium размер сегмента данных вычисляется следующим образом:


            сегмент данных [small,medium] = глобальные данные +



              динамически распределяемая область + стек





где размер стека можно настроить с помощью _stklen.

Если _heaplen установлена в 0 (по умолчанию), то программа выделяет для сегмента данных 64К, и размером динамически распределяемой области будет:


            64K - (глобальные данных + стек)





В модели tiny все (включая код) находится в одном и том же сегменте, поэтому размер сегмента данных вычисляется следующим образом (с учетом 256 байт для PSP):


            сегмент данных [tiny] = 256 + глобальные данные +



              динамически распределяемая область + стек





Если в модели tiny _heaplen = 0, то фактический размер динамически распределяемой области вычисляется вычитанием из 64К PSP, кода, глобальных данных и стека.

В моделях compact и large ближней динамически распределяемой области нет, и стек имеет собственный сегмент, поэтому сегмент данных вычисляется так:


            сегмент данных [compact, large] = глобальные данные





В модели huge стек находится в отдельном сегменте, и каждый модуль имеет собственный сегмент данных.

_ovrbuffer (dos.h)

Данная переменная изменяет размер оверлейного буфера и имеет следующий синтаксис:


            unsigned _ovrbuffer = size;





Используемый по умолчанию размер оверлейного буфера равен удвоенному размеру наибольшего оверлея. Для большинства приложений этого достаточно. Однако конкретная функция программы может реализовываться через несколько модулей, каждый из которых является оверлейным. Если общий размер этих модулей больше оверлейного буфера, то при частом вызове модулями друг друга будет происходить дополнительный свопинг.

Решением здесь будет увеличения размера оверлейного буфера, так что в каждый момент времени памяти будет достаточно, чтобы вместить все оверлеи с частыми перекрестными вызовами. Сделать это можно с помощью установки в требуемый размер (в параграфах) глобальной переменной _ovrbuffer в 128К:


            unsigned _ovrbuffer = 0x2000;





Для определения оптимального размера оверлейного буфера общего метода не существует.

_stklen (dos.h)

Данная переменная содержит размер стека и имеет следующий синтаксис:


            extern unsigned _stklen;





Переменная _stklen определяет размер стека для 6 моделей памяти. Минимально допустимый размер стека - 128 слов. По умолчанию назначается размер 4К.

В моделях данных small и medium сегмент данных вычисляется следующим образом:


            сегмент данных [small, medium] = глобальные данных +



              динамически распределяемая область + стек





где размер динамически распределяемой области можно настроить с помощью _heaplen.

В модели tiny все (включая код) находится в одном и том же сегменте, поэтому размер сегмента данных вычисляется следующим образом (с учетом 256 байт для PSP):


            сегмент данных [tiny] = 256 + глобальные данные +



              динамически распределяемая область + стек





В моделях compact и large ближней динамически распределяемой области нет, и стек имеет собственный сегмент, поэтому сегмент данных вычисляется так:


            сегмент данных [compact, large] = глобальные данные





В модели huge стек находится в отдельном сегменте, и каждый модуль имеет собственный сегмент данных.

Назад | Содержание | Вперед