Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сабуров С.В. - Язык программирования C и C++ - 2006

.pdf
Скачиваний:
312
Добавлен:
13.08.2013
Размер:
1.42 Mб
Скачать

Справочник по работе с DOS

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

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

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

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

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

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

217

Справочник по работе с DOS

подпрограммы просто вызывают функции malloc и free, соответственно.

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

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

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

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

Функции черчения

arc

Чертит дугу окружности.

circle

Чертит окружность.

drawpoly

Чертит контур многоугольника.

ellipse

Чертит эллиптическую дугу.

getarccoords

Возвращает координаты последнего вызова arc или ellipse.

getaspectratio

Возвращает коэффициент сжатия для текущего графического режима.

getlinesettings

Возвращает текущий тип линии, шаблон линии и толщину линии.

line

Чертит линию из точки (x0,y0) в (x1,y1).

218

Справочник по работе с DOS

linerel

Чертит линию в точку, задаваемую относительным расстоянием от текущей позиции (CP).

lineto

Чертит линию из текущей позиции (CP) в (x,y).

moveto

Перемещает текущую позицию (CP) в (x,y).

moverel

Перемещает текущую позицию (CP) на относительное расстояние.

rectangle

Рисует прямоугольник.

setaspectratio

Изменяет коэффициент сжатия по умолчанию.

setlinestyle

Устанавливает толщину и тип текущей линии.

Функции закраски

bar

Чертит и закрашивает столбец.

bar3d

Чертит и закрашивает трехмерный столбец.

fillellipse

Чертит и закрашивает эллипс.

fillpoly

Чертит и закрашивает многоугольник.

getfillpattern

Возвращает определяемый пользователем шаблон закраски.

getfillsettings

Возвращает информацию о текущем шаблоне и цвете закраски.

pieslice

Чертит и закрашивает сектор окружности.

219

Справочник по работе с DOS

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.

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

220

Справочник по работе с DOS

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

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

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

Функции работы с экраном

cleardevice

Очищает экран (активную страницу).

setactivepage

Устанавливает активную страницу для графического вывода.

setvisualpage

Устанавливает номер видимой графической страницы.

Функции работы с графическими окнами

clearviewport

Очищает текущее графическое окно.

getviewsettings

Возвращает информацию о текущем графическом окне.

setviewport

Устанавливает текущее графическое окно для направления на него графического вывода.

Функции работы с битовыми образами

getimage

Записывает битовый образ в заданный участок памяти.

imagesize

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

putimage

Помещает на экран ранее записанный в память битовый образ.

221

Справочник по работе с DOS

Функции работы с элементами изображения

getpixel

Получает цвет элемента изображения в (x,y).

putpixel

Помещает элемент изображения на экран в точку (x,y).

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

ит.д.).

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

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

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

222

Справочник по работе с DOS

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

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

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

gettextsettings

Возвращает текущий текстовый шрифт, направление, размер и выравнивание.

outtext

Посылает строку на экран в текущую позицию (CP).

outtextxy

Посылает текст на экран в заданную позицию.

registerbgifont

Регистрирует компонуемый или определяемый пользователем шрифт.

settextjustify

Устанавливает значения выравнивания текста, используемые функциями outtext и outtextxy.

settextstyle

Устанавливает шрифт, тип и коэффициент увеличения текущего текста.

setusercharsize

Устанавливает соотношение между высотой и шириной штриховых шрифтов.

textheight

Возвращает высоту строки в элементах изображения.

textwidth

Возвращает ширину строки в элементах изображения.

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

223

Справочник по работе с DOS

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

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

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

Вграфике текст выводится функциями outtext или outtextxy,

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

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

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

224

Справочник по работе с DOS

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

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

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

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

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

Функции получения информации о цвете

getbcolor

Возвращает текущий цвет фона.

getcolor

Возвращает текущий цвет вычерчивания.

getdefaultpalette

Возвращает структуру определения палитры.

getmaxcolor

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

225

Справочник по работе с DOS

getpalette

Возвращает текущую палитру и ее размер.

getpalettesize

Возвращает размер просмотровой таблицы палитры.

Функции установки одного или более цветов

setallpalette

Изменяет все цвета палитры, как задано.

setbkcolor

Устанавливает текущий цвет фона

setcolor

Устанавливает текущий цвет вычерчивания.

setpalette

Изменяет один из цветов палитры, как указано ее аргументами.

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

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

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

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

226

Соседние файлы в предмете Программирование на C++