Возможные графические режимы для различных адаптеров приведены в табл. 19.4. Во втором столбце приведены имена предопределенных констант, которые можно передавать в процедуры, управляющие графическими режимами. Последний столбец показывает количество полноэкранных изображений, которые могут храниться в памяти видеоадаптера одновременно.
Как видно из таблицы, наиболее качественная «картинка» получается при использовании адаптера IBM8514. Однако он редко встречается у нас в стране, и поэтому в дальнейшем мы не будем о нем упоминать.
В мире производится огромное количество различных адаптеров, которые являются модификациями основных адаптеров, приведенных в таблице. Каждая модификация решает задачи, связанные, например, с увеличением быстродействия, разрешения или совместимости с каким-нибудь другим типом адаптера. При этом в таком адаптере всегда сохраняется стандартный блок, позволяющий работать в любом из режимов, указанных в таблице для него. Для того чтобы полностью использовать возможности установленного в ПЭВМ адаптера, необходимо воспользоваться инструкцией по работе с ним.
19.2.3.1. Процедура DetectGraph. Для тестирования графического адаптера в модуле Graph объявлена процедура:
DetectGraph( VAR GraphDriver, GraphMode : Integer ) {413}
Эта процедура может быть вызвана до инициализации графики. Через формальный параметр GraphDriver возвращается значение из первого столбца таблицы 19.4, а через параметр GraphMode — обычно последнее значение из соответствующего раздела второго столбца. Эти значения и рекомендуется подставлять в качестве фактических параметров в процедуру InitGraph. Если на ПЭВМ не установлена графическая плата, то функция GraphResult будет возвращать значение grNotDetected. После определения GraphDriver автоматически становится доступным диапазон графических режимов, реализуемых адаптером ПЭВМ. Дело в том, что по мере развития индустрии ПЭВМ возникали новые уровни возможностей графики (рис. 19.2).
┌────────┐ ──────────────────┐
400 │ 16 цветов │ │
│ из 256 │ │
└────────┘ │
│
640 │
┌────────┐ ────────────┐ │
350 │ 16 цветов │ ││
│ из 64 │ ││
└────────┘ │ │
│ │
640 ││
┌────────┐ │ │
200 │ 16 цветов │ │ │
└────────┘ │ │
│ ├─ VGA
320 ││
┌────────┐ │ │
200 │ 16 цветов │ │ │
└────────┘ ├─ EGA │
│ │
320 ││
┌────────┐ ─────┐ │ │
200 │ 4 цвета │ │ │ │
└────────┘ │ │ │
640 ├─ CGA │ │
┌────────┐ ─────┤ │ │
200 │ 2 цвета │ │ │ │
└────────┘ ─────┘ ───┘ ───┘
Рис. 19.2
Адаптер Hercules несколько отличается от остальных, но тем не менее «перекрывается» старшим уровнем — адаптером VGA. Таким образом, имея адаптер VGA, можно имитировать практически все режимы, возможные на платах EGA, CCA, Hercules и т.д., имея плату {414} EGA, можно то же, кроме режимов VGA. В результате получается так называемая совместимость «снизу вверх». Поясним это на примере (рис. 19.3).
USES Graph; { используется Graph } VAR
gDriver : Integer; { для графического адаптера }
gMode : Integer; { для графического режима }
ErrorCode : Integer; { для кода ошибки }
BEGIN
DetectGraph(gDriver, gMode); { Опрос наличия и }
ErrorCode := GraphResult; { типа адаптера. }
if ErrorCode <> grOk then begin { если ошибка, то... }
WriteLn(GraphErrorMsg( ErrorCode ));
Halt( 1 )
end; {if}
if gDriver in [EGA, EGA64, VGA] { Если адаптер }
then begin { "старше" CGA, то }
gDriver := CGA; { возможен режим }
gMode := CGACO { работы CGA. }
end; {if}
InitGraph(gDriver,gMode, ); { режим CGA }
Line( 0, 0, 319, 199 ); { работа как на CGA }
CloseGraph { закрытие графики } END.
Рис. 19.3
Существует возможность манипуляции режимами работы графического адаптера — при помощи группы процедур и функций, работающих уже после инициализации графики. Но часто бывает важным сначала определить разрешенные значения режимов.
19.2.3.2. Диапазоны графических режимов. Номер текущего графического режима для установленного драйвера определяется функцией
GetGraphMode : Integer,
а функция
GetMaxMode : Word
возвращает номер максимального режима для графического адаптера; таким образом, каждый драйвер поддерживает диапазон режимов 0..GetMaxMode. Обычно этот же результат можно получить из процедуры {415}
GetModeRange( GraphDriver : Integer;
VAR LoMode, HiMode : Integer ),
через параметры LoMode и HiMode возвращающей соответственно нижнюю и верхнюю границу режимов для драйвера GraphDriver. Но по ряду технических соображений предпочтительнее пользоваться функцией GetMaxMode, полагая минимальный номер режима равным нулю.
19.2.3.3. Функции GetModeName и GetDriverName. Есть еще одна функция, которая может быть полезна для организации диалогового управления графическими режимами:
GetModeName( GraphMode : Word ) : String
Она возвращает строку, в которой содержится последовательно через пробелы разрешение, имя константы и иногда название палитры из табл. 19.4, например, '640x200 CGA'. Представленный пример (рис. 19.4) поможет определить, в каких графических режимах может работать используемая ПЭВМ.
USES Graph; { подключен модуль Graph }
{$I initgraf.pas} { процедура инициализации }
VAR
mode : Integer;
BEGIN
GrInit; { инициализация }
for mode := 0 to GetMaxMode do { показ всех режимов } OutTextXY( 10, 10+mode*10, GetModeName( mode ) ); ReadLn; { пауза до нажатия... }
CloseGraph { закрытие графики }
END.
Рис. 19.4
Функция
GetDriverName : String
позволяет получить имя используемого драйвера. Ее применение обосновано только в том случае, если в процедуре InitGraph переменная GraphDriver определена, как Detect (рис. 19.5).