TURBO PASCAL |
Новости |
ПРИЛОЖЕНИЕ 5ОСОБЕННОСТИ РЕАЛИЗАЦИИ ТЕКСТОВОГО ВЫВОДА(модуль CRT)С модулем CRT,
содержащем константы, переменные и
подпрограммы управления текстовым выводом,
мы уже знакомились в
методических указаниях, часть 1 [4, Прил. 9].
Теперь рассмотрим особенности
программно-аппаратной реализации
текстового вывода. Текстовый режим работы
дисплейных адаптеров в IBM-совместимых
компьютерах использует часть оперативной
памяти для видеопамяти.
Адрес ее начала зависит от типа адаптера.
Для CGA, EGA и VGA
это $B800:0000.
Видеопамять содержит "карту"
текстового экрана: коды отображаемых
символов и их атрибуты.
Прямое обращение к видеопамяти
обеспечивает максимально
возможную скорость изменения
изображения на экране, потому что
любой символ, попадающий в видеопамять,
отображается на экране
немедленно. Экран в текстовом режиме хранится как последовательность пар байт, где первый байт в каждой паре - любой из 256 символов ASCII , а второй байт - атрибут его вывода. Для адаптеров цветной графики в текстовом режиме атрибут определен следующим образом:
ормула для вычисления
атрибута:
16 * цвет фона + цвет
символов (+ 128 для
мерцания) Например, установить атрибут
"желтый на красном" с мерцанием:
TextAttr := Blink + Yellow + 16*Red; или в шестнадцатеричной системе
счисления:
TextAttr :=
$CE. п.5.1. Пример использования переменной
TextAttr
uses
Crt; var
TA,TA1: byte;
f : text; begin
ClrScr; {белые символы на черном фоне - стандарт для среды Turbo PASCAL} TA:=$0F;
{ вывод через устройство CRT (см. [5, П.4.3.5])}
AssignCrt (f);
Rewrite (f);
Repeat
Window(3,3,10,4);
{ одно окно } { желтые символы на синем фоне с миганием }
TextAttr:=$9E; {Yellow + 16*Blue
+Blink}
TA1:=TextAttr;
Writeln (f, 'HELLO!');
Window(1,1,80,25);
{ другое окно } {белые символы на красном фоне} TextAttr
:= White + 16*Red;
GoToXY(40,10);
Writeln (f, 'continue');
Window(23,3,40,4);
{ третье окно }
{ установка реверсного атрибута } TextAttr:=
not (TA1); {Blue + 16*Yellow}
Writeln (f, 'До
встречи!!!'); Until KeyPressed; {Очистка активного окна и
восстановление стандартных атрибутов} Window(1,1,80,25);
TextAttr:=TA;
ClrScr;
Close (f) end. П.5.2.
ДЕМОНСТРАЦИОННЫЙ ПРИМЕР
{ Демонстрационный пример
использования: - процедур и функций модуля Crt:
ClrScr, DelLine, GoToXY,
InsLine, KeyPressed, ReadKey,
TextBackground, TextColor, TextMode, WhereX, WhereY,
Window, Write, WriteLn;
- переменных LastMode, WindMax; - подстройки к адаптерам EGA или VGA; -
реакций на клавиши:
<Ins>, <Del>, <Up>, <Down>, <Right>, <Left>,<Alt-R>,
<Alt-W>, <Alt-X>,
<Ctrl-C>, <Enter>, <ESC>
} program
CrtDemo; uses Crt; var
OrigMode, LastCol, LastRow: Word;
Ch: Char;
Done: Boolean; {Инициализация
текстового режима для текущего адаптера CGA/EGA/VGA} procedure
Initialize; begin
CheckBreak:=False;
{ нет реакции на Contrl-C
}
OrigMode:=LastMode;
{ запоминание текущего видеорежима } TextMode(Lo(LastMode)+Font8x8); { использование видеоадаптера EGA/VGA } LastCol:=Lo(WindMax)+1; {Запоминание максимальной позиции курсора <X, Y> } LastRow:=Hi(WindMax)+1;
GoToXY(1,LastRow);
TextBackground(Black);
TextColor(White);
Write (' Ins-InsLine ',
'Del-DelLine ',
#27#24#25#26'-Cursor ',
{клавиши
?
?
?
?}
'Alt-W-Window ',
'Alt-R-Random ',
'Esc-Exit');
Dec(LastRow,80 div LastCol);
Randomize; end;
{ Initialize } {Создание текстового окна со случайными размерами} procedure
MakeWindow; var
X, Y, Width, Height: Word; begin {генерация
окна со случайными размерами} Width:=Random(LastCol-2)+2;
Height:=Random(LastRow-2)+2;
X:=Random(LastCol -Width)+1;
Y:=Random(LastRow -Height)+1;
Window(X, Y, X + Width, Y +Height); if OrigMode = Mono then {для черно-белого монитора}
begin
TextBackground(White);
TextColor(Black);
ClrScr;
Window(X+1,Y+1,X+Width-1,Y+Height-1);
TextBackground(Black);
TextColor(White); ClrScr; end else {для цветного монитора} begin
{генерация случайных цветов фона и
символа}
TextBackground(Random(8));
TextColor(Random(7)+9);
end;
ClrScr; end;
{ MakeWindow } { Генерация
случайных символов } procedure
RandomText; begin
repeat Write(Chr(Random(256-32)+32)); until KeyPressed; end; { RandomText }
{Главная программа} begin
Initialize;
MakeWindow; Done:=False;
repeat
Ch:=ReadKey; case Ch of #0:
{ обработка функциональных клавиш } begin Ch:=ReadKey; {чтение вторичного (расширенного) кода}
case Ch of
#17:
MakeWindow;
{ сочетание клавиш Alt-W }
#19:
RandomText;
{ сочетание клавиш Alt-R }
#45:
Done:=True;
{ сочетание
клавиш Alt-X - выход}
#72:
GotoXY(WhereX,WhereY-1); { Up - стрелка
? }
#75:
GotoXY(WhereX-1,WhereY); { Left - стрелка ?}
#77:
GotoXY(WhereX+1,WhereY); { Right - стрелка ?}
#80:
GotoXY(WhereX,WhereY+1); { Down - стрелка ?}
#82: InsLine;
{ клавиша Ins }
#83:
DelLine;
{ клавиша Del } end; {case для функциональных клавиш} end;
{Клавиши обычных ASCII
- символов } #3:
Done:=True;
{ Ctrl-C - выход
}
#13:
WriteLn;
{ Enter }
#27:
Done:=True;
{ ESC - выход }
else Write(Ch);
end;
until Done;
TextMode(OrigMode);
{ восстановление текущего видеорежима } end. |
(с) Все права защищены. По всем интересующим вопросам прошу писать электронный адрес |