Видео-функции
Borland C++ поставляется с полной библиотекой графических
функций, позволяющих создание экранных графиков и диаграмм. Графические функции доступных только для 16-разрядных приложений
DOS. Ниже приведено краткое описание видеорежимов и окон. Затем
объясняется, как программировать в текстовом и графическом режимах.
Видеорежимы
Ваш компьютер обязательно имеет некоторый видеоадаптер. Это
может быть монохромный дисплейный адаптер (MDA) для базового
(только текстового) дисплея, либо это может быть графический
адаптер, например цветной графический адаптер (CGA), улучшенный
графический адаптер (EGA), монохромный графический адаптер Hercules или видеографическая матрица (VGA/SVGA). Каждый из этих адаптеров может работать в нескольких режимах. Режим определяет величину экрана - 80 или 40 символов в строке (только в текстовом режиме), разрешающую способность экрана (только в графическом режиме) и тип дисплея (цветной или черно-белый).
Рабочий режим экрана определяется, когда ваша программа вызывает одну из функций определения режима (textmode, initgraph
или setgraphmode).
- В текстовом режиме экран компьютера разделен на ячейки (80
или 40 столбцов в ширину и 25, 43 или 50 строк по высоте).
Каждая ячейка состоит из атрибута и символа. Символ представляет собой имеющий графическое отображение символ кода
ASCII, а атрибут задает, каким образом данный символ будет
выведен на экран (его цвет, яркость, и т.д.). Borland C++
предоставляет полный набор подпрограмм для манипулирования
текстовым экраном, для вывода текста непосредственно на
экран и управления атрибутами ячеек.
- В графическом режиме экран компьютера делится на элементы
изображения (пикселы); каждый элемент изображения представляет собой отображение на экране одной точки. Число
элементов изображения на экране (т.е. его разрешающая способность) зависит от типа подключенного к вашей системе
видеоадаптера и режима, в который установлен этот адаптер. Для получения на экране графических изображений Borland C++ предоставляет библиотеку графических функций: вы
можете создавать на экране линии и формы, заполненные шаблонами замкнутые области, а также управлять цветом каждого
элемента изображения.
В текстовом режиме позиция верхнего левого угла экрана определяется координатами (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++ обеспечивает графические драйверы для следующих графических адаптеров (и полностью совместимых с ними):
- Цветной/графический адаптер (CGA);
- Многоцветная графическая матрица (MCGA);
- Улучшенный графический адаптер (EGA);
- Видеографическая матрица (VGA);
- Графический адаптер Hercules;
- Графический адаптер серии AT&T 400;
- Графический адаптер 3270 PC;
- Графический адаптер IBM 8514.
Для запуска графической системы вы должны прежде всего вызвать функцию 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 стек находится в отдельном сегменте, и каждый
модуль имеет собственный сегмент данных.
Назад | Содержание | Вперед