46019 (665326), страница 35
Текст из файла (страница 35)
Управление цветом на CGA
Вследствие различий в графическом аппаратномобеспечении фактическое управление цветами различно для CGA и EGA,что заставляет нас рассмотреть их по отдельности. Управление цветом для драйвераAT&T, а также режимы низкой разрешающей способности драйвера MCGA аналогичны управлению цветом CGA.
В случае CGA вы можете выбрать либо режим низкойразрешающей способности (320х200), который допускает использование четырех цветов, либо режим высокой разрешающей способностей (640х200), где допускается использование двух цветов.
CGA в режиме низкой разрешающей способности
В режиме низкой разрешающей способности вы имеете возможность выбрать одну из четырех четырехцветных палитр. В каждой из этих четырех палитр вы можете сами установить только первый (цвет 0) элемент; цвета 1, 2 и 3 являются фиксированными. Первый элемент палитры (цвет 0) - это цвет фона. Этот цвет может являться одним из 16 имеющихся цветов (см. таблицу цветов фона, приводимую ниже).
Вы выбираете желаемую палитру, выбирая соответствующий режим (CGAC0, CGAC1, CGAC2, CGAC3); эти режимы используют палитры цветов от 0 до 3, соответственно, как показано в следующей таблице. Цвета вычерчивания в CGA и эквивалентные им константы определяются в graphics.h.
-----------------------------------------------------------
Константа, присвоенная номеру цвета (значению пикселя) Номер -------------------------------------------------- палитры 1 2 3
-----------------------------------------------------------
0 CGA_LIGHTGREENCGA_LIGHTRED CGA_YELLOW
1 CGA_LIGHTCYANCGA_LIGHTMAGENTA CGA_WHITE
2 CGA_GREENCGA_RED CGA_BROWN
3 CGA_CYANCGA_MAGENTA CGA_LIGHTGRAY
Для того, чтобы назначить один из этих цветов цветом вычерчивания CGA, нужно вызвать функцию setcolor, задав в ней в качестве аргумента либо номер цвета, либо имя соответствующей константы; например,если вы используете палитру3 и желаете назначить цветом вычерчивания cyan, то можно записать:
setcolor(1);
или
setcolor(CGA_CYAN);
В следующей таблице перечислены назначаемые для CGA цвета фона:
-----------------------------------------------------------
Числовое Символическое Числовое Символическое
значение имя значение имя
0 1 2 3 4 5 6 7 | BLACK8 DARKGRAY BLUE9 LIGHTBLUE GREEN 10 LIGHTGREEN CYAN 11 LIGTHCYAN RED 12 LIGHTRED MAGENTA 13 LIGHTMAGENTA BROWN 14 YELLOW LIGHTGRAY 15 WHITE |
Цвета CGA для переднего плана те же, что находятся в данной таблице.
Для назначения одного изэтих цветов в качестве фонового цветаслужитфункция setbkcolor(цвет), где цвет - это один из элементов приведенной выше таблицы. Отметим, что для CGA цвет не является значением пикселя (индексом в палитре); он прямо задает фактический цвет, помещаемый в первый элемент палитры.
CGA в режиме высокой разрешающей способности
В режиме высокой разрешающей способности (640x200)CGA работает с двумя цветами - черным цветом фона и цветным передним планом. Пиксели могут принимать при этом значения только 0 или 1. В связи с особенностями CGA цветом переднего плана фактически является тот цвет, который аппаратное обеспечение считает цветом фона; таким образом, цвет переднего плана устанавливается подпрограммой setbkcolor. (Странно, но факт).
Цвет для переднего планаможет быть выбран из предыдущей таблицы. CGA далее будет использовать этот цвет для отображения им всех пикселей, имеющих значение 1.
Следующие режимы работают аналогичным оюразрм: CGAHI, MCGAMED, MCGAHI, ATT400MED и ATT400HI.
Подпрограммы управления палитрой в случае CGA
Поскольку палитра CGA является предопределенной, подпрограмму setallpaletteиспользовать в данном случае нельзя. Также не следует использовать setpalette(индекс, фактический _цвет), за исключением индекс=0. (Этоальтернативный способ установки фонового цвета CGA равным фактическому_цвету).
Управление цветом для EGA и VGA
В случае EGA палитрасодержит 16 элементов из общего количества 64 возможных цветов, причем каждый из элементов палитры можетбыть задан пользователем. Доступ к текущей палитре выполняется через getpalette, которая заполняет структуру, включающую всебя размер палитры (16) имассивфактических элементов палитры ("аппаратные номера цветов", хранимые в палитре). Элементы палитры можно изменять как по отдельностипри помощи setpalette, либо все сразу через setallpalette.
Палитра EGA по умолчанию соответствует 16 цветам CGA, которые были даны впредыдущей таблице цветов: черный равен элементу 0, голубой равен элементу 1, ... , белый равен элементу 15. В graphics.h определены константы, которые содержат соответствующие цветам аппаратные значения: это EGA_BLACK, EGA_WHITE и т.д.Эти значения могут быть также получены через getpalette.
Подпрограмма setbkcolor(цвет) на EGAработает несколько иначе, чем на CGA. На EGA setbkcolor копирует фактическое значение цвета, хранящееся в элементе #цвет, в элемент #0.
Что касается цветов, то драйвер VGA работает фактическитак же, как и драйвер EGA; он просто имеет более высокое разрешение (и меньшие по размеру пиксели).
Обработка ошибок в графическом режиме
Ниже приводитсякраткий обзорфункций обработки ошибок в графическом режиме:
grapherrormsg Возвращает строку с сообщением об ошибке для заданного кода ошибки.
graphresult Возвращает код ошибки для последней графической операции, в которой встретилась ошибка.
Если ошибка произошла при вызове графической библиотечной функции (например,не найден шрифт, запрошенный функцией settextstyle), устанавливается внутренний код ошибки. Доступ к коду ошибки для последней графической операции, сообщившей об ошибке, выполняется при помощи graphresult. Определены следующие коды возврата ошибки:
-----------------------------------------------------------
Код Константа Соответствующая строка
ошибки графической_ошибки с сообщением об ошибке
0 grOk No error Нет ошибки
-1 grNoInitGraph (BGI) graphics not installed (use initgraph)
(BGI) графика не инсталирована
(используйте initgraph)
-2 grNotDetected Graphics hardware not detected Графическое аппаратное обеспечение
не обнаружено
-3 grFileNotFound Device driver file not found Не найден файл драйвера устройства
-4 grInvalidDriver Invalid device driver file Неверный файл драйвера устройства
-5 grNoLoadMem Not enough memory to load driver Не хватает памяти для загрузки
драйвера
-6 grNoScanMem Out of memory in scan fill Кончилась память при сканирующем
заполнении
-7 grNofloodMem Out of memory in flood fill Кончилась память при лавинном
заполнении
-8 grFontNotFound Font file not found
Файл шрифта не найден
-9 grNoFontMem Not enough memory to load font Не хватает памяти для загрузки
шрифта
-10 grInvalidMode Invalid graphics mode for selrcted driver
Недопустимый графический режим для выбранного драйвера
-11 grError Graphics error Графическая ошибка
-12 grIOerror Graphics I/O error Графическая ошибка ввода/вывода
-13 grInvalidFont Invalid font file Неверный файл шрифта
-14 grInvalidFontNum Invalid font number Неверный номер шрифта
-15 grInvalidDeviceNum Invalid device number Неверный номер устройства
-16 grInvalidVersion Invalid version of file Неправильная версия файла
-----------------------------------------------------------
Вызов grapherrormsg(graphresult()) возвращает строку сообщения об ошибке из вышеприведенной таблицы.
Код возврата ошибки накапливается, изменяясь только когда графическая функция сообщает об ошибке. Код возврата ошибки сбрасывается в 0 только при успешном выполнении initgraph, либо при вызове graphresult. Таким образом, если вы хотите знать, какая графическая функция возвратила ошибку, нужно хранить значение graphresult во временной переменной и затем проверять ее.
Функции запроса состояния
Ниже приводится краткое изложение функций запроса состояния графического режима:
getarccoords Возвращает информацию о координатах, заданных в последнем вызове arc или ellipse.
getaspectratio Возвращает коэффициент сжатия для графического экрана.
getbkcolor Возвращает текущий цвет фона.
getcolor Возвращает текущий цвет вычерчивания.
getdrivername Возвращает имя текущего графического драйвера.
getfillpattern Возвращает шаблон заполнения, определяемый пользователем.
getfillsettings Возвращает информацию о текущем шаблоне
и цвете заполнения.
getgraphmode Возвращает текущий графический режим.
getlinesettings Возвращает текущие стиль, шаблон и толщину линии
getmaxcolor Возвращает максимально допустимое на текущий момент значение пикселя.
getmaxmode Возвращает максимально допустимый номер режима для текущего драйвера.
getmaxx Возвращает текущее разрешение по оси x.
getmaxy Возвращает текущее разрешение по оси y.
getmodename Возвращает имя данного режима драйвера.
getmoderange Возвращает диапазон режимов для данного
драйвера.
getpalette Возвращает текущую палитру и ее размер.
getpixel Возвращает цвет пикселя в (x,y).
gettextsettings Возвращает текущий шрифт, направление, размер и способ выравнивания текста.
getviewsettings Возвращает информацию о текущем графическом окне.
getx Возвращает координату x текущей позиции (CP).
gety Возвращает координату y текущей позиции (CP).
В каждой из категорий графических функций Turbo C++ имеется хотя бы одна функция запроса состояния. Эти функцииупоминались при рассмотрении соответствующих категорий и также рассматриваются здесьотдельно. Каждая из графических функций запроса состояния Turbo C++ имеет имя вида "getчто-то" (за исключением категории функций обработки ошибок). Некоторые из них не принимают никаких аргументов ивозвращают единственное значение, представляющее собой искомую информацию; прочие берут указатель структуры, определяемой в graphics.h, заполняют эту структуру соответствующей информацией и не возвращают никаких значений.
Функциями запроса состояния категории управленияграфической системы являются getgraphmode, getmaxmode и getmoderange. Первая из них возвращает целое число, определяющее текущийграфический драйвер и режим, вторая возвращает максимальный номер режима для этого драйвера, а третья возвращает диапазон режимов, поддерживаемых данным графическим драйвером. getmaxx и getmaxy возвращают соответственно максимальные экранные координаты x и y для текущего графического режима.
Функциями запроса состояниякатегории вычерчивания и заполнения являются getarccoords, getaspectratio, getfillpattern и getlinesettings. getarccoords заполняет структуру, содержащуу координаты, которые использовались при последнем вызове функций arc или ellipse; getaspectratio сообщает текущийкоэффициент сжатия, используемый графическойсистемой для того, чтобы окружности выглядели круглыми. getfillpatternвозвращает текущий определяемыйпользователем шаблон заполнения. getfillsettings заполняет некоторуюструктуру текущим шаюлоном и цветом заполнения. getlinesettings заполняет структуру текущим стилем линии(сплошная, пунктир и т.д.), толщиной (обычнаяили увеличенная), а также шаблоном линии.
Функциями запроса состояниякатегории манипулирования графическим окном являются getviewsettings, getx, gety и getpixel. После того, как графическое окно определено, вы можете найтиего абсолютные экранные координаты ивыяснить состояние режима отсечки, вызвав getwiewsettings, которая заполняет соответствующей информацией некоторую структуру. getx и gety возвращают (относительно графическогоокна) x- и y-координаты текущей позиции. getpixel возвращает цвет указанного пикселя.
Функция запросасостояния категориивывода текста в графическом режиме имеется только одна - gettextsettings. Эта функция заполняет структуруинформацией отекущем символьном шрифте, направлении вывода текста (по горизонтали или по вертикали)6 коэффициенте увеличениясимволов, а также виде выравнивания (как для горизонтально, так идля вертикально-ориентированных текстов).
Функциями запроса состоянии категорииуправления цветом являются getbkcolor,возвращающая текущий цвет фона, getcolor, возвращающая текущий цвет вычерчивания и getpalette,заполняющая структуру, которая включаетв себя размер текущей палитры и ее содержимое. getmaxcolor возвращает максимально допустимое значение пикселя для текущего графического драйвера и режима (размер палитры -1).