|
Новости |
Глава 15. Использование графического интерфейса Borland·
Драйверы ·
Поддержка
устройства IBM 8514 ·
Текст ·
Графические
изображения и их виды ·
Области
просмотра и двоичные образы ·
Программы
управления динамически распределяемой
памятью ·
Константы,
типы и переменные модуля Graph Модуль
Graph реализует полную библиотеку из более
чем 50 графических программ - от вызовов
процедур и функций высокого уровня, как,
например, SetViewPort, Bаr3D, DrаwPoly, до программ,
ориентированных на работу с битами, таких,
как GetImage или РutImage. Поддерживается
несколько видов закрашивания и типов линий,
и имеется несколько шрифтов, которые можно
изменять по величине, выравнивать и
ориентировать горизонтально или
вертикально. Для
компиляции программы, использующей модуль
Grаph, вам не потребуется никаких внешних
файлов (кроме, конечно, исходного текста
вашей программы, компилятора и доступа к
стандартным модулям в библиотеке
исполняющей системы). Имена
библиотек и модуля Graph
Таблица 15.1
Для
запуска программы, использующей модуль Grарh,
кроме вашей программы с расширением .EXE
вам потребуются один или более
графических драйверов (см. далее файлы .BGI).
Кроме того вам потребуется также один или
более файлов шрифтов (.CНR), если в вашей
программе используются какие-либо шрифты. Примечание:
В соответствии с лицензионными условиями
вы можете распространять файлы .CHR и .BGI
наряду со своими программами. ДрайверыДля
перечисленных ниже графических адаптеров
и полностью совместимых с ними
предусмотрены следующие графические
драйверы: CGA
Неrcules МСGA
AT&T 400 EGA
3270 PC VGA
IBM 8514 Каждый
драйвер содержит выполняемый код и данные
и хранится в отдельном файле на диске. Во
время работы процедура InitGraph
идентифицирует графическую аппаратуру и
производит загрузку и инициализацию
соответствующего графического драйвера,
переводит систему в графический режим, а
затем возвращает управление вызывающей
программе. Процедура CloseGraph выгружает
драйвер из памяти и восстанавливает
предыдущий видеорежим. С помощью программ
RеstoreCrtMode и SetGraphMode вы можете переключаться
между текстовым и графическим режимом. См.
Главу 1 в "Справочном руководстве
программиста". Модуль Grаph может также работать на компьютерах с двумя мониторами. При инициализации модуля Graph с помощью процедуры InitGraph для графического драйвера и требуемого режима будет выбран нужный монитор. При завершении работы графической программы предыдущий видеорежим будет восстановлен. Если для графической аппаратуры с двумя мониторами требуется автоматическое распознавание, то процедура InitGraph выберет монитор и графическую плату, при которой будет получаться наилучшее качество выводимой графической информации.
Таблица 15.2
Поддержка устройства IBM 8514Borland
Pascal поддерживает графическую плату IBM 8514,
которая представляет собой новую
графическую плату с высоким разрешением,
позволяющую получить разрешающую
способность до 1024х768 точек и палитру,
содержащую 256 оттенков из 256 цветов. Файл
драйвера для этой графической платы
называется IBM8514.BGI. Графическая
плата IBM 8514 не может правильно
распознаваться Borland Pascal при
автоматическом обнаружении (она будет
распознаваться алгоритмами
автообнаружения, как плата VGA). Таким образом,
чтобы использовать плату IBM 8514, переменной
GraphDriver при вызове InitGraph нужно присвоить
значение IBM8514 (которое определено в модуле
Graph). При работе с платой IBM 8514 не следует
использовать с InitGraph DetectGraph или DETECT (если
только вы не хотите эмулировать режим VGA). Для
платы IBM 8514 поддерживаются следующие
режимы: IBM8514LO (640х480 элементов изображения)
и IBM8514HI (1024х768 элементов изображения). Обе
константы режима определены в
интерфейсной части GRAPH.TPU. Для
определения цветов в плате IBM 8514
используются три 6-битовых значения. Для
каждого определяемого цвета имеются 6-битовые
компоненты Red (красный), Green (зеленый) и Blue (голубой).
Для того, чтобы при работе с графической
платой IBM 8514 пользователь мог задавать
цвета, в библиотеку BGI добавлена новая программа.
Эта программа определяется в модуле GRAPH.TPU
следующим образом: procedure
SetRGBPalette(ColorNum, Red, Green, Blue: Word); Аргумент
ColorNum задает запись палитры, которую нужно
загрузить. Этот аргумент представляет
собой целое значение в диапазоне от 0 до 255 (дес.).
Аргументы Red, Green и Blue определяют компоненты
цветов в записи палитры. Используется
только младший байт этих значений и только
6 старших битов этого байта загружаются в
палитру. Другие
программы, модифицирующие палитру (SetAllPalette,
SetPalette, GetPalette), при работе с графической
платой IBM 8514 использовать не следует. Для
совместимости с графическими адаптерами
фирмы IBM драйверы формата BGI определяют
для первых 16 цветов палитры IBM 8514 значения
цветов, принятые по умолчанию для
адаптеров EGA/VGA. Эти значения могут
использоваться в неизмененном виде или
модифицироваться с помощью процедуры
SetGRBPalette. Система координатПо
соглашению верхний левый угол экрана
имеет координату (0,0). У более правого
столбца координата х больше, у более нижней
строки больше координата y. То есть
координата х увеличивается при
перемещении вправо, а координата y - при
перемещении вниз. Таким образом
координаты каждого из четырех углов и
конкретной точки (середины экрана) будут
выглядеть следующим образом:
Рис. 15.1 Экран с координатами xy. Текущий указательПонятие
текущего указателя используется во многих
графических системах. Понятие текущего
указателя аналогично понятию курсора для
текстового режима, за исключением того,
что текущий указатель невидим. Write('ABC'); В
текстовом режиме предшествующий оператор
Write оставит курсор в колонке,
непосредственно следующим за буквой C.
Если буква C была введена в колонке 80, то
курсор перейдет на колонку 1 следующей
строки. Если буква c была введена в позиции
80 строки 25, то произойдет пролистывание (прокрутка)
экрана вверх на 1 строку и курсор будет
находится в 1 позиции 25 строки. MoveTo(0,0); LineTo(20,20) В
графическом режиме данный оператор LinеТо
оставит текущий указатель в последней
заданной точке (20,20). Если действует режим
отсечения, то реально выводимая прямая
будет отсечена до текущей точки. Заметим,
что текущий указатель никогда не отсекается. Команда
МоvеТо является эквивалентом команды GotoXY.
Единственное ее назначение - это
перемещение текущего указателя. Перемещение
текущего указателя может использоваться
только в следующих командах,
использующих текущий указатель: MoveTo, InitGraph,
MoveRel, LineTo, LineRel, OutText, SetGraphMode, ClearDevice, SetViewPort и
ClearViewPort. Последние 5 из них перемещают текущий
указатель в точку (0,0). ТекстВ
графическом режиме для вывода текста
используется шрифт с растром 8х8 и
несколько векторных шрифтов. Растровый
символ задается с помощью матрицы
элементов изображения. Векторный шрифт задается
рядом векторов, которые указывают
графической системе, как рисовать шрифт. Преимущество
использования векторных шрифтов
становится очевидным, когда вы начинаете
рисовать большие символы. Поскольку
штриховой шрифт задается векторами, то при
увеличении шрифта качество и разрешение
остаются, тем не менее, хорошими. Когда
увеличивается растровый шрифт, то матрица
умножается на масштабный коэффициент, а
когда этот масштабный коэффициент
увеличивается, разрешение у символов
становится более грубым. Для маленьких
шрифтов растровый шрифт должен быть
достаточно приемлемым, но для больших
шрифтов вы, вероятно, захотите выбрать векторный
шрифт. Выравнивание
графического текста управляется
процедурой SetTextJustify. Масштабирование и
выбор шрифта осуществляется с помощью
процедуры SetTextStyle. Графический текст
выводится с помощью процедур ОutText или ОutTextХY.
Запрос о текущих установленных для
текста параметрах выполняется с помощью
обращения к процедуре GetTextSettings. Векторные
шрифты хранятся каждый в отдельном файле
на диске и должны присутствовать там во
время работы (при вызове процедуры SetTextStyle).
Размер векторного шрифта можно настроить
с помощью процедуры SetUserCharSize. Файлы шрифтов
(которые имеют расширение .CHR) могут
загружаться с диска автоматически
модулем Graph, или их можно компоновать с
программой пользователя или загружать и
"регистрировать" с помощью модуля Graph. Для
преобразования файла шрифта (или любого
другого предназначенного для этой цели
двоичного файла данных) в файл .OBJ, который
можно компоновать с модулем или
программой с помощью директивы
компилятора $L в Borland Pascal предусмотрена
специальная утилита BINOBJ.EXE. При этом
становится возможным поместить все файлы
шрифтов в выполняемый файл .EXE (см.
комментарии в начале примера программы
BGILINK.PAS на дистрибутивном диске). Графические изображения и их видыДля
вычерчивания и закрашивания графических
изображения, включая точки, прямые,
окружности, дуги, эллипсы, прямоугольники,
многоугольники, штриховку, трехмерную
штриховку и секторы, имеется целый ряд
обеспечивающих программ. Для управления
видом линии -
будет она тонкой или толстой, непрерывной
или состоящей из точек, или же
построенной по вашему собственному
образцу - можно использовать процедуру
SetLineStyle. Для
закрашивания области или многоугольника
пересекающейся штриховкой или чем-либо
более сложным можно использовать процедуры
SetFillStyle, SetFloodPattern, FillPoly и FloodFill. Области просмотра и двоичные образыПроцедура
ViewPoint позволяет всем командам вывода
работать в прямоугольной области экрана.
Графики, прямые и другие графические
изображения (весь графический вывод)
связывается с областью просмотра, пока
эта область не изменяется. Предусмотрены
программы для очистки области просмотра и
считывания ее текущих определений. Если
задан режим отсечения, то весь графический
вывод отсечется до текущей точки. Заметим,
что текущий указатель никогда не
отсекается. Для
считывания и вывода элементов изображения
предусмотрены процедуры GetPixel и Putpixel. Чтобы
сохранить и восстановить на экране
прямоугольную область, можно использовать
процедуры GetImage и PutImage. Они обеспечивают
полное выполнение операций процедуры ВitВlt
(нормальное, хоr, оr, аnd, nоt). Поддержка страниц и цветовИмеется
много других поддерживающих программ,
включая поддержку для нескольких
графических страниц (только для адаптеров
EGA, VGA и Неrcules; это особенно полезно при
использовании в мультипликации), палитры,
цвета и так далее. Обработка ошибокВнутренние
ошибки модуля Graph возвращаются функцией
GraphResult. Эта функция возвращает код ошибки,
показывающий состояние последней
графической операции. Коды возврата
приведены в разделе по GraphResult в Главе 1 ("Справочник
по библиотеки") "Справочного
руководства программиста". Значение
кода возврата для функции GraphResult
устанавливается следующими процедурами: DetectGraph
SetTextStile
SetAllPalette InitGraph
SetGraphMode
SetFillPattern FloodFill
CloseGraph
SetFillStyle FillPoly
GetGraphMode
SetGraphBufSize DrawPoly
ImageSize
SetGraphMode Bar
InstallUserDriver
SetLineStyle Bаr3D
InstallUserFont
SetPalette PieSlice
RegisterBGIDriver
SetTextJustify ClearViewPort
RegisterGBIFont Заметим,
что функция GraphResult после обращения к ней
сбрасывает код ошибки в 0. Таким образом,
пользователь должен сохранить значение
кода ошибки во временной переменной и
затем проверить его. Начало работыПриведем
пример простой графической программы: 1
program GraphTest; 2
uses 3
Graph; 4
var 5
GraphDriver :
integer; 6
GraphMode :
integer; 7
ErrorCode :
integer; 8
begin 9
GraphDriver := Detect;
Установить флаг: выполнить
распознавание 10
InitGraph(GraphDriver, GraphMode, 'C:\DRIVERS'); 11
ErrorCode := GraphResult; 12
if ErrorCode <> grOk then
ошибка?
13
begin 14
Writeln('Ошибка
графики:
',GraphErrorMsg(ErrorCode); 15
Writeln('Программа аварийно завершила работу...'); 16
Halt(1); 17
end; 18
Rectangle(0, 0, GetMaxX, GetMaxY); нарисовать
рамку размером в экран 19
SetTextJustify(CenterText, CenterText); центрирование
текста
20
SetTextStyle(DefaultFont, HorizDir, 3); 21
OutTextXY(GetMaxX div 2, GetMaxY div 2, центр
экрана
22
'Графический интерфейс фирмы Borland
(BGI)'); 23
Readln; 24
CloseGraph; 25
end. GraphTest
Программа
начинается с обращения к процедуре InitGraph,
которая автоматически проверяет наличие
аппаратуры и загружает соответствующий
графический драйвер (находящийся в
каталоге C: DRIVERS). Если графическая
аппаратура не распознана или в процессе
инициализации произошла ошибка, то на
экран выводится сообщение об ошибке и
программа прекращает работу. В противном
случае вдоль краев экрана рисуется
прямоугольник и в центре экрана выводится
текст. Плата
AT&T 400 или IBM 8514 не распознается
автоматически. Тем не менее, вы можете
пользоваться драйвером графики AT&T путем
отмены автоматической проверки, пересылки
исполняемого кода драйвера AT&T
процедуре InitGraph и установки допустимого
графического режима. Замените 8 и 9 строку
в предыдущем примере следующими тремя
строками: GraphDriver
:= ATT400; GraphMode
:= ATT400Hi; InitGraph(GraphDriver,
GraphMode, 'C:\BP\BGI'); Это
укажет графической системе на
необходимость загрузки драйвера
устройства AT&T400, расположенного в
каталоге C:\BP\BGI, и установит графический
режим 640 на 400. Приведем
еще один пример, который показывает, как
можно переключаться между графическим и
текстовым режимами: 1
program GraphTest; 2
uses 3
Graph; 4
var 5
GraphDriver :
integer; 6
GraphMode :
integer; 7
ErrorCode :
integer; 8
begin 9
GraphDriver := Detect; Установить флаг: выполнить
распознавание 10
InitGraph(GraphDriver, GraphMode, 'C:\DRIVERS'); 11
ErrorCode := GraphResult; 12
if ErrorCode <> grOk then
ошибка?
13
begin 14
Writeln('Ошибка
графики:
',GraphErrorMsg(ErrorCode); 15
Writeln('Программа аварийно завершила работу...'); 16
Helt(1); 17
end; 18
OutText('Графический режим. Нажмите
<RETURN>'); 19
Readln; 20
RestoreCrtMode; 21
Write('Текстовый
режим.
Нажмите
<RETURN>'); 22
Readln; 23
SetGraphMode(GraphMode); 24
OutText('Снова графический режим. Нажмите
<RETURN>'); 25
Readln; 26
CloseGraph; 27
end. GraphTest
Заметим,
что вызов процедуры SetGraphMode на строке 23
сбрасывает все графические параметры (палитра,
текущий указатель, основной и фоновый
цвета и т.д.) и им присваиваются принятые по
умолчанию значения. Вызов
CloseGraph восстанавливает первоначально
обнаруженный видеорежим (InitGraph) и
освобождает память, используемую графическим
драйвером. Пользовательские программы управления динамически распределяемой памятьюДля
модуля Graph предусмотрены две программы
управления динамически распределяемой
областью GraphFrееМем
и
GraphGetМем.
Первая из них
освобождает память, распределенную для
драйверов, а вторая - распределяет память
для драйверов графических устройств.
Стандартные программы имеют следующий вид: procedure
GraphGetMem(var P : Pointer; Size : word); выделить
память для драйверов графических
устройств procedure
GraphFreeMem(var P : Pointer; Size : word); освободить
память для драйверов графических
устройств В
модуле Graph имеются два указателя, которые
по умолчанию указывают на две описанные
здесь стандартные подпрограммы. Эти
указатель определяются следующим образом: var GraphGetMemPtr
: pointer; указатель
на программу распределения памяти
GraphFreeMemPtr : pointer; указатель
на программу освобождения памяти Во
время инициализации модуля Graph эти
указатели ссылаются на стандартные
графические программы распределения/освобождения,
которые определяются в секции реализации
модуля Graph. Память распределятся в трех
различных целях: *
для многоцелевых графических буферов,
размер которых устанавливается вызовов
SegGraphBufSize (по умолчанию это 4К); *
для драйвера
устройства, загружаемого
InitGraph (файлы *.BGI); *
для файла векторного
шрифта, загруженного
SetTextStyle (файлы
*.CHR). Графический
буфер всегда выделяется в динамически
распределяемой области памяти. Память
для драйвера устройства выделяется в
динамической памяти, если программа не
загружает его или не компонуется с ним
вызовом RegisterBGIdriver. При выборе векторного
шрифта с помощью SetTextStyle также выделяется
память в динамически распределяемой
области (если ваша программа не компонуется
со шрифтом и не использует RegisterBGIfont). Чтобы
задать ваше собственное управление
памятью, в модуле Graph вы можете изменить
значения этих указателей так, чтобы они
ссылались на ваши собственные программы.
Программы, заданные пользователем, должны
иметь тот же список параметров, что и стандартные
программы, и должны иметь дальний тип
вызова. Приведем далее пример заданных
пользователем программ распределения и освобождения
памяти. Заметим, что при использовании
процедуры Eхit автоматически вызывается
процедура CloseGraph. program
UserHeapManegement; программа
показывает, как
пользователь может работать
с подпрограммами
управления динамически распределяемой областью
памяти, используемыми в модуле Graph uses Graph;
var GraphDriver,
GraphMode : Integer; ErrorCode
: Integer; используется
для сохранения
кода возврата функции GraphResult
PreGraphExitProc : Pointer используется
для сох- ранения
исходной процедуры выхода процедуры
пользователя должны использовать дальний
тип обращения
procedure
MyGetMem(var P : Pointer; Size : word); far;
выделить память для драйверов
графических устройств begin Write('Была
вызвана процедура ', 'MyGetMem,
нажмите
<Enter>:'); GetMem(P,
Size); end; MyGetMem procedure
MyFreeMem(ver P : Pointer; Size : word); far; освободить
память, занятую драйверами графических устройств
begin RestoreCRTMode; Write('Была
вызвана процедура MyFreeMem, нажмите ', '<Enter>:');
Readln; if
P <> Nil Then не
освобождать пустые указатели begin FreeMem(P,
Size); P
:= Nil; end;
MyFreeMem procedure
MyExitProc; far; процедура
всегда получает вызов при прекращении
работы программы
begin ExitProc
:= PreGraphExitProc; восстановить
исходную процедуру выхода CloseGraph;
очистить динамически распределяемую область
end;
MyExitProc begin инициализировать
программу очистки памяти PreGraphExitProc
:= ExitProc; ExitProc
:= @MyExitProc; GraphGetMemPtr
:= @MyGetMem ; заменить
распределение памяти GraphFreeMemPtr
:= @MyFreeMem ; заменить
освобождение памяти GraphDriver
:= Detect; InitGraph(GraphDriver,
GraphMode, ''); ErrorCode
:= GraphResult; if ErrorCode <> grOk then begin Writeln('Графическая
ошибка:
' GraphErrorMsg(ErrorCode); Readln; Halt(1);
end; Line(0,
0, GetMaxX, GetMaxY); OutText(1,
1, 'Нажмите
клавишу
<Enter>:'); Readln; end.
UserHeapManegement Если
целевой платформой является защищенный
режим DOS, то при использовании подобных
программ следует иметь в виду следующее:
вы должны обеспечить, что любой
возвращаемый GetMem указатель должен иметь
нулевое смещение. Сделать это можно с
помощью функции GlobalAllocPtr: procedure
MyGetMem(var P: Pointer; Size: Word); far; var P:
Pointer; bagin P:=
GlobalAllocPtr(HeapAllocFlags, Size); GetMem(P,
4096); end; MyGetMem Процедуры модуля GraphПроцедуры
модуля Graph
Таблица 15.3
Константы, типы и переменные модуля GraphВ
модуле Graph имеется много полезных описаний
типов и констант, на которое вы можете
ссылаться. Константы
Группы
констант модуля Graph
Таблица 15.4
Типы
В
модуле Graph определены следующие типы: Типы
модуля Grap
Таблица 15.5
Переменные
Модуль
Graph содержит две переменные, которые вы
можете использовать: GraphGetMemPtr и GraphFreeMemPtr.
Они применяются в подпрограммах
управления динамически распределяемой
областью памяти. |
(с) Все права защищены. По всем интересующим вопросам прошу писать электронный адрес |