| with W do begin
| RestoreWin(StateWin); { окно W становится текущим }
| if Frame <> 0 then UnFrameWin; {если есть рамка, то снять }
| GotoXY( 1,1 );
| WriteWin(BufSave^); {восстановление картинки фона }
| RestoreWin(StateSave); {восстановление состояния фона }
| FreeMem(BufSave,Size); {удаление картинки фона }
| FreeMem(BufWin,Size) {удаление картинки окна }
| end {with}
| END;
| { -- ПРИМЕР ВЫЗОВОВ ПРОЦЕДУР —- }
| VAR
| WW : Array [1..4] of WindowType; { массив окон }
| i,k : Byte; { счетчики циклов }
| BEGIN
| FillWin{ #176, Cyan ); { закраска экрана }
| GotoXY( 1,1 );
| Write( 'Нажимайте клавишу ввода..,' );
| for k:=1 to 4 do begin
| OpenWin(10*k,2*k, 20*k, 4*k,'окно', { Открытие окон и }
| Black+k, Blue+k, k mod 3, WW[k]); { вывод в них: }
| TextAttr := 16*k + ( White-k );
| for i:=32 to 127 do begin
| Write( Chr(i) ); Delay(20)
| end;
| FreezeWin( WW[k], False ); { отмена активности }
| Delay( 200 ) { просто пауза 0.2с }
| end;
| ReadLn;
| for k:=4 downto 1 do begin
| ActivateWin( WW[k] ); { включение окна }
| for i:=128 to 255 do begin
| Write( Chr(i) ); Delay(20)
| end;
| FreezeWin( WW[k], False ); { отмена активности }
| Delay( 200 ) { просто пауза 0.2с }
| end;
| ReadLn; { стирание окон: }
| for k:=4 downto 1 do
| begin CloseWin(WW[k]); Delay(200) end;
| ReadLn
| END.
Рис. 20.7 (окончание)
- 484 -
Используя приведенные процедуры как базовые, можно построить более высокоуровневые процедуры работы с окнами. Мы же здесь хотели лишний раз показать, что грозно звучащие операции типа «сохранение окон» на деле вовсе не так сложны.
Можно пойти дальше и так организовать работу с окнами, чтобы менять формат окна при его восстановлении. В самом деле, изображение окна выводится процедурой WriteWin в текущее окно. Если формат текущего окна на экране будет иным при той же площади окна, то изображение при выводе будет переформатировано.
Непосредственная работа с видеопамятью требует, конечно, навыков и знания механизмов ее работы. Но эффекты, которые можно достичь, стоят того, чтобы посидеть несколько вечеров с ПЭВМ, изучая видеопамять.
20.4. Работа с образом экрана на диске
Запись текстового экрана на диск часто имеет смысл, если многие программы используют один и тот же сложно заполненный или раскрашенный экран. Записать экран, зная его стартовый адрес и размер, несложно, ибо он занимает сплошной промежуток памяти. Программа на рис. 20.8 показывает, как это сделать.
| USES CRT; { ДЕМОНСТРАЦИЯ ЗАПИСИ /ЧТЕНИЯ ЭКРАНА С ДИСКА }
| {$I get_ptr.inc} {функция GetScreenPtr (см. рис. 20.1) }
| {I get_par.inc) (функция GetScreenSize (см. рис. 20.2) }
| { Процедура сохранения текущего текст-экрана на диске }
| PROCEDURE SaveCurrentScreenOnDisk(FileName : String );
| VAR
| f : File; { бестиповый файл }
| Res : Word; { контрольное число }
| BEGIN
| Assign(f, FileName ); { файл открывается }
| Rewrite(f, GetScreenSize ); { буфер равен экрану }
| { Запись всего экрана как блока по адресу видеопамяти: }
| BlockWrite(f, GetScreenPtr^, 1, Res );
| if Res<> 1 { контроль записи }
| then Writeln(^G 'Сбой при записи'^G);
| Close(f) { закрытие файла }
| END.
Рис. 20.8
- 485 -
| { Процедура считывания текст-экрана с диска на экран. }
| { !!! Процедура не проверяет совпадение режимов }