| 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 в текущее окно. Если формат текущего окна на экране будет иным при той же площади окна, то изображение при выводе будет переформатировано.

Непосредственная работа с видеопамятью требует, конечно, навыков и знания механизмов ее работы. Но эффекты, которые можно достичь, стоят того, чтобы посидеть несколько вечеров с ПЭВМ, изучая видеопамять.

<p>20.4. Работа с образом экрана на диске</p>

Запись текстового экрана на диск часто имеет смысл, если многие программы используют один и тот же сложно заполненный или раскрашенный экран. Записать экран, зная его стартовый адрес и размер, несложно, ибо он занимает сплошной промежуток памяти. Программа на рис. 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 -

| { Процедура считывания текст-экрана с диска на экран. }

| { !!! Процедура не проверяет совпадение режимов }

Перейти на страницу:

Поиск

Похожие книги