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