Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

1. Процедура InitGraph (Var driver, mode: integer; path: string) - переключает экран в графический режим. При вызове процедуры следует объявить специальные переменные, куда занести константу драйвера и константу режима, и указать эти переменные в качестве параметров процедуры. Существует возможность запросить автоматическое определение драйвера и режи ма: для этого необходимо вместо константы драйвера в переменную, используемую в качестве параметра, записать константу detect = 0.

 

Идентификатор константы и номер режима   Количество цветов на экране   Количество точек на экране   Количество страниц в видеобуфере  
VGALo =0     640x200    
VGAMed = 1     640x350    
VGAHi = 2     640x480    

 

Параметр path должен содержать путь, определяющий местоположение файла, содержащего требуемый драйвер (обычно все драйверы находятся в подкаталоге BGI основного каталога среды Borland Pascal). Если драйвер находится в текущем каталоге, то в качестве параметра передается пустая строка – ‘’.

2. Функция GraphResult: integer - возвращает номер ошибки, обнаруженной при инициализации графического режима.

3. Функция GraphErrorMSG (ErrNum: integer): string - позволяет по номеру ошибки определить ее причину.

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

Var driver, mode, error: integer;

Begin

driver: =detect; {или driver: =0; }

InitGraph(driver, mode, 'd: \BP\BGF);

error: =GraphResult;

if error< > 0 then {если обнаружены ошибки}

begin

WriteLn('Ошибка инициализации графического режима', GraphErrorMSG'(error));

Halt(l); {аварийное завершение программы}

end; {работа в графическом режиме}...

4. Процедура CloseGraph - завершает работу в графическом режиме: выгружает драйвер и восстанавливает текстовый режим. Если завершить программу не выходя из графического режима, то нормальная работа MS DOS нарушается, так как MS DOS функционирует в текстовом режиме.

Если программа выполняется в среде программирования Borland Pascal, то среда сама восстановит текстовый режим после завершения работы программы.

5. Процедура RestoreCrtMode - осуществляет временный возврат в текстовый режим с сохранением графического изображения в видеобуфере.

6. Процедура SetGraphMode(mode: integer) - осуществляет возврат в графический режим после временного выхода, осуществленного процедурой RestoreCrtMode.

7. Функция GetGraphMode: integer - возвращает номер активного графического режима.

8. Таким образом, временный выход в текстовый режим обычно оформляется следующим образом:

RestoreCrtMode; {переход в текстовый режим}... {выполнение обработки в текстовом режиме}

SetGraphMode(GetGraphMode); {возврат в графический режим}

Процедуры и функции управления цветом. Модуль Graph содержит специальные процедуры и функции управления цветом изображения.

1. Процедура GetPalette(Var Palette: PaletteType) - возвращает размер и цвета текущей палитры. Палитра при этом считывается в специальную переменную типа PaletteType, также определенного в модуле Graph:

Туре PaletteType = record

size: byte; {размер палитры}

Colors: array[O..MaxColors] of shortint; {цвета палитры}

end;

Цвета палитры кодируются десятичными числами от 0 до 63.

2. Процедура SetAllPalette(Palette: PaletteType) - осуществляет установку палитры. Новая палитра при этом записывается в переменную типа PaletteType, а цвета можно кодировать десятичными числами или использовать для их определения специальные константы:

{черный} {синий} {зеленый} {голубой} {красный} {фиолетовый} {коричневый} {светло-серый}
EGABlack = 0; EGABlue = 1; EGAGreen= 2; EGACyan = 3; EGARed = 4; EGAMagenta=S; EGABrown=20; EGALightGrey=7;

EGADarkGrey=56; {темно-серый}
EGALightBlue= 57; {светло-синий}
EGALightGreen = 58; {светло-зеленый}
EGALightCyan = 59; {светло-голубой}
EGALightRed = 60; {розовый}
EGALightMagenta = 61; {сиреневый}
EGAYellow = 62; {желтый}
EGAWhite = 63; {белый}

 

3. Процедура SetPalette(ColorNum, Color: word) - заменяет цвет в регистре палитры с номером ColorNum на цвет Color.

4. Процедура SetBkColor(Color: word) - устанавливает новый цвет фона. При инициализации графического режима видеобуфер очищается (обнуляется). При этом все точки оказываются связаны с 0 регистром палитры, который и считается регистром, хранящим цвет фона. Процедура SetBkColor записывает в 0 регистр палитры цвет, указанный в параметре Color. Результат вызова этой процедуры аналогичен результату вызова процедуры SetPalette(0, Color).

5. Процедура SetColor(ColorNum: word) - объявляет цвет в регистре с номером ColorNum текущим цветом рисования.

6. Процедура GetDefaultPalette(var Palette: PaletteType) - возвращает стандартную палитру.

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

SetPalette(5, 18); {записываем в 5-й регистр палитры цвет 010010 –

ярко-зеленый}

SetColor(5); {текущий цвет рисования - цвет 5-го регистра палитры}

SetBkColor(5); {записываем в 0-й регистр палитры цвет фона 000101 –

фиолетовый: фон сразу меняет цвет}

GetPalette(p); {читаем палитру в переменную р типа PaletteType}

for i: =0 to p.size do Write(p.colors[i]: 5); {выводим цвета палитры на экран}

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

1. Процедура SetLineStyle(style, pattern, thickness: word) - устанавливает стиль style или образец pattern линии и ее толщину thickness.

Для установки стиля используют следующие константы:

SolidLn=0; {сплошная}

DottedLn=l; {точечная}

CenterLn=2; {штрихпунктирная}

DashedLn=3; {пунктирная}

UserBitLn=4; {определенная программистом в образце}

Если указаны стили 0..3, то образец игнорируется. Если установлен стиль 4, то вид линии определяется образцом.

Образец линии - 16 или 48 бит, заданных шестнадцатеричным числом, единицы и нули кодируют точки и пропуски, например: комбинация 1010 1010 1010 1010, которая соответствует шестнадцатеричному числу $АААА, означает линию из частых точек. Образцы из 48 бит используют для определения вида линии тройной толщины.

Толщину линии можно установить одинарной и тройной, соответствующие константы выглядят следующим образом:

NormWidth=l; {нормальная толщина линии}

ThickWidth=3; {тройная толщина линии }

Например:

SetLineStyle(UserBitLn, $AAAA, NormWidth); {устанавливает текущий

стиль линии: частые точки, линия одинарной толщины}

2. Процедура SetFillStyle(fillstyle, color: word) - устанавливает образец fillstyle и цвет color штриховки замкнутых контуров. Для определения образцов штриховки можно использовать следующие константы:

EmptyFill=0; {без штриховки - прозрачный контур}

SolidFill=l; {сплошная заливка}

LineFHI=2; {—— - горизонтальные линии}

LtSlashFill=3; {//// - тонкие линии}

SlashFill=4; {//// - толстые линии}

BkSlashFill=5; {\\\\ - толстые линии}

LtBkSlashFlll=6; {\\\\ - тонкие линии}

HatchFill=7; {++++ - клетка горизонтальная}

XHatchFlll=8; {хххх - клетка диагональная}

InterLeaveFill=9; {+ + + - клетка редкая}

WideDotFill=10; {.... -точки редкие}

CloseDotFill=ll; {........- точки частые}

UserFill=12; {стиль, определенный программистом}

3. Процедура SetFittPatern (: FillPaternType; color: word) - устанавливает пользовательский образец fillPatern и цвет color штриховки. Образец штриховки задают с помощью переменной специального типа:

Type FillPatternType = array [1.. 8] of byte;...

Переменная этого типа определяет квадрат 8x8 точек, где биту, установленному в 1, соответствует точка заданного цвета, а биту, установленному в О - точка цвета фона.

Например:

Const PLFillPaternType = ($AA, $55, $АА, $55, $АА, $55, $АА, $55);

Р1 определяет квадрат 8x8 точек следующего вида:

На экране при штриховке данным стилем мы будем видеть частые ромбы.

 

4. Процедура FloodFill(x, у, color: word) - закрашивает текущим образцом и цветом закраски, установленными процедурой SetFillStyle, область, ограниченную контуром цвета color, внутри которой находится точка с координатами (х, у). Если контур не замкнут, то будет закрашен весь экран.

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

1. Процедура PutPixel (x, у, color: word) - рисует точку цветом, определенным в регистре палитры с номером color, в точке экрана с координатами (х, y).

2. Функция GetPixel(x, y: word): word - возвращает номер регистра палитры, определяющего цвет точки с указанными координатами.

3. Функция MoveTo(x, y: word): word - задает положение текущей точки - точки, используемой в качестве исходной при рисовании линий или выводе текста.

4. Процедура MoveRel(dx, dy: word) - задает положение текущей точки относительно ее предыдущего положения.

5. Функции GetX: word и GetY: word - возвращают соответственно координаты х и у текущей точки.

6. Функции GetMaxX: word и GetMaxY: word - возвращают соответственно максимальные размеры экрана в точках для текущего режима

7. Процедура Line(xl, yl, x2, y2: word) - рисует линию из точки (xl, yl) в точку (х2, у2).

8. Процедура LineTo(x, y: word) - рисует линию из текущей точки в точку (х, у).

9. Процедура LineRel(dx, dy: word) - рисует линию из текущей точки в точку, отстоящую от текущей на dx, dy.

10. Процедура Rectangle(xl, yl, x2, y2: word) - рисует прямоугольник по координатам левого верхнего и правого нижнего углов.

11. Процедура Bar(xl, yl, x2, y2: word) - рисует заштрихованный прямоугольник с заданными координатами текущим цветом и закрашивает его текущим образцом закраски.

12. Процедура Bar3D(xl, yl, x2, y2, depth: word; top: boolean) - рисует параллелепипед, у которого: размер передней грани определяется координатами xl, yl, х2, у2; глубина depth обычно задается равной 25% ширины, а параметр top - определяет, рисовать ли верхнюю грань (да, если true, и нет, если false). Верхнюю грань не рисуют, если необходимо изобразить несколько параллелепипедов, стоящих друг на друге. Передняя грань закрашивается текущим образцом и цветом закраски.

13. Процедура DrawPoly(numPoints: word; var Poly Points) - рисует ломаную линию. Первый параметр определяет количество вершин ломаной, а второй - координаты этих вершин в массиве элементов специального типа PointType:

Type PointType = record

x, y: word;

end;...

Например:

Var MP: array[5] of PointType; {объявление массива координат точек}

DrawPoly(5, MP); {рисуем ломанную линию}

14. Процедура FlllPoly (numPoints: word; Var PolyPoints) - рисует закрашенный многоугольник.

15. Процедура Circle (х, у, radius: word) - рисует окружность заданного радиуса radius с центром в точке (х, у).

16. Процедура Агс (х, у, stangle, endangle, radius: word) - рисует дугу окружности указанного радиуса radius от угла stangle до угла endangle. Углы отсчитываются от положительного направления оси абсцисс против часовой стрелки и указываются в градусах.

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

17. Процедура GetArcCoord (Var ArcCoo: ArcCoordType) - возвращает координаты концов дуги через параметр-переменную специального типа ArcCoordType, который описан следующим образом:

Type ArcCoordType = record

х, у, {центр дуги},

xstart, ystart, {начало дуги},

xend, у end: word {конец дуги}

end;

Например, нарисуем дугу и соединим ее концы:

Var ArcCoords: ArcCoordType;

Arc(100, 100, 0, 270, 30); {рисуем дугу}

GetArcCoords(ArcCoords); {определяет координаты концов дуги}

with ArcCoords do

Line(Xstart, Ystart, Xend, Vend); {рисуем соединяющую линию}

18. Процедура Pieslice (х, у, stangle, endangle, radius: word) - рисует заштрихованный сектор или окружность (если конечный угол равен начальному). Углы отсчитываются от положительного направления оси абсцисс против часовой стрелки и указываются в градусах.

19. Процедура Ellipse (х, у, stangle, endangle, radiusX, radiusY: word) - рисует эллипс или его дугу.

20. Процедура Sector (x, у, stangle, endangle, radiusX, radiusY: word) - рисует заштрихованный эллипс или его сектор.

21. Процедура FillEllipse (x, у, radiusX, radius Y: word) - рисует заштрихованный эллипс.

Процедуры и функции управления текстом. Текст в графическом режиме может быть выведен процедурами Write и WriteLn, но при этом управление выполняется аналогично текстовому режиму. Специально для работы с текстом в графическом режиме модуль Graph предлагает следующие процедуры и функции.

1. Процедура SetTextStyle(font, direction, charsize: word) - устанавливает текущий шрифт font, направление вывода строки direction и размер шрифта charsize.

Для установки шрифта используют специальные константы:

 

DefaultFont=0; {обычный}

TriplexFont=l; {трипленый}

SmallFont=2; {мелкий}

SanSerifFont=3; {прямой}

GothicFont=4; {готический}

Направление вывода может быть либо горизонтальным, либо вертикальным:

HorizDlr=0; {горизонтальное направление}

VertDir=l; {вертикальное направление}

Размер шрифта указывается значением, на которое необходимо умножить исходный размер шрифта (8x8 точек). Таким образом, шрифт можно увеличивать в целое число раз.

2. Процедура SetTextJustify(goriz, vert: word) - устанавливает способ выравнивания для горизонтального goriz и вертикального vert направлений вывода. Способ выравнивания определяется относительно некоторой точки с помощью специальных констант:

LeftText=0; {точка слева от текста}

CenterText=l; {точка по центру текста при горизонтальном направлении вывода}

RightText=2; {точка справа от текста}

BottomText=0; {точка под текстом}

CenterText=l; {точка по центру текста при вертикальном направлении вывода}

TopText=2; {точка над текстом}

 

3. Функция TextHeight(st: string): word - возвращает высоту строки st в точках возвращает ширину строки st в точках.

4. Функция TextWidth(st: string): word - возвращает ширину строки st в точках.

5. Процедура OutText (st: string) - выводит строку, выравнивая ее заданным способом относительно текущей точки.

6. Процедура OutTextXY(x, y: word; st: string) - выводит строку st, выравнивая ее в соответствии с установленными режимами вертикального и горизонтального выравнивания относительно точки (х, у).

Процедуры управления окнами, страницами. Помимо управления цветом, рисования примитивов и вывода текстов модуль Graph содержит специальные процедуры управления окнами и страницами.

1. Процедура ClearDevice - очищает экран.

2. Процедура SetViewPort (xl, yl, x2, y2: word; clip: boolean) - устанавливает окно. Параметры xl, yl, х2, у2 определяют размеры окна, а параметр clip - будут ли видимы фрагменты рисунка, вышедшие за границы окна.

3. Процедура GetViewSettings(Var win: VlewPortType) - возвращает параметры последнего окна через параметр-переменную win типа ViewPortType:

Type ViewPortType: = record

xl, yl, x2, y2: word; {координаты}

Clip: boolean; {отсечение}

end;...

4. Процедура ClearViewPort - очищает окно, связывая все точки этого окна с 0 регистром палитры.

5. Процедура SetActivePage (pageNumber: word) - переключает активную страницу - делает активной страницу с указанным номером pageNumber. На активной странице строится нужное изображение, в то время как высвечиваться продолжает прежняя страница. Когда изображение готово, осуществляют переключение видимости страниц и появляется новое изображение.

6. Процедура SetVisualPage(pageNumber: word) - переключает видимость страниц. Например:

SetVisualPage(O); {установили видимой 0 страницу}

SetActivePage(l); {установили активной 1 страницу}

Rectangle(10, 60, 30, 80); {вывели прямоугольник}

Readln; {убедились, что он не видим}

SetVisualPage(l); {установили видимой 1 страницу –

прямоугольник стал видимым}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.