Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Modul_Graph.docx
Скачиваний:
2
Добавлен:
09.08.2019
Размер:
44.58 Кб
Скачать

1.2.3. Процедуры работы с видеорежимами

Процедура DetectGraph

Для тестирования графического адаптера используется процедура DetectGraph, которая объявлена в модуле Graph следующим образом:

DetectGraph (VAR GraphDriver, GraphMode : INTEGER)

Эта процедура может быть вызвана до инициализации графического режима. Через параметр GraphDriver возвращается номер драйвера через параметр GraphMode – значение соответствующего этому драйверу режима. Эти значения и рекомендуется подставлять в качестве фактических параметров в процедуру InitGraph.

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

USES Graph;

VAR

GrDriver,GrMode:INTEGER;

BEGIN

DetectGraph(GrDriver,GrMode); {режим автоопределения}

IF GrDriver=VGA THEN

BEGIN

GrDriver:=CGA; {замена режима VGA на CGA)

GrMode:=CGAHi;

END;

{инициализация указанного драйвера и режима}

InitGraph(GrDriver,GrMode, ‘ ‘ );

IF GraphResult <>0 THEN {в случае ошибки)

BEGIN

WriteLn('Ошибка графики!') ;

HALT(l);

END;

SetBkColor(LightBlue);

OutText('Графический режим.');

ReadLn;

CloseGraph;

END.

В этой программе принудительно устанавливается режим CGA вместо VGA. Это может быть необходимо, например, если графическая плата не может корректно работать в режиме VGA.

2. Построение изображений на экране

2.1. Система координат

Для построения изображения на экране в графическом режиме применяется система координат, несколько отличная от используемой в текстовом режиме. Отсчет начинается от верхнего левого угла экрана, который имеет координаты (0,0). Значение Х (столбец) увеличивается в направлении слева направо, значение Y (строка) – в направлении сверху вниз. При этом экран представляется в виде прямоугольного массива адресуемых точек, а не символов, как в текстовом режиме. Для различных типов адаптеров и режимов значения количества точек по вертикали и горизонтали могут существенно различаться (см. табл. 1.3). Определение значений максимальных координат экрана в модуле Graph реализовано с помощью функций

GetMaxX:INTEGER

GetMaxY:INTEGER

Если при адресации точек указываются значения координат, превышающие максимальные, операция игнорируется.

2.2. Управление текущим указателем

Чтобы построить изображение, необходимо обязательно указать начальную позицию. В текстовых режимах эту позицию определяет положение курсора, который размещается каждый раз за последним отображенным символом и указывает на местоположение следующего. В графических режимах видимого курсора нет, но есть невидимый текущий указатель СР (current pointer), выполняющий те же функции, что и курсор в текстовом режиме.

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

Процедура MoveTo (X,Y:INTEGER) перемещает текущий указатель в точку с координатами X, Y. Процедура MoveRel (dX,dY:INTEGER) перемещает СР на dX точек по горизонтали и на dY точек по вертикали относительно последнего положения текущего указателя. При задании положительных значений dX или dY значения соответствующих координат текущего указателя будут увеличиваться, при задании отрицательных – уменьшаться.

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

GetX:INTEGER

GetY:INTEGER

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

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

USES Graph;

VAR

GrDriver,GrMode:INTEGER;

BEGIN

GrDriver:=Detect;

InitGraph(GrDriver,GrMode,'');

IF GraphResultOO THEN

BEGIN

WriteLn{'Ошибка инициализации графики!'};

Halt(1);

END;

{перемещение в центр экрана}

MoveTo(GetMaxX DIV 2,GetMaxY DIV 2);

OutTextXY(GetX,GetY,'Указатель в центре');

{смещение указателя на некоторую величину}

MoveRel(-GetX DIV 2,-GetX DIV 2);

OutText('Указатель смещен') ;

ReadLn;

CloseGraph;

END.

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