русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Модуль Win


Дата добавления: 2015-06-12; просмотров: 600; Нарушение авторских прав


В архиве DEMOS.ARC пакета Турбо Паскаль имеются исходные тексты модуля Win, базирующегося на модуле CRT и реализующего простейшие действия с текстовыми окнами. Большинство его процедур написано на ассемблере, что обеспечивает высокую скорость выполнения. В модуле вводятся три новых типа и две константы для рисования рамок вокруг окна (рис. 20.6):

TYPE TitleStr=string[63]; { заголовок окна } FrameChars=Array[1..8] of Char; { символы рамки } WinState = RECORD { параметры окна: } WindMin,WindMax : Word; { координаты окна } WhareX, WhereY : Byte; { положение курсора} TextAttr : Byte; { цветовой атрибут } END; CONST SingilFrame : FrameChars='┌┐ ││└└’; { одинарная paмкa } DoubleFrame : FrameChars='╔╗║║╚╝'; { двойная рамка }

Рис. 20.6

20.3.2.1. Задание окна. Поскольку модуль Win базируется на модуле CRT, задание окна по-прежнему производится процедурой Window (или, точнее, CRT.Window). По умолчанию считается, что окно соответствует всему экрану. По-прежнему активным может быть только одно окно — текущее.

20.3.2.2. Вывод строк в окна. В модуле Win реализована пара процедур для вывода символов и строк в окно. Процедура

WriteStr( X,Y : Byte; S : String; Attr : Byte )

выводит строку S, а процедура

WriteChar( X,Y, Count : Byte; Ch : Char; Attr : Byte )

выводит Count символов, заданных параметром Ch. В обоих процедурах параметры X и Y обозначают начало выводимой информации в оконных координатах, a Attr задает значение для TextAttr при выводе. Отличие этих процедур от Write и WriteLn в том, что при выходе за границы окна не происходит прокрутки изображения или переноса строк. Лишние символы просто «обрезаются» по рамке окна. {479}

20.3.2.3. Оформление окон. В модуле Win имеется процедура для заполнения текущего окна символом Ch при цветовом атрибуте Attr:



FillWin(Ch :Char; Attr : Byte);

Ее можно вызывать вместо процедуры очистки окна ClrScr.

После задания окна процедурой Window его можно взять в рамку с помощью процедуры

FrameWin(Title : TitleStr; VAR Frame : FrameChars;

TAttr, FAttr : Byte),

где Title — строка-заголовок окна, Frame — набор символов, составляющих рамку (сюда можно подставлять константы SingleFrame и DoubleFrame), а TAttr и FAttr — цветовые атрибуты заголовка и рамки соответственно. Рамка выводится по периметру окна, не выходя за его пределы. Поэтому после обрамления размеры самого окна уменьшаются на единицу со всех сторон. Очистка окна при выводе рамки не осуществляется.

Отмена рамки для текущего окна производится процедурой UnFrameWin. Она просто восстанавливает размеры окна, которые были до взятия его в рамку (увеличивает их на единицу со всех сторон). Рамка при этом не стирается и может быть удалена только командой очистки всего окна (ClrScr или FillWin). Применение процедуры UnFrameWin к окну, не имеющему рамки, равносильно увеличению его размеров.

20.3.2.4. Сохранение параметров окна. При открытии (задании) нового окна на экране можно сохранять все параметры предыдущего окна. Это делается процедурой модуля Win

SaveWin(VAR W : WinState),

присваивающая текущим параметрам окна значения, сохраненные в переменной W типа WinState параметрами текущего окна. При восстановлении изображения окна на экране (об этом ниже) можно также «вспомнить», где стоял курсор и каким цветом выводился текст. Для этого предусмотрена процедура

RestoreWin(Var W : WinState),

присваивающая текущим параметрам окна значения, сохраненные в переменной W. Само изображение окна в переменной W не сохраняется. Для этого имеются другие процедуры.

20.3.2.5. Сохранение содержимого окна. При построении накладывающихся окон необходимо запоминать содержимое «нижних» окон и восстанавливать его после снятия с экрана «верхних». Эти действия реализованы одной функцией и двумя процедурами модуля Win: {480}

WinSize : Word;

ReadWin( VAR Buf );

WriteWin( VAR Buf ).

Функция WinSize возвращает количество байтов, необходимое для запоминания содержимого текущего окна. Процедура ReadWin записывает в бестиповую переменную Buf изображение из текущего окна. Другая процедура, WriteWin, выводит в текущее окно изображение, сохраненное ранее в переменной Buf. Размер переменной Buf, передаваемой в процедуры, должен быть не менее, чем значение WinSize.

Важно, что само изображение не содержит указаний на размеры «своего» окна и его расположение. Поэтому для вывода сохраненного окна на экран надо сначала восстановить его параметры процедурой RestoreWin и лишь затем вызывать процедуру WriteWin.

На рис. 20.7 приводятся процедуры для задания на экране системы накладывающихся окон. Вся информация об окне содержится в переменных типа WindowType. Для введения окна в обращение надо однократно вызвать процедуру OpenWin. Далее окно можно «заморозить» процедурой FreezeWin (что сделает активным предыдущее окно) и вновь сделать активным с помощью процедуры ActivateWin. Изъятие окна из обращения производится процедурой CloseWin.

USES { ПРОЦЕДУРЫ ДЛЯ РАБОТЫ С ОКНАМИ НА ЭКРАНЕ } 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 {481}

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 (продолжение) {482}

{ Процедура закрывает (уничтожает) окно W. } PROCEDURE CloseWin( VAR W : WindowType ); BEGIN 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 (окончание) {483}

Используя приведенные процедуры как базовые, можно построить более высокоуровневые процедуры работы с окнами. Мы же здесь хотели лишний раз показать, что грозно звучащие операции типа «сохранение окон» на деле вовсе не так сложны.

Можно пойти дальше и так организовать работу с окнами, чтобы менять формат окна при его восстановлении. В самом деле, изображение окна выводится процедурой WriteWin в текущее окно. Если формат текущего окна на экране будет иным при той же площади окна, то изображение при выводе будет переформатировано.

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



<== предыдущая лекция | следующая лекция ==>
Общие принципы работы с окном | Работа с образом экрана на диске


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 3.082 сек.