22.3. Вывод текста на графический экран

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

Рассмотрим некоторые особенности прерывания 10H БСВВ. В нем есть несколько функций вывода текста с управлением цветом выводимых символов:

функция 09H — вывод в текущую позицию текстового курсора символа с заданным цветовым атрибутом;

функция 0EH — вывод символа в режиме телетайпа;

функция 13H — вывод текстовой строки.

Функция 09H не очень интересна, так как при выводе каждого символа необходимо самим передвигать текстовый курсор в следующую позицию. В этом смысле развитием ее является функция 0EH —

- 519 -

вывод каждого символа сопровождается его перемещением на следующую позицию (это и есть телетайп). Пример работы с этой функцией при выводе строки символов показан на рис. 22.9.

| USES Graph, CRT, DOS;

| {$I initgraf.pas} {Процедура инициализации (см. гл. 19) }

| PROCEDURE TeleWrite( str : String; attr : Byte );

| {Процедура вывода символа sym заданного цвета attr на }

| {графический экран системным шрифтом текстового режима }

| PROCEDURE WriteSym( sym : Byte; { ASCII-код символа }

| attr : Byte ); { цвет символа (0..15 }

| VAR

| regs : Registers; { требуется для прерываний }

| BEGIN

| with regs do begin { действия с полями reg }

| AH := $0E; { функции вывода символа }

| AL := sym; { ASCII код символа }

| BL := attr+$80; { его цвет (+$80 для XOR) }

| end;

| Intr( $10, regs ) { вызов прерывания 10H }

| END; {WriteSym}

| VAR

| i : Byte;

| BEGIN {TeleWrite}

| for i := 1 to Length(str) do

| WriteSym( Ord( str[i] ), attr );

| END; {TeleWrite}

| BEGIN { Пример вызова }

| GrInit; { инициализация графики }

| Bar3D(315,50, 330, 200, 30, TopOn); { графическая фигура }

| GotoXY( 34,12 ); { установка позиции }

| TeleWrite( 'Это желтый цвет', Yellow );

| ReadLn; { пауза до нажатия ввода }

| CloseGraph { закрытие графики }

| END.

Рис. 22.9

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

Функция 13H работает на графических адаптерах класса EGA и VGA и позволяет выводить не только строку заданного цвета (при

- 520 -

значении 0 или 1 регистра AL процессора — см. рис. 22.10), но и строку, в которой атрибуты заданы для каждого символа отдельно. При этом строка должна иметь структуру «символ-атрибут-символ-атрибут-...». Такой режим задается, если в регистр AL записать значение 2 или 3 (регистр BL при этом не используется). При значениях AL, равных 0 или 2, перевод курсора при выводе не осуществляется в отличие от значений 1 и 3. В графических режимах лучше использовать режимы 0 и 2.

| { Процедура вывода строки заданного цвета на графический }

| {экран системным шрифтом для текстового режима }

| {================(только EGA и VGA)==================== }

| PROCEDURE WriteStr( str : String; { выводимая строка }

| X, Y : Byte; { координаты начала }

| Page : Byte; { номер видеостраницы }

| attr : Byte ); { цвет символа (0..15) }

| VAR R : Registers; { требуется для прерываний }

| BEGIN

| with R do { действия с полями записи }

| begin

| AH := $13; { функция вывода строки }

| AL := 0; { цвет символов задан в BL }

| BH := page; { вывод на страницу page }

| BL := attr+$80, { цвет (+$80 для XOR) }

| DH:=Y; { DH и DL - позиция тексто- }

| DL := X; { вого курсора }

| CX := Length( str); { длина выводимой строки }

| BP := Ofs( str )+1; { Адрес выводимой строки в }

| ES := Seg( str ) { виде базы и сегмента, }

| end; { начиная со Str[1]. }

| Intr( $10, R ); { вызов прерывания 10Н }

| END;

Рис. 22.10