19.2.4. Очистка экрана и переключение режимов
19.2.4.1. Очистка графического экрана. Две следующие процедуры выполняют почти одинаковые действия, только первая из них
- 417 -
| USES Graph; { подключен модуль Graph }
| {$I initgraf.pas} { процедура инициализации }
| BEGIN
| GrInit; { инициализация графики }
| OutTextXY( 40, 40, { выводится имя драйвера: }
| 'У меня используется драйвер типа ' + GetDriverName );
| ReadLn; { пауза до нажатия ввода }
| CloseGraph { закрытие режима графики }
| END.
Рис. 19.5
является как бы подмножеством второй:
ClearDevice
очищает графический экран и устанавливает указатель позиции в положение (0, 0), а процедура
GraphDefaults
кроме очистки экрана, устанавливает ряд параметров графической системы:
1) графическое окно становится равным размеру экрана;
2) восстанавливается системная цветовая палитра;
3) переназначаются цвета основных линий и фона экрана;
4) толщина и стиль линий принимаются как по умолчанию;
5) цвет и шаблон заливки геометрических фигур и замкнутых ломаных принимается как по умолчанию;
6) переустанавливается активный шрифт и его стиль. Процедура GraphDefaults неявно вызывается при инициализации графики и выполняет, no-сути, все стартовые установки графических параметров.
19.2.4.2. Переключение режимов. Оно осуществляется процедурой
SetGraphMode(GraphMode : Integer),
которая переключает систему в указанный параметром GraphMode графический режим и очищает экран монитора. При этом все дополнительные характеристики устанавливаются по умолчанию. Чтобы предостеречь от ошибок, вызванных кажущейся простотой переключения, укажем, что такие переключения возможны только в рамках текущего драйвера — иначе необходимо реинициализировать систему (рис. 19.6).
- 418 -
| USES Graph; { подключен модуль Graph }
| {$I initgraf.pas} { процедура инициализации }
| VAR
| mode, modeLo, modeHi : Integer; { номера режимов }
| BEGIN
| GrInit; { инициализация }
| 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. Кроме того, подобные переключения, к сожалению, сбрасывают изображение с экрана.