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

<p>19.11. Подключение новых драйверов</p>

Из средств модуля Graph мы не рассмотрели до сих пор функцию

InstallUserDriver( DriverFileName : String;

AutoDetectPtr : Pointer ) : Integer

которая позволяет работать с самыми разными графическими контроллерами, для которых написаны специальные драйверы в стандарте BGI, а также добавлять новые драйверы. Однако для этого надо сначала написать этот драйвер. Такая задача достаточно сложна, требует специальных знаний в области аппаратного обеспечения ПЭВМ и стандартов BGI, и поэтому описание ее решения выходит за рамки нашей книги. Если же имеется какой-либо дополнительный BGI-драйвер (например, отладочный), то его можно использовать, подключив функцией InstallUserDriver. Первый параметр — это имя файла, содержащего драйвер, второй — адрес функции без параметров, опрашивающей аппаратную часть и возвращающей значение типа Integer. Отрицательное значение функции должно означать ошибку, неотрицательное — номер режима работы по умолчанию. Сама функция должна компилироваться в режиме {$F+}, Функция InstallUserDriver вернет либо отрицательный код ошибки, либо номер установленного драйвера, который затем нужно передать на первом месте процедуре инициализации InitGraph. Пример таких действий имеется в контекстной подсказке системы программирования.

<p>19.12. Один полезный совет</p>

В заключение хотим дать один небольшой, но важный совет. Следование ему даст возможность создавать действительно переносимые графические программы. Суть совета в следующем: никогда не опирайтесь в программах на постоянные значение координат графических изображений. Вместо этого всегда старайтесь все координаты задавать как отношение к максимальному разрешению в текущем режиме. Например, работая на VGA(640 x 480), ВЫ поместили какую-либо надпись в центр экрана:

- 470 -

OutTextXY(320, 240, 'Плохо!..');

Если эта программа может работать с адаптером CGA (640 x 200), то надпись просто «уйдет» за кадр. Переносимость же, как известно, подразумевает нечто иное.

Подобной проблемы просто не возникло бы, если середину испать по текущим максимальным значениям:

OutTextXY(GetMaxX div 2, GetMaxY div 2, 'Хорошо!!!..');

Понятно, что такой подход применим не только к текстовым изображениям, но и к любым другим. Отметим также, что набор средств модуля Graph дает все возможности реализации описанного принципа.

<p>Часть V. Практические приемы работы с ПЭВМ</p><p>Глава 20. Профессиональная работа с текстовыми изображениями</p>

Несмотря на возможности стандартных процедур модуля CRT, имеется огромное число задач, реализация которых стандартными средствами была бы малоэффективной или попросту громоздкой. Такова например, задача закрашивания окна на экране каким-либо символом, запись всего изображения в файл, смена цветов на экране и др. Неискушенный читатель может на досуге поломать голову, как, к примеру, считать, символы, уже выведенные на экран.

Обо все этом и пойдет речь ниже. Правда, должны сразу же оговориться, что такие операции приходится выполнять «грязными» руками: использовать специфические особенности ОС и архитектуры ПЭВМ. Плата за это – практическая непереносимость программ на другие ЭВМ и в другие ОС. Но так как парк IBM-совместимых ПЭВМ постоянно растет, то особой беды в непереносимости нет.

<p>20.1. Программный опрос режимов текстового дисплея</p>

Начнем с рассмотрения видеопамяти. Известно, что она располагается в адресах памяти ПЭВМ от $А000:$0000 до $BFFF:$0000. Непосредственно интересующая нас память текстового изображения находится «где-то» в этом диапазоне.

Определение начала видеопамяти текстового изображения — весьма важная и нужная задача. Монохромные режимы используют ячейки памяти, начиная с $В000:0000, а цветные — с $В800:0000. Хорошая программа должна сама определять, с каким режимом она

- 472 -

Перейти на страницу:

Поиск

Похожие книги