| 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 с третьим параметром — пустой строкой, не заботясь о наличии конкретного драйвера или шрифта на диске совместно с ЕХЕ-файлом.
19.11. Подключение новых драйверов
Из средств модуля Graph мы не рассмотрели до сих пор функцию
InstallUserDriver( DriverFileName : String;
AutoDetectPtr : Pointer ) : Integer
которая позволяет работать с самыми разными графическими контроллерами, для которых написаны специальные драйверы в стандарте BGI, а также добавлять новые драйверы. Однако для этого надо сначала написать этот драйвер. Такая задача достаточно сложна, требует специальных знаний в области аппаратного обеспечения ПЭВМ и стандартов BGI, и поэтому описание ее решения выходит за рамки нашей книги. Если же имеется какой-либо дополнительный BGI-драйвер (например, отладочный), то его можно использовать, подключив функцией InstallUserDriver. Первый параметр — это имя файла, содержащего драйвер, второй — адрес функции без параметров, опрашивающей аппаратную часть и возвращающей значение типа Integer. Отрицательное значение функции должно означать ошибку, неотрицательное — номер режима работы по умолчанию. Сама функция должна компилироваться в режиме {$F+}, Функция InstallUserDriver вернет либо отрицательный код ошибки, либо номер установленного драйвера, который затем нужно передать на первом месте процедуре инициализации InitGraph. Пример таких действий имеется в контекстной подсказке системы программирования.
19.12. Один полезный совет
В заключение хотим дать один небольшой, но важный совет. Следование ему даст возможность создавать действительно переносимые графические программы. Суть совета в следующем: никогда не опирайтесь в программах на постоянные значение координат графических изображений. Вместо этого всегда старайтесь все координаты задавать как отношение к максимальному разрешению в текущем режиме. Например, работая на VGA(640 x 480), ВЫ поместили какую-либо надпись в центр экрана:
- 470 -
OutTextXY(320, 240, 'Плохо!..');
Если эта программа может работать с адаптером CGA (640 x 200), то надпись просто «уйдет» за кадр. Переносимость же, как известно, подразумевает нечто иное.
Подобной проблемы просто не возникло бы, если середину испать по текущим максимальным значениям:
OutTextXY(GetMaxX div 2, GetMaxY div 2, 'Хорошо!!!..');
Понятно, что такой подход применим не только к текстовым изображениям, но и к любым другим. Отметим также, что набор средств модуля Graph дает все возможности реализации описанного принципа.
Часть V. Практические приемы работы с ПЭВМ
Глава 20. Профессиональная работа с текстовыми изображениями
Несмотря на возможности стандартных процедур модуля CRT, имеется огромное число задач, реализация которых стандартными средствами была бы малоэффективной или попросту громоздкой. Такова например, задача закрашивания окна на экране каким-либо символом, запись всего изображения в файл, смена цветов на экране и др. Неискушенный читатель может на досуге поломать голову, как, к примеру, считать, символы, уже выведенные на экран.
Обо все этом и пойдет речь ниже. Правда, должны сразу же оговориться, что такие операции приходится выполнять «грязными» руками: использовать специфические особенности ОС и архитектуры ПЭВМ. Плата за это – практическая непереносимость программ на другие ЭВМ и в другие ОС. Но так как парк IBM-совместимых ПЭВМ постоянно растет, то особой беды в непереносимости нет.
20.1. Программный опрос режимов текстового дисплея
Начнем с рассмотрения видеопамяти. Известно, что она располагается в адресах памяти ПЭВМ от $А000:$0000 до $BFFF:$0000. Непосредственно интересующая нас память текстового изображения находится «где-то» в этом диапазоне.
Определение начала видеопамяти текстового изображения — весьма важная и нужная задача. Монохромные режимы используют ячейки памяти, начиная с $В000:0000, а цветные — с $В800:0000. Хорошая программа должна сама определять, с каким режимом она
- 472 -