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

Программирование. Модуль GRAPH. Модульное и объектное программирование. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
841 Кб
Скачать

31

End;

End.

Функция TextWidth

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

Заголовок: Function TextWidth (Txt:string):Word;

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

SetTextStyle и SetUserCharSize.

Функция TextHeight

Возвращает высоту шрифта в пикселах.

Заголовок: Function TextHeight (Txt:string):Word;

Процедура GetTextSettings

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

Заголовок: Procedure GetTextSettings (var TextInfo: TextSettings Type);

Здесь, TextInfo –переменная типа TextSettingsType, который в модуле Graph определен следующим образом:

Type

TextSettingsType=Record

Font :Word; {номер шрифта} Direction:Word; {направление} CharSize :Word; {код размера}

Horiz:

:Word; {горизонтальное выравнивание}

Vert

:Word; {вертикальное выравнивание}

End;

Функция InstallUserFont

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

Заголовок: Function InstallUserFont (FileName: String): integer;

Здесь, FileName –имя файла, содержащего векторный шрифт. Функция возвращает идентификационный нестандартный шрифт,

который может использоваться при обращении к процедуре SetTextStyle.

1.8. Координаты окна, страницы

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

Положение этого указателя задается относительно левого верхнего угла, который имеет координаты (0, 0). Таким образом, горизонтальная

32

координата экрана увеличивается слева направо, а вертикальная – сверху вниз.

Функции GetMax X и GetMax Y.

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

Пример:

Program DemoGet; User

Graph;

Var

a,b:Integer;

Begin

a:=Detect;

InitGraph (a, b, 'C: \Bp\BGI'); Writeln (GetMaxX, GetMaxY; 5); Readln;

CloseGraph;

End.

Функции GetX и GetY

Возвращают значение типа integer , содержащее текущие координаты указателя соответственно по горизонтали и по вертикали. Координаты определяются относительно левого верхнего угла окна или, если окно не установлено, то экрана.

Процедура SetViewPort

Устанавливает прямоугольное окно на графическом экране.

Заголовок: Procedure SetViewPort (X1,Y1,X2,Y2:integer; ClipOn:Boolean);

Здесь, X1 и Y1 – координаты левого верхнего, X2 и Y2 – координаты правого нижнего углов экрана; ClipOn – выражение Boolean, определяющее «отсечку» не уменьшающихся в окне элементов изображения.

Координаты окна задаются относительно левого верхнего угла экрана. Если параметр ClipOn имеет значение True, элементы изображения, не уменьшающиеся в пределах окна, отсекаются, в противном случае границы окна игнорируются. Для управления этим параметром можно использовать константы:

Const

ClipOn=True; {включить отсечку} ClipOff=False; {не включать отсечку}

33

Пример: Построить в центре экрана концентрические окружности. Затем при нажатии на клавишу Enter отобразить фрагмент исходного рисунка в центре экрана.

Program DemoViravniv; Uses

Graph;

Var

GrDriver, GrMode, i, j: Integer;

Begin

GrDriver:= Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI'); SetBkColor (Blue);

Readln;

ClearDevice;

SetViewPort(round(GetMaxX/8),round(GetMaxY/8),

Round(GetMaxX/2),round(GetMaxY/2),ClipOn); SetBkColor (Red);

Readln;

Readln;

End.

Данная программа наглядно демонстрирует использование оператора SetViewPort. Он только ограничивает размеры окна. Например, процедура SetBkColor (Red) закрашивает весь экран красным цветом, а не только окно.

Процедура GetAspectRatio

Возвращает два числа, позволяющие оценить соотношение сторон экрана.

Заголовок: Procedure GetAspectRatio (var X,Y:Word);

Здесь, X и Y –переменные типа Word. Значения, возвращаемые в этих переменных, позволяют вычислить отношение сторон графического экрана в пикселях. Найденный с их помощью коэффициент может использоваться при построении правильных геометрических фигур, таких как окружности, квадраты и т.п. Например, если необходимо построить квадрат со стороной L- пиксель по вертикали, необходимо использовать конструкции:

GetAspectRatio (Xap, Yap);

Rectangle (X1,Y1,X1+L,*round (Yap/Xap),Y1+L);

Если L определяет длину квадрата по горизонтали, то используется оператор:

Rectangle (X1,Y1,X1+L,Y1+L*round (Xap/Yap));

34

Процедура SetAspectRatio

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

Заголовок: Procedure SetAspectRatio (X,Y:Word);

Здесь, X и Y – устанавливаемые соотношения сторон.

Пример: Построить 20 окружностей с разными соотношениями сторон экрана.

Program DemoRatio; Uses

Graph;

Var

GrDriver, GrMode: Integer; k,X1,Y1:Word

Begin

GrDriver:= Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI'); SetBkColor (Blue);

GetAspectRatio (X1, Y1); For k:=1 To 20 Do

Begin

SetAspectRatio (X1*10*k, Y1); Circle(GetMax div 2, GetMaxY div 2,50);

Readln;

End.

Процедура SetActivePage

Делает активной указанную страницу видеопамяти.

Заголовок: Procedure SetActivePage (PageNum:Word);

Здесь, PageNum – номер страницы.

Процедура может использоваться только с адаптерами, поддерживающими многостраничную работу (EGA, VGA и т.п.). Эта процедура фактически просто переадресует графический вывод в другую область видеопамяти, однако вывод текста с помощью Write, Writeln всегда осуществляется только на страницу, которая является видимой в данный момент.

Пример: Программа сначала рисует розовый шарик на 0 странице, затем создает елочку на невидимой странице. После нажатия Enter несколько раз меняет их местами.

Program DemoRatio; Uses

Graph;

Var

GrDriver, GrMode: Integer; k,X1,Y1:Word

Begin

GrDriver:=VGA;

35

GrMode:=1;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI');

SetBkColor (Green);

SetColor (LightRed);

SetFillStyle(1,LightRed);

ClearDevice;

FillEllipse(200,200,70,100);

PieSlice(200,300,263,278,20);

SetColor (Yellow);

Line(200,300,180,310);

SetActivePage(1);

SetBkColor (Blue);

SetColor (Green);

SetFillStyle(11,Cyan);

PieSlice(200,100,269,272,250);

PieSlice(200,230,210,332,90);

PieSlice(200,200,210,332,60);

PieSlice(200,175,210,332,40);

PieSlice(200,145,229,312,35);

PieSlice(200,120,249,292,30);

Readln;

SetVisualPage(1);

Readln;

SetVisualPage(0);

Readln;

SetVisualPage(1);

Readln;

SetVisualPage(0);

Readln;

End.

Процедура MoveTo

Устанавливает новое текущее положение указателя.

Заголовок: Procedure MoveTo(X,Y:integer);

Здесь, X и Y – новые координаты указателя по горизонтали и вертикали соответственно. Координаты определяются относительно левого верхнего угла окна или, если оно не установлено, экрана.

Процедура MoveRel

Устанавливает новое положение указателя в относительных координатах.

Заголовок: Procedure MoveRel(DX,DY:integer);

36

Здесь, DX и DY – приращение новых координат указателя по горизонтали и вертикали соответственно.

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

Процедура ClearDevice

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

Заголовок: Procedure ClearDevice;

Процедура ClearViewPort

Очищает графическое окно, а если окно не определено, то весь экран.

При очистке окно заполняется цветом номер 0 из текущей палитры. Указатель перемещается в левый верхний угол окна.

Заголовок: Procedure ClearViewPort;

1.9. Сохранение и выдача изображений

Функция ImageSize

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

Заголовок: Function ImageSize (X1,Y1,X2,Y2:integer):Word;

Здесь, X1 и Y1 – координаты левого верхнего, X2 и Y2 – координаты правого нижнего углов фрагмента изображения.

Процедура GetImage

Помещает в память копию прямоугольного фрагмента изображения.

Заголовок: Procedure GetImage (X1,Y1,X2,Y2:integer; Var Buf);

Здесь, X1Y2 – координаты углов фрагмента изображения; Buf – переменная или участок кучи, куда будет помещена копия видеопамяти с фрагментом изображения.

Размер Buf должен быть не меньше значения, возвращаемого функцией ImageSize с теми же координатами X1Y2.

Процедура PutImage

Выводит в заданное место экрана копию фрагмента изображения, ранее помещенную в память процедурой GetImage.

Заголовок: Procedure PutImage (X,Y,:integer; Var Buf, Mode:Word);

Здесь, X1Y2 – координаты левого верхнего угла того места, на экране, куда будет скопирован фрагмент изображения; Buf – переменная

37

или участок кучи, откуда берется изображение; Mode – способ копирования.

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

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

Const

NormalPut=0; {замена существующего изображения копией} XorPut=1; {исключительное ИЛИ}

OrPut=2; {объединительное ИЛИ} AndPut=3; {логическое И} NotPut=4; {инверсия изображения}

Наиболее часто используются операции NormalPut, XorPut, NotPut. Первая просто стирает часть экрана и на это место помещает копию из видеопамяти в том виде, в каком она сохраняется. Операция NotPut делает тоже самое, но копия выводится в инверсном виде. В цветном режиме, например, для пиксела цвета White (код 15 в двоичном виде 1111) эта операция дает код 0000=0=Black, для Red=4=0100 получим 1011=11=LightCyan…. Операция XorPut, примененная к тому же месту экрана, откуда была получена копия, сотрет эту часть экрана. Таким способом довольно просто перемещать изображение по экрану, создавая иллюзию движения.

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

Program NLO; Uses

Graph, CRT;

Var

GrDriver, GrMode,size,x,y: Integer; Shura:Pointer; ch:Char;

Begin

GrDriver:=Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI'); SetBkColor (Blue); {Создаем летающую тарелку} SetColor (Black);

SetFillStyle(1,Green);

38

ClearDevice;

FillEllipse(50,50,30,10);

Ellipse(50,50,180,360,30,4); SetColor (White); Line(45,45,25,25); Line(55,45,75,25);

Size:=ImageSize(25,25,90,90); {Помещаем в память} GetMem(Shura,Size);

Readln;

GetImage(20,25,80,80,Shura^);

ClearDevice;

x:=100;

y:=100;

Repeat {Управление тарелкой}

PutImage(x,y, Shura^,1); ch:=ReadKey;

Case ch Of

#77: x:=x+10; #75: x:=x-10; #80: y:=y+10; #72: y:=y-10;

End; Until ch=#32; CloseGraph;

End.

39

2. ПОЛЬЗОВАТЕЛЬСКИЕ МОДУЛИ

Объем программы на языке Паскаль должен быть не более 64 Кбайт. Но если текст программы превышает 64 Кбайт, надо разбить программу на ряд модулей: основную программу и один или более модулей (Unit). Текст каждого из них должен быть не более 64 Кбайт.

Модуль - это библиотека подпрограмм, автономно компонуемая программная единица на языке Паскаль. Он может включать разделы описаний и операторы инициирующей части модуля. Все разделы модуля можно использовать в других модулях и программах, подключив к ним данный модуль с помощью оператора Uses.

Модули могут быть в виде PAS-файлов с исходными текстами в виде объектных модулей (TPU-файлы). Компилятор Паскаль размещает объектные модули в отдельном сегменте памяти: в файлах с расширением

.TPU. Максимальная длина сегмента модуля может быть не более 64 Кбайт. Но количество используемых модулей ограничивается только доступной внешней памятью.

2.1. Структура модулей

Структура модулей на языке Паскаль имеет следующую структуру:

Unit имя_модуля;

Inteface

{Интерфейсная часть}

Implementation

{Секция реализации} {Begin инициирующая часть}

End.

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

Модуль может использовать подпрограммы других модулей. Оператор Uses в вызывающей программе должен быть после оператора Program, а в модуле – после ключевого слова interface.

Модуль System (со стандартными процедурами и функциями) подключается всегда автоматически. Все модули, названные в операторе Uses, компилятор ищет в файле Turbo.TPL (системных библиотеках), в файлах типа .TPU (библиотеках пользователя) или в файлах типа .PAS. Поиск файлов ведется сначала в текущем каталоге, затем в каталогах, заданных в списке каталогов файлов, определенных в меню

Options\Directories\Unit directories.

40

2.2. Интерфейсная часть модуля

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

Структура интерфейсной части:

Interface Uses Label Const Type Var

{Заголовки процедур и функций модуля}

Глобальные объекты и оператор Uses необязательны. Правила описания констант, типов и переменных идентичны правилам их описания в программах и подпрограммах. Все константы и переменные, объявленные в интерфейсной части модуля, как и глобальные переменные вызывающей программы, помещаются в один общий сегмент данных длиною не более 65521 байт.

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

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

2.3.Исполняемая часть модуля

Исполняемая часть модуля начинается словом Implementation и содержит объявление локальных объектов модуля и тела (тексты) всех процедур и функций, заголовки которых даны в интерфейсной части, и локальные подпрограммы. После слова Implementation могут быть объявлены объекты, локальные в модуле: типы, константы, переменные, метки.

Структура исполняемой части:

Implementation

{Локальные объекты модуля} {Заголовок подпрограммы} {Блок подпрограммы}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]