На рис. 20.7 приводятся процедуры для задания на экране системы накладывающихся окон. Вся информация об окне содержится в переменных типа WindowType. Для введения окна в обращение надо однократно вызвать процедуру OpenWin. Далее окно можно «заморозить» процедурой FreezeWin (что сделает активным предыдущее окно) и вновь сделать активным с помощью процедуры ActivateWin. Изъятие окна из обращения производится процедурой CloseWin.
| { ПРОЦЕДУРЫ ДЛЯ РАБОТЫ С ОКНАМИ НА ЭКРАНЕ }
| CRT, Win; { подключены модули CRT и Win }
| TYPE
| WindowType = RECORD { тип для ведения системы окон: }
| Size : Word; { объем памяти для окна в байтах }
| Frame : 0..2; { шифр типа рамки (0, если нет) }
| BufSave : Pointer; { адрес изображения под окном }
| BufWin : Pointer; { адрес изображения в окне }
| StateSave : WinState; { состояние до открытия окна }
| StateWin : WinState; { состояние при закрытии окна }
| END;
| {Процедура открывает окно и делает его текущим. }
| PROCEDURE OpenWin(X1,Y1,X2,Y2: Byte;T: TitleStr;
| TAttr, FAttr, FrameSort: Byte; VAR W : WindowType );
| BEGIN
| with W do begin
| SaveWin( StateSave ); { сохранение исходного состояния }
Рис. 20.7
- 482 -
| Window(X1,Y1, X2,Y2);
| { объявление нового текущего окна }
| Frame := FrameSort;
| { запоминание типа рамки }
| Size := WinSize;
| { запоминание объема окна }
| GetMem(BufSave,Size);
| { память для картинки фона }
| ReadWin( BufSave^);
| { сохранение картинки фона }
| case FrameSort of { взятие текущего окна в рамку }
| 1 : FrameWin(T,SingleFrame,TAttr,FAttr); { простая }
| 2 : FrameWin(T,DoubleFrame,TAttr,FAttr ); { двойная }
| end; {case}
| ClrScr; { очистка нового текущего окна }
| SaveWin( StateWin );
| { сохранение этого состояния окна }
| if Frame<>0 then UnFrameWin;
| {если есть рамка, то снять }
| GetMem(BufWin,Size);
| { память для картинки окна }
| ReadWin( BufWin^ );
| { сохранение картинки окна }
| RestoreWin(StateWin) { восстановление рамки окна }
| end (with}
| END;
| { Процедура делает окно W активным (текущим). }
| PROCEDURE ActivateWin( VAR W : WindowType );
| BEGIN
| with W do
| begin
| RestoreWin( StateWin );
| { восстановление параметров }
| if Frame <> 0 then UnFrameWin;
| {если есть рамка,то снять }
| WriteWin( BufWin^ );
| { восстановление картинки окна }
| RestoreWin(StateWin)
| { восстановление снятой рамки }
| end
| END;
| { Процедура делает окно W неактивным и стирает его, }
| { если параметр Erase равен True. }
| PROCEDURE FreezeWin(VAR W: WindowType; Erase: Boolean);
| BEGIN
| with W do
| begin
| SaveWin( StateWin );
| { сохранение состояния окна }
| if Frame<>0 then UnFrameWin;
| {если есть рамка, то снять }
| ReadWin( BufWin^);
| { сохранение картинки окна }
| GotoXY(1,1);
| if Erase then
| { Если надо стереть окно, то }
| WriteWin(BufSave^);
| { восстановить картинку фона }
| RestoreWin(StateSave)
| { в предыдущее состояние }
| end {with}
| END;
Рис. 20.7 (продолжение)
- 483 -
| { Процедура закрывает (уничтожает) окно W. }
| PROCEDURE CloseWin( VAR W : WindowType );
| BEGIN