| GetModeRange(CurrentDriver,modeLo,modeHi); { диапазон }
| for mode:=modeLo to modeHi do begin { цикл по режимам }
| SetGraphMode( mode ); { включение режима }
| Line( 0, 0, 639, 479); { рисование линии }
| ReadLn { ожидание ввода }
| end; {for}
| CloseGraph { закрытие графики }
| END.
Рис. 19.6
19.2.4.3. Процедура RestoreCRTMode. При написании некоторых пакетов, использующих и графические, и текстовые режимы работы ПЭВМ, может оказаться полезной процедура RestoreCRTMode, которая возвращает систему в текстовый режим, работавший до инициализации графики. Казалось бы, уже есть процедура с подобным действием — CloseGraph. Однако после нее возврат в графический режим должен проводиться через процедуру InitGraph, что довольно сложно (см. рис. 19.1). Если же воспользоваться процедурой RestoreCRTMode, то возвращение в графику будет достаточно простым (рис. 19.7).
| USES Graph; { подключен модуль Graph }
| {$I initgraf.pas} { процедура инициализации }
| CONST { константы-сообщения: }
| graph_str = 'Это графический режим';
| text_str = 'А это текстовый режим';
| graph_back = 'А это снова графический режим';
| BEGIN
| GrInit; { инициализация графики }
| Line(0,0,GetMaxX,GetMaxY ); { диагональ экрана }
| OutTextXY(0,100,graph_str); { вывод первого сообщения }
| ReadLn; { пауза до нажатия ввода }
| RestoreCRTMode; { восстановление текстового режима }
| Write( text_str ); { вывод второго сообщения }
| ReadLn; { пауза до нажатия ввода }
Рис. 19.7
- 419 -
| SetGraphMode(GetGraphMode); { восстановление графи- }
| { ческого режима }
| Line(0,0,GetMaxX,GetMaxY); { диагональ экрана }
| OutTextXY(0,100,graph_back); {вывод третьего сообщения }
| ReadLn; { пауза до нажатия ввода }
| CloseGraph { закрытие графики }
| END.
Рис. 19.7 (окончание)
Как видно из примера, обратное переключение осуществляется при помощи функции GetGraphMode, которая возвращает номер текущего графического режима. При работе RestoreCRTMode выгрузки графического драйвера не происходит, т.е. он остается в памяти активным. Это и есть основное преимущество процедуры RestoreCRTMode. Предупреждаем, что обратное включение графики устанавливает в исходное состояние все графические параметры модуля Graph. Кроме того, подобные переключения, к сожалению, сбрасывают изображение с экрана.
19.2.5. Управление режимом вывода отрезков на экран
При рисовании отрезков на экране можно назначать режим поразрядного совмещения изображений. От него зависит, будет ли стерта при наложении двух точек «нижняя», и каким способом можно снять «верхнее» изображение с экрана. Управляя этим режимом, можно получать эффекты мультипликации. Сам режим задастся процедурой
SetWriteMode( WriteMode : Integer ).
Для задания параметра WriteMode в модуле Graph описаны пять констант, каждой из которых соответствует поразрядная операция (табл. 19.5).
Таблица 19.5
Имя константы | Значение | Логическая операция | Ее действие |
CopyPut | MOV | Замещение | |
XORPut | XOR | Исключающее 'Или' | |
ORPut | OR | 'Или' | |
ANDPut | AND | 'И' | |
NOTPut | NOT | 'НЕ' |
- 420 -
Поскольку рисование на экране, по сути, является действием с битами, при прорисовке точек производятся логические операции между битами памяти монитора и битами изображения. Для описываемой процедуры разрешены только первые две операции: первая — замещение (очистка перед прорисовкой) и вторая (очень интересная) — XOR. Дело в том, что две последовательно проведенные логические операции XOR приведут биты памяти монитора в исходное состояние. Фактически это означает, что если есть какое-нибудь изображение на экране, то использовав его в качестве фона и нарисовав на нем картинку, можно восстановить его, прорисовав картинку еще раз (рис. 19.8). При инициализации и после смены режимов устанавливается режим CopyPut.
| Graph, CRT; { подключены Graph и CRT }
| {$I initgraf.pas} { процедура инициализации }
| VAR