| SetColor( LightBlue );
| OutTextXY( maxx div 2, maxy div 2, my_str );
| ReadLn; { пауза до нажатия ввода }
| CloseGraph { закрытие режима графики }
| END.
Рис. 19.35
У процедуры OutTextXY есть одна особенность: выводимая текстовая строка всегда обрезается по границе графического окна. Более
- 466 -
того, если активным является матричный шрифт (DefaultFont), то «вылезающая» строка вообще не появляется на экране. Решать подобные проблемы можно, точно рассчитывая место выводимых в графике строк.
19.9.4.2. Масштабирование штриховых шрифтов. Размер букв (высота и ширина) штриховых шрифтов (и только их) может задаваться процедурой
SetUserCharSize( multX, divX, multY, divY : Word )
Она позволяет оперативно менять размер шрифта, установленный процедурой SetTextStyle. Отношение (multX/divX) задает масштабирование ширины начертания шрифта, а отношение (multY/divY) выражает масштаб изменения высоты шрифта. Например, задание параметров multX=3 и divX=1, говорит о том, что буквы выводимого шрифта будут в три раза шире нормы.
19.9.5. Опрос стиля и ориентации шрифтов
Полную информацию о текущем режиме вывода текста можно получить, используя процедуру
GetTextSettings(VAR Settings : TextSettingsType)
В параметре Settings она возвращает исчерпывающую информацию обо всем, что относится к выводу строк. Тип этого параметра предопределен в модуле Graph:
TYPE
TextSettingsType = RECORD
Font : Word; {номер шрифта}
Direction : Word; {направление}
CharSize : Word; {размер шрифта}
Horiz : Word; {ориентация по X}
Yert : Word; {ориентация по Y}
END;
Текущим всегда является один шрифт, и при необходимости быстро переключаться с одного шрифта на другой удобно сохранять и восстанавливать их параметры через переменные описанного типа.
19.10. Включение шрифтов и драйверов в ЕХЕ-файл
Стандартный режим работы графики, при котором помимо основного ЕХЕ-файла необходимо присутствие еще одного или не-
- 467 -
скольких вспомогательных BGI- и CHR-файлов, не очень удобен. Устранение этого неудобства возможно включением содержимого этих файлов непосредственно в ЕХЕ-файл, получаемый из программы на Паскале, Для этого надо выбрать, какие драйверы и шрифты необходимы при автономной работе нашей программы (если она рассчитана на работу с одним адаптером, то достаточно одного соответствующего BGI-драйвера и шрифтов; если программа должна переноситься, то придется вставить в нее как минимум три драйвера: для CGA, EGA/VGA и Hercules).
Далее, нужно запустить утилиту BINOBJ.EXE для получения из ВGI- и (или) CHR-файла (файлов) OBJ-файла (файлов), что лучше сделать ВАТ-файлами:
drivers.bat
BINOBJ %1.BGI %1.OBJ %1DriverProc |
fonts.bat
BINOBJ %1.CHR %1.OBJ %1FontProc |
В этом случае можно обработать драйверы и шрифты следующим образом:
C:\TP\BGI>driver.bat CGA
C:\TP\BGI>driver.bat EGAVGA
C:\TP\BGI>driver.bat HERC
...
C:\TP\BGI>fonts.bat TRIP
C:\TP\BGI>fonts.bat SANS
...
Если желательно включить в файл и свою часть шрифта 8x8 (пусть он хранится в файле 8x8.FON), то надо выполнить команду
C:\TP\BGI>binobj 8x8.fon 8x8 Font8x8Proc
После этого можно подготовить полученные OBJ-файлы для компоновки в ЕХЕ-файл. Удобнее всего это сделать, организовав модуль, например BGI.TPU. Исходный текст его (с учетом наших предыдущих действий) приведен на рис. 19.36.
- 468 -
| UNIT BGI; { модуль с BGI-компонентами }
| INTERFACE { объявления псевдопроцедур }
| PROCEDURE CGADriverProc; { BGI-драйвер для CGA }
| PROCEDURE EGAVGADriverProc; { BGI-драйвер для EGA/VGA }
| PROCEDURE HERCDriverProc; { BGI-драйвер для Hercules }
| { ... }
| PROCEDURE TRIPFontProc; { CHR-шрифт TriplexFont }
| PROCEDURE SANSFontProc; { CHR-шрифт SansSerifFont }
| { ... }
| PROCEDURE Font8x8Proc; { матричный шрифт 8x8 }
| IMPLEMENTATION { подстыковка содержимого: }
| USES Graph, DOS;
| {$L cga.obj} PROCEDURE CGADriverProc; EXTERNAL;
| {$L egavga.obj} PROCEDURE EGAVGADriverProc; EXTERNAL;
| {$L herc.obj} PROCEDURE HERCDriverProc; EXTERNAL;
| { ... }
| {$L trip.obj} PROCEDURE TRIPFontProc; EXTERNAL;
| {$L sans.obj} PROCEDURE SANSFontProc; EXTERNAL;
| { ... }
| VAR
| OldFont8x8 : Pointer; { адрес старого шрифта 8x8 }
| {$L 8x8.obj} PROCEDURE Font8x8Proc; EXTERNAL;
| BEGIN
| if RegisterBGIDriver(@CGADriverProc)<0