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: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 с третьим параметром — пустой строкой, не заботясь о наличии конкретного драйвера или шрифта на диске совместно с ЕХЕ-файлом.