На рис. 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

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

Поиск

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