Страница 6 из 56
# Видеографический адаптер (VGA)
# Графический адаптер Hercules
# 400-строчный графический адаптер фирмы AT&T
# Графический адаптер 3270 PC
# Графический адаптер IBM 8514
- 43,44 -
Для запуска графической системы вам сначала нужно вызвать
функцию initgraph. Эта функция загружает графический драйвер и
переводит систему в графический режим. Вы можете приказать
initgraph использовать определенный графический драйвер и режим,
или же потребовать автоматического определения подключенного ви-
деоадаптера и загрузки соответствующего драйвера. Если вы требуе-
те от функции initgraph автоопределения, то для определения гра-
фического драйвера и режима она вызывает detectgraph. Если вы
приказываете initgraph использовать определенный графический
драйвер и режим, то вы должны быть уверены в том, что ваша систе-
ма поддерживает этот режим, иначе последствия непредсказуемы.
Загрузив графический драйвер, вы можете получить его имя при
помощи функции getdrivename, а число поддерживаемых им режимов
при помощи функции getmaxmode. Функция getgraphmode сообщит вам о
текущем графическом режиме. Узнав номер режима, вы можете полу-
чить его название при помощи getmodename. Вы можете переключать
графические режимы функцией setgraphmode, а также вернуть видео-
режим в изначальное состояние (то, которое было до инициализации
графики) функцией restorecrtmode. Эта функция возвращает экран в
текстовый режим, но графическую систему не выключает (шрифты и
драйверы остаются в памяти).
graphdefaults устанавливает все графические параметры (раз-
мер графического окна, цвета рисования и закрашивания, шаблоны и
т.д.) в их значения по умолчанию.
Функции installuserdriver и installuserfont позволяют допол-
нять BGI дополнительными драйверами и шрифтами.
И, наконец, когда вы прекращаете использовать графику, вызо-
вите closegraph для выключения графической системы. closegraph
выгрузит из памяти драйвер и восстановит первоначальный видеоре-
жим (при помощи restorecrtmode).
Более подробное обсуждение.
---------------------------
Предыдущее рассмотрение заключало только обзор действия
initgraph. В следующих параграфах мы более подробно опишем пове-
дение initgraph, _graphgetmem и _graphfreemem.
- 45,46 -
Обычно функция initgraph загружает графический драйвер пос-
редством выделения памяти для этого драйвера с последующей заг-
рузкой с диска соответствующего файла .BGI. В качестве альтерна-
тивы этой схеме динамической загрузки вы можете скомпоновать файл
графического драйвера (или несколько файлов) непосредственно с
файлом вашей программы. Для этого, во-первых, вы должны преобра-
зовать файл .BGI в файл .OBJ (с помощью утилититы BGIOBJ), а за-
тем включить в текст вашей программы вызов registerbgidriver (пе-
ред вызовом initgraph) для регистрации этого графического
драйвера. При компоновке программы вы должны будете скомпоновать
файлы .OBJ для всех зарегистрированных драйверов.
После определения (при помощи detectgraph) того, какой драй-
вер должен использоваться, initgraph проверяет, зарегистрирован
ли этот драйвер. Если да, то initgraph использует зарегистриро-
ванный драйвер непосредственно из памяти. В противном случае
initgraph выделяет память для драйвера и загружает с диска файл .
BGI.
Замечание: использование registerbgidriver является углуб-
ленным методом программирования и, поэтому, не рекомендуется для
начинающих программистов. Более детально эта функция описана в
Приложении D Справочного Руководства.
В процессе работы графической системы может понадобиться вы-
делить память для драйверов, шрифтов и внутренних буферов. В слу-
чае необходимости, для распределения памяти система вызывает
_graphgetmem, а для освобождения ее - _graphfreemem. По умолчанию
эти функции просто вызывают malloc и free соответственно.
Вы можете изменить такое поведение графической системы путем
определения собственных функций _graphgetmem и _graphfreemem.
Сделав это, вы сможете сами управлять распределением графической
памяти. Вы должны, однако, использовать такие же имена для своих
версий функций по распределению памяти: они заменяют обычные
функции с теми же именами в стандартных библиотеках Турбо Си.
Замечание. Если вы определили собственную функцию
_graphgetmem или _graphfreemem, то может появиться сообщение
"Warning: duplicate symbols" вследствие того, что функции с таки-
ми же именами находятся в графической библиотеке. Не обращайте
внимания на это сообщение.
- 47,48 -
Рисование и закрашивание
------------------------
Ниже приведено краткое описание рисующих и закрашивающих
функций:
=================================================================
Рисование:
arc вычерчивает круговую дугу
circle вычерчивает окружность
drawpoly вычерчивает многоугольник
ellipse вычерчивает эллиптическую дугу
getarccoords возвращает координаты последнего обращения к
arc или ellipse
getaspectratio возвращает коэффициент сжатия текущего графиче-
ского режима
getlinesettings возвращает текущие стиль, шаблон и толщину ли-
нии
line вычерчивает линию от (x0, y0) до (x1, y1)
linerel вычерчивает линию от текущей позиции (ТП) до
точки на заданном от нее расстоянии
lineto вычерчивает линию от ТП до (x,y)
moveto устанавливает ТП в (x,y)
moverel перемещает ТП на заданное расстояние
rectangle вычерчивает прямоугольник
setaspectratio изменяет коэффициент сжатия
setlinestyle устанавливает текущую толщину и стиль линии
Закрашивание:
bar вычерчивает и закрашивает прямоугольник
bar3d вычерчивает и закрашивает параллелепипед
fillellipse вычерчивает и закрашивает эллипс
fillpoly вычерчивает и закрашивает многоугольник
floodfill "лавинно" заполняет ограниченную область
getfillpattern возвращает описанный пользователем шаблон
закрашивания
getfillsettings возвращает информацию о текущем шаблоне
и цвете закрашивания
pieslice вычерчивает и закрашивает круговой сектор
sector вычерчивает и закрашивает эллиптический сектор
setfillpattern устанавливает заданный пользователем шаблон
закрашивания
setfillstyle устанавливает шаблон и цвет
- 49,50 -
=================================================================
С помощью функций Турбо Си для вычерчивания и раскрашивания
вы можете рисовать цветные линии, дуги, круги, эллипсы, прямоу-
гольники и параллелепипеды, сектора, многоугольники, а также
"правильные" и "неправильные" формы, базирующиеся на комбинациях
вышеперечисленных фигур. Вы можете закрашивать любые ограниченные
формы (или любые области вокруг этих форм) с помощью одного из 11
предопределенных шаблонов, либо с помощью вашего собственного,
вами описанного шаблона. Вы можете также управлять толщиной и
стилем вычерчиваемой линии и месторасположением ТП.
Вы вычерчиваете линии и незакрашенные фигуры с помощью функ-
ций arc, circle, drawpoly, ellipse, line, linerel, lineto и
rectangle. Вы можете закрашивать эти фигуры с помощью floodfill,
или осуществлять вычерчивание и закрашивание за один шаг с по-
мощью bar, bar3d, fillellipse, fillpoly, pieslice или sector.
Используя setlinestyle, вы можете задать, будет ли вычерчи-
ваемая линия (включая линии, ограничивающие фигуры) толстой или
тонкой, а также будет ли эта линия сплошной, точечной или еще ка-
кой в соответствии с заданным вами шаблоном. С помощью
setfillstyle вы можете выбрать предопределенный шаблон закрашива-
ния, а с помощью setfillpattern - описать свой собственный шаб-
лон. С помощью moveto вы можете передвигать текущую позицию в за-
данную точку, а с помощью moverel - на заданное расстояние.
Для определения текущих стиля и толщины линии вы можете об-
ратиться к getlinesettings. Для получения информации о текущих
шаблоне и цвете закрашивания вы можете использовать
getfillsettings. Для получения пользовательского шаблона закраши-
вания используйте getfillpattern.
С помощью getaspectratio вы можете получить коээфициент сжа-
тия (масштабирующий коэффициент, используемый графической систе-
мой для получения правильных окружностей), а с помощью
getarccoords - координаты последней нарисованной дуги или элипса.
Если окружности рисуются с искажениями, используйте
setaspectratio для корректировки изображения.
- 51,52 -