Файлы BGI и содержимое модуля Graph
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Модуль Graph

 

Модуль Graph представляет собой библиотеку подпрограмм, обеспечивающую полное управление графическими режимами различных адаптеров дисплеев: CGA, EGA, VGA и т.д. Библиотека содержит более пятидесяти графических процедур и функций, как базовых (рисование точек, линий, окружностей и т.п.), так и расширяющих возможности базовых (многоугольники, заполнение фигур, вывод текста и др.).

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

Кроме того, системе программирования (компилятору) должен быть доступен модуль GRAPH.TPU (он не входит в состав файла TURBO.TPL, а изначально находится в архиве BGI.ARC).

Файлы BGI и содержимое модуля Graph

 

Файл BGI - это графический интерфейс (Borland Graphic Interface) фирмы Borland. Он обеспечивает взаимодействие программ с графическими устройствами. Перед работой программы в графических режимах дисплея процедура InitGraph определяет тип адаптера, представленного в ПК, и загружает в память соответствующий BGI-драйвер, в котором определены возможные режимы работы.

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

Итак, в рабочем каталоге могут находиться следующие файлы:

 

CGA.BGI - драйвер для IBM CGA, MCGA;
EGAVGA.BGI - драйвер для IBM EGA, VGA;
HERC.BGI - драйвер для Hercules;
ATT.BGI - драйвер для АТ&Т6300 (400 строк);
PC3270.BGI - драйвер для IBM 3270PC;
IBM8514.BGI - драйвер для IBM 8514.

 

Такой набор файлов необходим при составлении программ, которые будут работать практически на всех ПК, совместимых с ПК фирмы IBM. Если же такая задача не стоит, то достаточно иметь один файл, соответствующий представленному в используемом ПК графическому адаптеру.

Все процедуры и функции модуля Graph можно разбить на функциональные группы:

1) Управление графическими режимами и их анализ (DetectGraph, InitGraph, CloseGraph, GraphDefaults, ClearDevice, InstallUserDriver, RegisterBGIDriver, RestoreCRTMode, SetGraphMode, SetWrifeMode, GetGraphMode, GetModeRange, GetMaxMode, GetModeName, GetDriverName, GraphResuIt,, GraphErrorMsg).

2) Рисование графических примитивов и фигур:

a) управление «текущим указателем» (MoveTo, MoveRel, GetMaxX, GetMaxY, GetX, GetY);

b) собственно рисование (Line, LineTo, LineRel, Arc, GetArcCoords, Circle, Sector, Ellipse, Rectangle, DrawPoly);

c) стиль линий и коэффициент сжатия изображения (SetLineStyle, GetLineSettings, SetAspeclRatio, GetAspectRatio).

3) Управление цветами и шаблонами заполнения (SetColor, GetColor, SetBkColor, GetBkColor, GetMaxColor, GetPalette, GetPaletteSize, GetDefaultPalette, SetPalette, SetAllPalette, SetRGBPalette, SetFillStyle, SetFillPattern, GetFillPattern, GetFillSettings, SetGraphBufSize, FillPoly, FillEIIipse, FloodFill, PicSlice, Bar, Bar3D).

4) Битовые операции (PutPixel, GetPixel, ImageSize, Getlmage, Putlmage).

5) Управление страницами (SetActivePage, SetVisualPage).

6) Графические окна (вьюпорты) (SetViewPort, GetViewSettings, ClearViewPort).

7) Управление выводом текста (RegisterBGIFont, lnstallUserFont, OutText, OutTextXY, SetTextStyle, SetTextJustify, SetUserCharSize, GetTextSettings, GetTextHeight, TextWidth).

 

GraphResult : Integer

 

Эта функция возвращает код результата последнего вызова одной из процедур или функций, указанных в таблице.

Bar Bar3D ClearViewPort CloseGraph DetectGraph DrawPoly FillPoly FloodFill GetGraphMode ImageSize InitGraph InstallUserDriver InstallUserFont PieStice RegisterBGIdriver RegisterBGIfont SetAllPalette SetFillPattern SetFillStyle SetGraphBufSize SetGraphMode SetLineStyle SetPalette SetText Justify SetTextStyle

 

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

Для быстрой выдачи простого сообщения о типе ошибки графической системы используется функция, преобразующая результат вызова функции GraphResult в сообщение, которое можно вывести процедурой Write. Эта функция объявлена как:

Var

GraphDriver: Integer;

GraphMode: Integer;

ErrorCode: Integer;

Begin

GraphDriver: =Detect;

InitGraph (GraphDriver, GraphMode, '');

ErrorCode: =GraphResult;

if ErrorCode <> grOK then

Begin

Writeln (‘ Ошибка графики : ‘, GraphErrorMsg (ErrorCode));

Writeln(‘Программа остановлена...');

Halt(1);

end;

Begin {Пример инициализации}

GrInit ;

Line (0, 0, GetMaxX, GetMaxY);

Readln;

CloseGraph;

E nd.

В дальнейшем процедуру Grlnit лучше записать в отдельный файл (например, INITGRAF.PAS) и использовать директиву включения этого файла при компиляции. Такой блок всегда включает стандартный графический режим максимального разрешения.

GetGraphMode : Integer ,

Функция

GetMaxMode : Word

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

ClearDevice

Эта процедура очищает графический экран и устанавливает указатель позиции в (0, 0), а процедура

GraphDefaults кроме очистки экрана устанавливает ряд параметров графической системы:

o графическое окно становится равным размеру экрана;

o восстанавливается системная цветовая палитра;

o переназначаются цвета основных линий и фона экрана;

o толщина и стиль линий принимаются как по умолчанию;

o цвет и шаблон заливки геометрических фигур и замкнутых ломаных принимается как по умолчанию;

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

Процедура GraphDefaults неявно вызывается при инициализации графики и выполняет, no-сути, все стартовые установки графических параметров.

Переключение режимов. Оно осуществляется процедурой SetGraphMode ( GraphMode : Integer )

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

Процедура RestoreCRTMode . При написании некоторых пакетов, использующих и графические, и текстовые режимы работы, может использоваться процедура RestoreCRTMode, которая возвращает систему в текстовый режим, работавший до инициализации графики. Казалось бы, уже есть процедура с подобным действием — CloseGraph. Однако после нее возврат в графический режим должен проводиться через процедуру InitGraph, что довольно сложно. Если же воспользоваться процедурой RestoreCRTMode, то возвращение в графику будет достаточно простым

 

USES Graph;

{подключен модуль Graph}

{$I Initgraf.pas}

{процедура инициализации}

CONST

{константы - сообщения}

graph_str = ‘Это графический режим';

text_str = 'А это текстовый режим';

graph_ back = 'А это снова графический режим';

BEGIN

 

Grlnit;

{инициализация графики}

Line(0,0,GetMaxX,GetMaxY };

{ диагональ экрана}

 OutTextXY(0,100,graph_str);

{ вывод первого сообщения}

ReadLn;

{пауза до нажатия ввода}

RestoreCRTMode;

{восстановление текстового режима}

Write{ text_str );

{ вывод второго сообщения}

ReadLn;

{пауза до нажатия ввода}

SetGraphMode(GetGraphMode);

{восстановление графического режима}

 Une(0,0,GetMaxX,GetMaxY);

{ диагональ экрана }

 OutTextXY(0,100,graph_back);

{вывод третьего сообщения}

ReadLn;

{ пауза до нажатия ввода}

CloseGraph

{ закрытие графики}

End.

 

     

 

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

GetMaxY : Integer .

Возвращаемые ими значения соответствуют параметрам nx _ max и ny _ max, будут различаться для различных режимов и адаптеров. При адресации точек координатами, большими, чем эти значения, операция игнорируется.

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

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

Графические координаты задают положение точки на экране дисплея. Поскольку минимальным элементом, к которому имеет доступ программист, является пиксель, естественно в качестве графических координат использовать порядковые номера пикселей. Допустимый диапазон изменения графических координат составляет [0, rx- 1] для X и [0, ry - 1] для Y –координаты. Точкой отсчета является верхний левый угол экрана. Значения X- координаты отсчитываются слева направо, а Y-координаты - сверху вниз. Это отличает графические координаты от обычных декартовых координат, принятых в математике, и служит источником ошибок для начинающего программиста.

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

1. Графические координаты принимают только целочисленные значения.

2. Графические координаты принимают, ограниченные как снизу (нулевым значением), так и сверху (значением разрешения).

3. Графическая координата Y отсчитывается сверху вниз.

Таким образом, геометрические декартовы координаты точки (X, Y) для отображения на экране следует пересчитать в графические (Xg, Yg) по формулам:

Xg= ë Sx*X û + dx,

Yg= ry- ë Sy*Y û – dy,

 

Где ë X û - целая часть X, Sx , Sy- масштабные множители, выбираемые из условия

rx= ë Sx*Xmax û +1

ry= ë Sx*Ymax û +1

Xmax , Ymax- максимальные значения геометрических координат.

Слагаемые dx , dy обеспечивают смещение относительно левого верхнего угла экрана.

Изображение будет смещено в центр экрана при dx = ë rx /2 û , dy = ë ry /2 û .

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

Процедура MoveTo (х, у: Integer ) перемещает его в точку экрана с координатами (х, у).

Процедура MoveRel ( dx , dy : Integer ) перемещает текущий указатель на dx пикселов по горизонтали и соответственно на dy по вертикали относительно последнего положения текущего указателя. Положительные значения dx и dy увеличивают его координаты, а отрицательные — уменьшают.

В системе координат дисплея ось Y направлена вниз, поэтому, если указатель надо перенести вверх, то приращение dy должно быть отрицательным.

Для определения текущего положения графического курсора используются функции

GetX : Integer ;

GetY : Integer ,

возвращающие положение указателя соответственно по оси X и по оси Y. Позиционирование текущего указателя и опрос его местонахождения работают корректно, даже если работа происходит за пределами координат устройства.

Изменяют положение текущего указателя также процедуры LineTo, LineRel, OutText.

Все процедуры инициализации и очистки экрана (InitGraph, GraphDefaults, ClearDevice, SetGraphMode, SetViewPort и ClearViewPort) устанавливают текущий указатель в положение (0,0).



Line (Х1, Y1, Х 2, Y2: Integer)

Здесь задаются координаты начала (X1,Y1) и конца (X2,Y2) отрезка. Возможны еще два метода рисования отрезков:

1. Из текущей точки в точку с заданными координатами (X,Y). Выполняется процедурой

LineTo ( х, у: Integer )

3. Относительно текущей позиции. Положение текущего указателя принимается за начало «временных» координат (0,0) и указывается местоположение конца отрезка в них. Такое построение делает процедура

TYPE

LineSettingsType=RECORD

LineStyle : Word; { стиль (тип) }
Pattern : Word; { шаблон типа }
Thickness : Word; { толщина }

END;

CONST

{ Для значений поля LineStyle :}

SolidLn = 0 { сплошная линия }
DottedLn = 1 { точечная линия}
CenterLn = 2 { штрихпунктирная линия}
DashedLn = 3 { пунктирная линия }
UserBitLn = 4 { тип линии задан явно шаблоном}

{ Для значений поля Thickness : }

NormWidth = 1 { толщина линии в один пиксел}
ThickWidth = 3 { толщина линии в три пиксела}

 

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

MoveTo (100, 100);

LineRel (20, 0); LineRel (0, 20);

LineRel (-20, 0); LineRel (0, -20);

то на экране, скорее всего, возникнет сжатый прямоугольник. Похожая картина будет наблюдаться, если «вручную» нарисовать окружность с помощью отрезков прямых или точек: получится эллипс. Это связано с тем, что отношение высоты экрана к ширине не равно отношению его разрешающей способности по вертикали к разрешающей способности по горизонтали. Для учета этого неравенства в графическом стандарте BGI вводится специальный показатель, называемый коэффициентом сжатия изображения (aspect ratio). Его значения могут иметь широкий диапазон. Например, для ПК IBM PC/XT/AT стандартные мониторы имеют отношение высоты экрана к его ширине, равное 0,75. При этом разрешающая способность адаптеров колеблется от 640x200 для CGA до 1024x768 IBM8514, и отношение GetMaxY к GetMaxX может меняться от 0,3125 (640x200) до 0,75 (640x480, 1024x768). Таким образом, на единицу длины оси экрана приходится разное количество пикселов по горизонтали и вертикали, а поскольку все операции производятся с пикселами, то в результате вместо окружности может получиться эллипс, горизонтальная полуось которого равна радиусу, а вертикальная - радиусу, деленному на коэффициент сжатия изображения.

В модуле Graph есть две процедуры, помогающие устранить неудобство. Первая из них

Var

d,r,e:integer;

a,b :word;

Begin

d:=Detect;

InitGraph(d,r,'');

e:=GraphResult;

if e<>grOk then

Writeln(GraphErrorMsg(e))

Else

Begin

GetAspectRatio(a,b);

Rectangle(20,20,round(l*(b/a)),l);

readln;

CloseGraph;

End

End.

Окружности , эллипсы и дуги

 

Для изображения окружностей используется процедура

TYPE

ArcCoordsType = RECORD

X, Y :Integer; {центр}
XStart, YStart :Integer; {начало}
XEnd, YEnd :Integer; {конец}

END;

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

TYPE

PointType = RECORD

X , Y : Integer ; {координаты точки}

END ;

Обычно набор точек организуется как массив из записей типа PointType (и именно к такой структуре приводится значений параметра PolyPoint при работе процедуры DrawPoly). Пример построения графика функции с помощью процедуры DrawPoly приведен далее.

 

USES Graph; {подключен модуль Graph }
{$I initgraf.pas} {процедура инициализации}
CONST  
Pi * 3.14151828; {константа Pi (замещает функцию)}
Pi2 = 2 * Pi; {различные производные от Pi...}
Pi001 = 0.01* Pi;  
VAR  
angle: Real;  
sine_func: Array [1.201] of PointType ; { массив точек}
maxy, i: Integer;  
BEGIN  
Grlnit; {инициализация графики}
maxy := GetMaxY div 2; {середина экрана по оси Y}
angle := 0.0; {задание стартовых значений}
i := 0; { счетчик точек в sine_func}
repeat { цикл заполнения sine_func }
Inc ( i );  

sine_func[i].x:= Round (100 * angle) + 10;

sine_func[i].y:= Round (100 * Sin (angle)) + maxy;

angle := angle + Pi001;  
until angle > Pi2;  
DrawPoly (i, sine_func) ; { рисование графика синуса}
ReadLn; {пауза до нажатия ввода}
CloseGraph {закрытие графики}
END.  

 

С помощью DrawPoly можно вывести график части функции. Для этого достаточно указать при передаваемом массиве номер n первого рассматриваемого элемента (т.е. точки), а в первом параметре — количество рассматриваемых точек, начиная с n-й, например

DrawPoly (20, sine _ func [100]);

Такой вызов выведет ломаную линию по точкам с номерами 100, 101,..., 119.

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

Задание типа заливки

 

В модуле Graph предусмотрены процедуры, с помощью которых можно заполнить (залить) определенным «узором» любую замкнутую область изображения. Вид «узора» задается так называемым шаблоном заливки. В Турбо Паскале предопределен ряд стандартных шаблонов, но кроме того, имеется возможность конструировать собственные.

Назначение шаблона заполнения (заливки) производится процедурой

SetFillStyle (Pattern: Word; Color: Word)

где параметр Pattern определяет вид шаблона заливки, a Color — его цвет. Все разрешенные значения параметра Pattern предопределены в модуле Graph в виде констант:

CONST

 

EmptyFill =0 { сплошная заливка цветом фона}
SolidFill =1 { сплошная заливка текущим цветом}
LineFill =2 { заливка типа ===}
LtSlashFill =3 { заливка типа ///}
SlashFill =4 { заливка жирными линиями типа ///}
BkSlashFill =5 { заливка жирными линиями типа \\\}
LtBkSlashFill =6 { заливка типа \\\}
HatchFill =7 { заливка редкой штриховкой}
XHatchFill =8 { заливка частой штриховкой}
InterleaveFill =9 { заливка прерывистой линией}
WideDotFill =10 { заливка редкими точками}
CloseDotFill =11 { заливка частыми точками}
UserFill =12 { заливка, определенная программистом}

 

Константа UserFill используется для определения типа заливки, который предварительно был задан в программе. Для задания своего нового шаблона необходимо воспользоваться процедурой

Var

d,r,e,i,j,x,y : integer;

Begin

d:=Detect;

InitGraph(d,r,'');

e:=GraphResult;

if e<>grOk then

Writeln(GraphErrorMsg(e))

Else

Begin

SetGraphMode(0);

x:=GetMaxX div 9;

y:=GetMaxY div 7;

for j:=0 to 2 do

for i:=0 to 3 do

Begin

Rectangle((2*i)*x,(2*j+1)*y,

(2*i+1)*x,(2*j+2)*y);

SetFillStyle(i+j*4,j+1);

Bar((2*i)*x+1,(2*j+1)*y+1,

(2*i+1)*x-1,(2*j+2)*y-1);

end;

readln;

CloseGraph;

End

End.

Bar ( X 1, Y 1, X 2, Y 2: Integer )

рисует прямоугольник, внутренняя область которого залита по текущему шаблону. Она обычно используется в деловой графике для строения столбчатых диаграмм. Параметры (X1,Y1) и (X2, Y2) - координаты верхнего левого и правого нижнего углов прямоугольника. Еще более наглядное представление информации при рисовании диаграмм позволяет получить процедура

Var

d,r,e : integer;

Begin

d:=Detect;

InitGraph(d,r,'');

e:=GraphResult;

if e<>grOk then

Writeln(GraphErrorMsg(e))

Else

Begin

Bar3d( 80,100,120,180,15,TopOn);

Bar3d(150,150,190,180,15,TopOff);

Bar3d(230, 50,250,150,15,TopOn);

Bar3d(220,150,260,180,15,TopOn);

Bar3d(300,150,340,180,15,TopOff);

Bar3d(300, 50,340,150,15,TopOn);

readln;

CloseGraph;

End

End.

Следующие «заполняющие» процедуры работают с секторами окружностей и эллипсов. Рисование сектора эллипса, который будет залит цветом по текущему шаблону, осуществляется процедурой

Sector (X, Y: Integer; StartAngle, EndAngle, XRadius, YRadius: Word)

Параметры процедуры имеют тот же смысл, что и в процедурах Arc, Ellipse. для задания кругового сектора надо задавать YRadius с учетом коэффициента сжатия:

VAR

R , А, В: Word; {R - радиус кругового сектора}

BEGIN

GetAspectRatio ( А , В );

Sector (100, 100, 0, 90, R, R * Longlnt (A) div В );

END .

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

PieSlice(X, Y: Integer; StartAngle, EndAngle, Radius: Word)

которая рисует сектор окружности, площадь которого заливается по текущему шаблону заполнения.

процедура

FillEllipse(X, Y: Integer; XRadius, YRadius: Word)

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

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

GetMaxColor : Word

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

SetColor (Color: Word )

Цвет фона — всегда един в поле экрана. Он может быть изменен процедурой

SetBkColor (Color: Word )

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

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

Функция GetColor : Word возвращает значение текущего цвета пера, а функция GetBkColor : Word возвращает текущий цвет фона.

Управление палитрой

Палитра и ее анализ. Максимальный набор цветов, поддерживаемых одновременно BGI-драйвером, называется палитрой и может состоять из 16 цветов, пронумерованных от 0 до 15 (так будет, например, для графических адаптеров EGA, VGA).

Эти шестнадцать цветов используются по умолчанию в режимах 640x480 для VGA, 640x350, 640x200 и 320x200 для EGA как в текстовом, так и в графическом режимах.

Числа от 0 до 15, которые используются для обозначения цветов, определяют цветовые атрибуты или, как их еще называют, «программные» цвета. Каждому программному цвету присваивается «аппаратный» цвет из так называемой полной палитры. Например, для адаптера EGA, выводящего одновременно до 16 цветов, программные цвета выбираются из полной палитры в 64 цвета, имеющейся в этом адаптере. А в адаптере VGA аппаратная палитра содержит 256 цветов. Для управления соответствием между программными и аппаратными цветами в модуле Graph предусмотрен ряд процедур, охватывающих практически все возможные операции с палитрой.

Рассмотрим процедуры, с помощью которых можно получить системную информацию о ней. В модуле Graph определен тип для описания палитры:

CONST

MaxColors = 15; {максимальный программный номер цвета}

TYPE PaletteType = RECORD

Size  : Byte; {размер программной палитры}

Colors: Array [0..MaxColors] of Shortlnt;


END ;

Поле Size содержит количество цветов в палитре, а поле Colors содержит действующие цвета в первых Size элементах массива. Процедуры GetPalette и GetDefaultPalette возвращают в фактических параметрах значение типа PaletteType:

GetDefaultPalette (VAR Palette: PaletteType);

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

 

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

SetVisualPage (Page: Word )

которая устанавливает «видимой» на экране видеостраницу номер Page, и процедура

SetActivePage (Page: Word )

устанавливающая перенаправление всех графических операций на страницу номер Page (т.е. делающая активной). Активность не тождественна видимости страницы на экране.

Рассмотрим пример использования этих процедур.

(* Пример только для адаптеров EGA и VGA!!! *)

USES Graph, CRT; {используется Graph и CRT}
{$I initgraf.pas} {процедура инициализации}
PROCEDURE Forms (kadr: Byte); {рисование кадров 0..3}
CONST  

Radius: Array [0..3] of Integer = (20, 40, 60, 60);

VAR  
r, rr : Integer; { радиусы эллипсов в кадрах }
BEGIN  
r:= Radius[kadr]; {максимальный радиус}
rr := 0; { радиус вложенного эллипса }
repeat  

Ellipse(GetMaxX div 2,GetMaxY div 2,0,360,r,rr);

Inc( rr, 5 ) ;  
until rr>=r;  
END;  
PROCEDURE AnimEGAVGA; {процедура смены кадров}
CONST ms = 60; {задержка между кадрами, мс}
VAR i: Byte; {параметр циклов смены}
BEGIN  
repeat { цикл до нажатия клавиши...}
for i:=0 to 3 do begin { Смена видеостраниц: прямо }
SetVisualPage (i);  
Delay( ms );  
end;  
for i:=3 downto 0 do begin { ... и обратно }
SetVisualPage( i );  
Delay( ms );  
end;  
until KeyPressed; { условие окончания показа }
END;  
VAR  (* ОСНОВНАЯ ЧАСТЬ ПРИМЕРА *)
i: Byte; { параметр (номер кадра)}
BEGIN  
Grlnit; {инициализация графики }
SetGraphMode (EGALo); {режим EGA, 640x200, 4 стр.}
for i:=3 downto 0 do begin { Цикл заполнения страниц}
SetVisualPage (Succ (i) mod 4); {Видим "пустоту “}
SetActivePage(i); {и готовим кадр}
Forms( i ) {рисунок кадра}
end; {for}  
AnimEGAVGA; {начало оживления кадров}
CloseGraph  
END.  

 

Здесь показано использование процедур SetActivePage и SetVisualPage для алгоритма «кадровой» мультипликации. Особенность ее заключается в том, что все кадры (здесь их четыре) сначала записываются на соответствующие страницы, а затем производится последовательное переключение отображения страниц на дисплей процедурой SetVisualPage.

Графические окна

 

В системе BGI-графики вводится термин «viewport». Специальный словарь дает следующее разъяснение: «вьюпорт - это область просмотра, окно экрана, в компьютерной графике - часть пространства отображения, в которой изображается и просматривается часть моделируемого объекта». Мы будем использовать термин «графическое окно». При образовании графического окна получается как бы «экран в экране» заданного размера. В модуле Graph для описания графического окна объявлен следующий тип и две константы:

TYPE ViewPortType = RECORD

X1, Y1, X2, Y2: Integer ; { границы окна}
Clip: Boolean; {режим отсечения)

END ;

CONST

ClipOn = True; { отсечение по границе окна включено}
ClipOff = False; { отсечение по границе окна выключено}

 

Здесь первые элементы записи — это координаты прямоугольной области (графического окна), как их принято задавать, a Clip — это параметр, указывающий графической системе, что делать с изображением, попавшим за пределы этой области. Clip может принимать два значения. Значение ClipOn указывает на то, что все элементы изображения обрезаются по границам графического окна, a ClipOff указывает на то, что все рисуется без изменений.

Объявление графического окна производится процедурой

ClearViewPort

Она работает следующим образом:

1. устанавливает цвет заполнения равный текущему цвету фона;

2. вызывает процедуру Ваг с теми же значениями координат; что и у процедуры SetViewPort, вызванной перед этим;

3. перемещает текущий указатель в точку (0,0) .

{ Иллюстрация дейсвия режима "отсечка" }

Program ClipOn_Off;

Uses Graph;

Var d,e,r:integer;

Const

x11=0; y11=40; x12=120; y12=85;

x21=200; y21=y11; x22=320; y22=y12;

Begin

d:=Detect; InitGraph(d,r,'');

e:=GraphResult;

if e<>grOk then

Writeln(GraphErrorMsg(e))

Else

Begin

writeln(' ClipOn: ClipOff');

Rectangle(x11,y11,x12,y12);

Rectangle(x21,y21,x22,y22);

SetViewPort(x11,y11,x12,y12,ClipOn);

Circle(20,20,60);

SetViewPort(x21,y21,x22,y22,ClipOff);

Circle(20,20,60);

readln;

CloseGraph;

End

End.

Вывод текста

 

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

Выбор шрифта и стиля

 

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

Всего с пакетом Турбо Паскаль поставляется четыре шрифта (хотя можно, используя отдельный специальный пакет, самостоятельно расширить их набор). Кроме того, доступен системный матричный шрифт 8x8 для графических режимов (всегда доступны символы с ASCII-кодами от 0 до 127 и символы с кодами от 128 до 255 при условии, что их матрицы загружены в память ПЭВМ). Для обозначения этих пяти шрифтов введены константы:

CONST

DefaultFont = 0; { матричный шрифт 8x8 (по умолчанию)}
TriplexFont = 1; { полужирный шрифт}
SmallFont = 2; { светлый шрифт (тонкое начертание)}
SansSerifFont = 3; { книжная гарнитура (рубленый шрифт)}
GothicFont = 4; { готический шрифт}

 

DefaultFont - это матричный шрифт 8x8. Если не принимать никаких действий по смене шрифта, то будет принят именно он.

Активизация любого из названных шрифтов осуществляется процедурой

SetTextStyle (Font, Direction: Word; CharSize: Word)

Здесь параметр Font - номер шрифта (например, одна из описанных выше констант), Direction - расположение текста (по умолчанию принимается горизонтальное). Возможны лишь две ориентации текста, обозначенные константами:

CONST

HorizDir = 0; { горизонтальная, слева направо}
VertDir =1; { вертикальная, снизу вверх}

 

При значении Direction, равном VertDir, все символы будут повернуты против часовой стрелки на 90° и выводятся снизу вверх. Если задать Direction=2, то буквы будут повернуты так же, как и при Direction=VertDir, но вывод строки будет производиться горизонтально, слева направо.

Размер каждого символа устанавливается параметром CharSize, диапазон изменения которого составляет от 1 до 10. Стандартное значение CharSize для матричного шрифта 8x8 равно единице, а для штриховых шрифтов - четырем.

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

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

 

GraphResult Смысл значения
0 Успешное выполнение операции
-8 Файл CHR не найден
-9 Не хватает памяти для загрузки выбранногошрифта
-11 Ошибка графики
-12 Ошибка ввода-вывода графики
-13 Неправильное содержимое файла шрифта
-14 Неправильный номер шрифта

{Демонстрация шрифтов }

Program SetStDem;

Uses Graph;

Const

text : array[1..4] of string[14]=

('TripLexFont','SmallFont','SansSerifFont','GothicFont');

s4=', size 4';

s5=' and 5';

Var

d,r,e,i:integer;

Begin

d:=Detect;

InitGraph(d,r,'');

e:=GraphResult;

if e<>grOk then

Writeln(GraphErrorMsg(e))

Else

Begin

SetTextStyle(DefaultFont,HorizDir,1);

OutText('DefaultFont, size 1');

SetTextStyle(0,0,2);

OutText(' and 2');

for i:=1 to 4 do begin

SetTextStyle(i,0,4);

Moveto(10,i*40);

OutText(text[i]+s4);

SetTextStyle(i,0,5);

Outtext(s5);

end;

for i:=1 to 4 do begin

SetTextStyle(i,1,4);

Moveto(GetMaxX div 2+i*40-20,0);

OutText(text[i]);

end;

readln;

CloseGraph;

End

End.

CONST

{ — Для горизонтального ориентирования (Horizontal) —}

LeftText =0; {координата X задает левый край строки}
Center-Text = 1; {координата X задает середину строки}
RightText = 2; {координата X задает правый край строки}

{ — Для вертикального ориентирования (Vertical): —}

BottomText = 0; {координата Y задает нижний край строки}
CenterText = 1; {координата Y задает середину строки}
TopText = 2; {координата Y задает верхний край}

 

Эта процедура позволяет ориентировать выводимую строку относительно стартовой координаты по установленной схеме. По умолчанию параметры ориентировки соответствуют LeftText , TopText .

Модуль Graph

 

Модуль Graph представляет собой библиотеку подпрограмм, обеспечивающую полное управление графическими режимами различных адаптеров дисплеев: CGA, EGA, VGA и т.д. Библиотека содержит более пятидесяти графических процедур и функций, как базовых (рисование точек, линий, окружностей и т.п.), так и расширяющих возможности базовых (многоугольники, заполнение фигур, вывод текста и др.).

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

Кроме того, системе программирования (компилятору) должен быть доступен модуль GRAPH.TPU (он не входит в состав файла TURBO.TPL, а изначально находится в архиве BGI.ARC).

Файлы BGI и содержимое модуля Graph

 

Файл BGI - это графический интерфейс (Borland Graphic Interface) фирмы Borland. Он обеспечивает взаимодействие программ с графическими устройствами. Перед работой программы в графических режимах дисплея процедура InitGraph определяет тип адаптера, представленного в ПК, и загружает в память соответствующий BGI-драйвер, в котором определены возможные режимы работы.

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

Итак, в рабочем каталоге могут находиться следующие файлы:

 

CGA.BGI - драйвер для IBM CGA, MCGA;
EGAVGA.BGI - драйвер для IBM EGA, VGA;
HERC.BGI - драйвер для Hercules;
ATT.BGI - драйвер для АТ&Т6300 (400 строк);
PC3270.BGI - драйвер для IBM 3270PC;
IBM8514.BGI - драйвер для IBM 8514.

 

Такой набор файлов необходим при составлении программ, которые будут работать практически на всех ПК, совместимых с ПК фирмы IBM. Если же такая задача не стоит, то достаточно иметь один файл, соответствующий представленному в используемом ПК графическому адаптеру.

Все процедуры и функции модуля Graph можно разбить на функциональные группы:

1) Управление графическими режимами и их анализ (DetectGraph, InitGraph, CloseGraph, GraphDefaults, ClearDevice, InstallUserDriver, RegisterBGIDriver, RestoreCRTMode, SetGraphMode, SetWrifeMode, GetGraphMode, GetModeRange, GetMaxMode, GetModeName, GetDriverName, GraphResuIt,, GraphErrorMsg).

2) Рисование графических примитивов и фигур:

a) управление «текущим указателем» (MoveTo, MoveRel, GetMaxX, GetMaxY, GetX, GetY);

b) собственно рисование (Line, LineTo, LineRel, Arc, GetArcCoords, Circle, Sector, Ellipse, Rectangle, DrawPoly);

c) стиль линий и коэффициент сжатия изображения (SetLineStyle, GetLineSettings, SetAspeclRatio, GetAspectRatio).

3) Управление цветами и шаблонами заполнения (SetColor, GetColor, SetBkColor, GetBkColor, GetMaxColor, GetPalette, GetPaletteSize, GetDefaultPalette, SetPalette, SetAllPalette, SetRGBPalette, SetFillStyle, SetFillPattern, GetFillPattern, GetFillSettings, SetGraphBufSize, FillPoly, FillEIIipse, FloodFill, PicSlice, Bar, Bar3D).

4) Битовые операции (PutPixel, GetPixel, ImageSize, Getlmage, Putlmage).

5) Управление страницами (SetActivePage, SetVisualPage).

6) Графические окна (вьюпорты) (SetViewPort, GetViewSettings, ClearViewPort).

7) Управление выводом текста (RegisterBGIFont, lnstallUserFont, OutText, OutTextXY, SetTextStyle, SetTextJustify, SetUserCharSize, GetTextSettings, GetTextHeight, TextWidth).

 


Дата: 2019-05-29, просмотров: 166.