19.8. Графические окна
В системе BGI-графики вводится термин «viewport». Точного аналога этого слова в русском языке нет, если не считать заимствования «вьюпорт». Специальный словарь дает следующее разъяснение: «вьюпорт — это область просмотра, окно экрана, в компьютерной графике — часть пространства отображения, в которой изображается и просматривается часть моделируемого объекта». Мы будем использовать термин «графическое окно». При образовании графического окна получается как бы «экран в экране» заданного размера. В модуле Graph для описания графического окна объявлен следующий тип и две константы:
| TYPE
| ViewPortType = RECORD
| X1, Y1, X2,Y2 : Integer; { границы окна }
| Clip : Boolean; { режим отсечения }
| END;
| CONST
| ClipOn = True; { отсечение по границе окна включено }
| ClipOff = False; { отсечение по границе окна выключено }
Здесь первые элементы записи — это координаты прямоугольной области (графического окна), как их принято задавать, a Clip — это параметр, указывающий графической системе, что делать с изобра-
- 457 -
жением, попавшим за пределы этой области. Clip может принимать два значения. Значение ClipOn указывает на то, что все элементы изображения (например, линия line(X3, Y3, X4, Y4) на рис. 19.31) обрезаются по границам графического окна, a ClipOff указывает на то, что все рисуется без изменений, как бы «не глядя» на границы окна.
Рис. 19.31
Объявление графического окна производится процедурой
SetViewPort( Х1, Y1, Х2, Y2 : Integer; ClipMode : Boolean )
где входные параметры соответствуют полям записи типа ViewPortType. После выполнения этой процедуры все текущие установки станут относиться к окну. Текущий указатель (графический курсор) установится в его левый верхний угол, и туда же переносится начало системы координат устройства. Другими словами, мы получим локальную систему координат устройства. Если параметры процедуры заданы неправильно, то функция GraphResult возвратит ошибку grError (-11).
Назначение графического окна можно использовать для перемещения начала системы координат. Так, если задать окно вызовом
SetViewPort( GetMaxX div 2, GetMaxY div 2, GetMaxX, GetMaxY, ClipOff );
то получим систему координат с началом в центре экрана. При этом станет «видимой» адресация отрицательных координат. Графическое окно не меняет масштаба системы координат, а лишь выбирает систему отсчета адресуемых пикселов.
Для опроса текущих параметров графического окна служит процедура
GetViewSettings( VAR ViewSettings : ViewPortType )
- 458 -
Если воспользоваться ею сразу же после инициализации графического режима, то обнаружится, что графическим окном является весь экран. Это говорит о том, что для системы безразлично, какое графическое устройство отображает результат, поскольку графическое окно представляет собой некоторый универсальный интерфейс между графической программной системой и графическим устройством вывода.
Для очистки рабочего пространства графического окна в модуле Graph существует специальная процедура
ClearViewPort
Она работает следующим образом:
1) устанавливает цвет заполнения равным текущему цвету фонда;
2) вызывает процедуру Bar с теми же значениями координат; что и у процедуры SetViewPort, вызванной перед этим;
3) перемещает текущий указатель в точку (0, 0).
Несмотря на то, что понятие графического окна является общим для всех процедур и функций, одна процедура все же работает не по правилам: процедура PutImage в силу особенностей программной реализации работает одинаково как для значения параметра Clip, равного ClipOn, так и для ClipOff. Помните об этом, и обязательно проверяйте в программе условия помещения всего изображения в графическом окне.