15.4.1.1. Процедура Window(X1, Y1, X2, Y2: Byte). Эта процедуpa устанавливает текущее текстовое окно на экране согласно схеме на рис. 15.6.
(X1, Y1) |
Текстовое окно |
(X2, Y2) |
←─−── |
Все поле экрана |
(1, 1)
(Xmax, Ymax)
Рис. 15.6
Координаты диагонали окна X1, Yl, X2 и Y2 всегда отсчитываются от левого верхнего угла экрана в абсолютных координатах и должны удовлетворять следующим условиям:
1 <= Х1 < Х2 <= Xmax;
1 <= Y1 < Y2 <= Ymax.
При нарушении этих условий окно не создается.
Параметр Xmax может принимать два значения — 40 и 80 (при видеоадаптере MDA/Hercules — только 80), a Ymax — два или одно в зависимости от типа видеоадаптера: 25 (все типы) и 43 или 50 (адаптеры EGA или VGA соответственно).
После выполнения процедуры Window все операции, все действия с экраном относятся к той его части, которая определена координатами X1, Y1, X2, Y2. Отсчет строк и столбцов для позиционирования курсора теперь производится в координатах текущего окна, и позиция (1, 1) — это левый верхний угол окна. Часть экрана вне окна практически изымается из обращения и становится недоступной стандартным средствам языка.
Сразу после выполнения процедуры курсор устанавливается в позицию (1, 1) только что созданного окна. Очистка окна не производится.
При использовании процедуры Window следует помнить, что координаты очередного создаваемого окна всегда даются в «абсолют-{327}ных» экранных координатах, а не в относительных координатах последнего текстового окна.
После окончания работы программы, использующей окна, текущее окно автоматически становится равным полному экрану, так что заботиться об этом нет необходимости. Пример использования окон приведен на рис. 15.7.
PROGRAM Windows; { демонстрация текст-окон } USES CRT; { используется модуль CRT } VAR i: Byte; { параметр циклов for } BEGIN TextAttr:= White+16*Black; { цвет - белый на черном } ClrScr; for i:=1 to 112 do Write(‘* Полный Экран '); { вывод на основной экран } repeat TextAttr:= White+16*Red; { цвет - белый на красном } Window (5, 5, 20, 15); { задание одного окна } for i:=1 to 120 do Write ('* Окно 1 '); { вывод текста в это окно } ClrScr; { очистка первого окна } TextAttr:= White+16*Blue; { цвет - белый на синем } Window (40,10, 55,20); { задание другого окна } for i:=1 to 120 do Write ('* Окно 2 '); { вывод текста в это окно } ClrScr; { очистка второго окна } until KeyPressed; { цикл до нажатия клавиши } END. |
Рис. 15.7
|
Для программного опроса текущих координат окна на экране введены две специальные системные переменные модуля CRT — WindMax и WindMin.
15.4.1.2. Переменные WindMax и WindMin. Эти переменные имеют тип Word и хранят в себе закодированную информацию о размерах текущего окна на дисплее (см. процедуру Window). Поскольку максимальные значения координат текстовых окон в столбцах и строках не превышают 255, т.е. могут храниться в одном байте, каждая из переменных хранит одновременно координаты X и Y в младшем и старшем байтах соответственно. Извлечь значения X и {328} Y можно с помощью встроенных функций языка Турбо Паскаль Lo и Hi. Схема кодировки такова:
Х1:= Lo(WindMin) + 1; Х2:= Lo(WindMax) + 1;
Y1:= Hi(WindMin) + 1; Y2:= Hi(WindMax) + 1;
где X1, Yl, X2, Y2 — координаты диагонали окна (см. рис. 15.6).
Ко всем значениям добавлена единица. Это сделано для совмещения с экранными координатами, у которых начало расположено в верхнем левом углу дисплея и имеет координаты (1,1). В переменных же WindMax; и WindMin все значения отсчитываются от нуля (начало координат — точка (0,0)).
|
Переменные WindMin и WindMax являются единственным путем программного определения размеров текущего текстового окна. Надо только помнить схему кодировки значения и не забывать добавлять единицу.
15.4.1.3. Процедура ClrScr. Эта процедура очищает текущее текстовое окно, установленное процедурой Window или взятое по умолчанию (т.е. весь экран). При этом окно как бы «закрашивается» текущим цветом фона. Так, например, чтобы сделать поле экрана голубым, необходимо вставить в программу две строки:
TextBackGround(Blue);
ClrScr;
Процедура имеет дополнительный эффект — всегда устанавливает курсор в позицию с координатами (1,1) в текущем текстовом окне.
15.4.1.4. Процедура TextMode(М: Word). Она переключает текстовые режимы вывода информации на дисплей. Специально для этой процедуры в модуле CRT определены восемь констант (табл. 15.6).
Таблица 15.6
Имя = числовое значение | Разрешение экрана | Цветовой режим |
BW40 = 0 | 40x25 | Черно-белый при цветном адаптере |
CO40 = 1 или C40 = 1 | 40x25 | Цветной |
BW0 = 2 | 80x25 | Черно-белый при цветном адаптере |
CO80 = 3 или C80 = 3 | 80X25 | Цветной |
Mono =7 | 80x25 | Монохромный на дисплеях MDA/Hercules {329} |
Font8x8 = 256 | 80/40 x 43 80/40 x 50 | Цветной, адаптер EGA Цветной, адаптер VGA |
Все остальные числовые значения до 65535, не являющиеся суммой одной из указанных констант (0, 1, 2, 3, 7), и Font8x8, включают в процедуре TextMode режим С80. |
Эти константы задуманы как параметры процедуры, т.е. предлагается записывать операторы как TextMode (CO80), например для включения цветового режима, хотя вполне сработает и менее наглядный эквивалент TextMode (3).
В качестве параметра процедуры TextMode, кроме констант и просто чисел, может быть использована и системная переменная LastMode.
|
Необходимо сделать несколько замечаний по явно выделяющейся в перечне константе Font8x8. В переводе она означает «шрифт 8x8» и включает режимы большей текстовой вместимости дисплеев с видеоадаптерами EGA и VGA, в которых вместо стандартных шрифтов из матриц 8x14 и 8x16 подключаются более «низкие» шрифты с матрицей 8x8, что дает увеличение числа строк до 43 (EGA) или 50 (VGA). Эта константа является дополнительной, т.е. она должна прибавляться к выбранному коду режима, например:
TextMode (CO80 + Font8x8)
В этом случае включится цветовой режим CO80 одновременно со сменой разрешающей способности экрана с 80x25 на 80x43(50). Просто вызов TextMode(Font8x8) равносилен вызову TextMode (BW40+Font8x8).
В большинстве случаев режимы BWxx и СОхх не отличаются друг от друга, что всегда имеет место при использовании дисплеев с раздельным управлением цветовыми лучами (так называемые RGB-дисплеи).
Режим Mono, включенный при цветном видеоадаптере, может сбить палитру цветов для их «проявления» на монохромных дисплеях.
Кроме смены режима текстового изображения, команда TextMode обновляет значения системных переменных и производит переустановку цветовых атрибутов. Можно считать, что происходит выполнение следующих действий: {330}
Window(1, 1, Xmax,Ymax); {окно делается равным всему экрану}
DirectVideo <-- True; {включается режим прямого вывода }
CheckSnow <-- False; {отключается снятие "снега" (CGA) }
NormVideo; {устанавливается стартовый атрибут}
ClrScr; {экран очищается }
LastMode <-- Параметр; {параметр в TextMode запоминается }
Легко заметить, что «букет» эффектов от команды TextMode не располагает к слишком частому ее использованию в программе. Нормальное место процедуры TextMode — в начале программы и (или) в самом ее конце для включения и выключения режимов работы программы. С процедурой TextMode тесно связана уже упоминавшаяся системная переменная модуля CRT LastMode.
15.4.1.5. Переменная LastMode. В этой переменной сохраняется текстовый режим работы, который установлен последним выполнением процедуры TextMode.
Ее значения (типа Word) соответствуют разрешенным значениям параметров TextMode. Самое первое значение LastMode соответствует режиму, из которого запускалась программа.
С помощью переменной LastMode можно реализовать «хороший тон» работы программы, когда после ее выполнения восстанавливается исходный текстовый режим (рис. 15.8).
USES CRT; { программа использует модуль CRT } VAR StartMode: Word; { здесь сохранится значение режима } BEGIN StartMode:= LastMode; { сохранение стартового режима } ... { работа в разных режимах } TextMode (StartMode) { восстановление режима } END. |
Рис. 15.8