Возможные графические режимы для различных адаптеров приведены в табл. 19.4. Во втором столбце приведены имена предопределенных констант, которые можно передавать в процедуры, управляющие графическими режимами. Последний столбец показывает количество полноэкранных изображений, которые могут храниться в памяти видеоадаптера одновременно.
Таблица 19.4
Драйвер | Имя константы режима и ее значение | Разрешение экрана (в точках) | Палитра | Число видеостраниц |
CGA | CGAC0 = 0 CGAC1 = 1 CGAC2 = 2 CGAC3 = 3 CGAHi = 4 | 320x200 320x200 320x200 320x200 640x200 | 4 цвета 4 цвета 4 цвета 4 цвета 2 цвета | |
MCGA | MCGAC0 = 0 MCGAC1 = 1 MCGAC2 = 2 MCGAC3 = 3 MCGAMed=4 MCGAHi = 5 | 320x200 320x200 320x200 320x200 640x200 640x480 | 4 цвета 4 цвета 4 цвета 4 цвета 2 цвета 2 цвета | |
EGA | EGALo = 0 EGAHi = 1 | 640x200 640x350 | 16 цветов 16 цветов | 2 {412} |
EGA64 | EGA64Lo = 0 EGA64Hi = 1 | 640x200 640x350 | 16 цветов 4 цвета | |
EGAMono | EGAMonoHi = 3 | 640x350 | 2 цвета | 1 (2) |
Herc | HercMonoHi = 0 | 720x348 | 2 цвета | |
ATT400 | ATT400C0 = 0 ATT400C1 = 1 ATT400C2 = 2 ATT400C3 = 3 ATT400C4 = 4 ATT400Hi = 5 | 320x200 320x200 320x200 320x200 640x200 640x200 | 4 цвета 4 цвета 4 цвета 4 цвета 2 цвета 2 цвета | |
VGA | VGALo = 0 VGAMed = 1 VGAHi = 2 | 640x200 640x350 640x480 | 16 цветов 16 цветов 16 цветов | |
PC3270 | PC3270Hi = 0 | 720x350 | 2 цвета | |
IBM8514 | IBM8514Lo = 1 IBM8514 = 1 | 640x480 1024x768 | 256 цветов 256 цветов |
Как видно из таблицы, наиболее качественная «картинка» получается при использовании адаптера 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).