19.10. Включение шрифтов и драйверов в ЕХЕ-файл

We use cookies. Read the Privacy and Cookie Policy

Стандартный режим работы графики, при котором помимо основного ЕХЕ-файла необходимо присутствие еще одного или не-

- 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:TPBGI>driver.bat CGA

C:TPBGI>driver.bat EGAVGA

C:TPBGI>driver.bat HERC

...

C:TPBGI>fonts.bat TRIP

C:TPBGI>fonts.bat SANS

...

Если желательно включить в файл и свою часть шрифта 8x8 (пусть он хранится в файле 8x8.FON), то надо выполнить команду

C:TPBGI>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

| then Halt(101);

| if RegisterBGIDriver(@EGAVGADriverProc)<0

| then Halt(102);

| if RegisterBGIDriver(@HERCDriverProc)<0

| then Halt(103);

| { ... }

| if RegisterBGIFont(@TRIPDriverProc)<0 then Halt(201);

| if RegisterBGIFont(®SANSDriverProc)<0 then Halt(202);

| { ... }

| GetIntVec($1F,OldFont8x8); { старый адрес шрифта 8x8 }

| SetIntVec($1F,@Font8x8Proc) { новый адрес шрифта 8x8 }

| END.

Рис. 19.36

Этот модуль должен быть оттранслирован на диск. После этих действий можно, указав в своей программе

- 469 -

USES

Graph, BGI, ... ;

использовать процедуру InitGraph с третьим параметром — пустой строкой, не заботясь о наличии конкретного драйвера или шрифта на диске совместно с ЕХЕ-файлом.