Программирование в СИ - Программирование, компьютеры и кибернетика лабораторная работа

Программирование в СИ - Программирование, компьютеры и кибернетика лабораторная работа



































Инициализация графического драйвера и режима. Функции доступа к видеопамяти. Подключение графической библиотеки. Инициализация графического режима. Включение драйвера, шрифтов в исполняемый файл. Рисование геометрических фигур. Вывод числовой информации.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Кафедра: Автоматика и Информационные Технологии
ПРОГРАММИРОВАНИЕ В СИ РАБОТА В ГРАФИЧЕСКОМ РЕЖИМЕ
1.2. Инициализация графического драйвера и режима
1.5. Базовые функции доступа к видеопамяти
2. ПРИЕМЫ ПРОГРАММИРОВАНИЯ ГРАФИЧЕСКОГО РЕЖИМА
2.1. Подключение графической библиотеки
2.2. Инициализация графического режима
2.3. Включение драйвера и шрифтов в исполняемый файл
2.4. Рисование геометрических фигур
2.5. Выделение памяти под большие одномерные массивы
2.8. Реакция программы на нажатие конкретной клавиши
2.9. Организация ввода числовой информации
2.10.Проверка выхода аргумента функции из ОДЗ
2.11.Графическая и математическая системы координат
2.12.Использование двух видеостраниц
2.13.Рисование изображений в bmp-формате
Графический режим персональных компьютеров является более привлекательным, чем текстовый режим. Серьезные программные приложения, написанные под DOS, как правило, имеют графическую оболочку.
В самых общих чертах работа с дисплеем ПК в графическом режиме может быть представлена следующим образом. Экран дисплейного монитора представляется как набор отдельных точек - пикселей (pixels, от английского picture elements), образующий прямоугольный растр. Число пикселей определяет разрешающую способность (разрешение) графической системы и обычно отражается парой чисел, первое из которых показывает количество пикселей в строке, а второе - число строк. Каждому пикселю экрана ставится в соответствие фиксированное количество битов (атрибут пикселя) в некоторой области адресного пространства центрального микропроцессора ПК. Эта область, называемая видеопамятью, как правило, является частью дисплейного адаптера (видеоадаптера) - специального устройства, управляющего работой монитора. Видеоадаптер, в частности, осуществляет циклическое воспроизведение содержимого видеопамяти на экране монитора. Причем изображение каждого пикселя определяется текущим значением его атрибута. Такой подход получил название битовой карты - bit-mapped graphics. Программе, выполняющейся на ПК в графическом режиме, доступны для чтения и записи все пиксели видеопамяти.
В ряде случаев возможно одновременное существование в видеопамяти двух или более областей одинаковой структуры, каждая из которых содержит атрибуты всех пикселей экрана. Такие области называются страницами. В определенный момент времени любая из страниц может отображаться видеоадаптером на дисплее, занимая при этом весь экран. Наличие страниц позволяет программе быстро менять изображение на экране, просто переключаясь с одной страницы на другую. В частности, это дает возможность проводить всю “черновую работу” по подготовке графического изображения на неотображаемой в настоящий момент времени странице, избегая появления на экране побочных графических эффектов.
Графическое отображение, возникающее на экране монитора, является результатом выполнения следующих действий:
· атрибуты пикселей изображения должны быть загружены в память. Обычно эту работу осуществляют специальные функции DOS или BIOS, однако возможна и прямая работа с видеопамятью;
· специальная схема видеоадаптера обеспечивает периодическое считывание видеопамяти и преобразование значений атрибутов пикселей в последовательность сигналов, управляющих монитором.
В персональных компьютерах используются различные типы дисплейных адаптеров (CGA, EGA, VGA и др.), большинство из которых может работать в различных режимах (текстовых и графических), называемых также видеорежимами (video modes). Графические режимы одного адаптера различаются разрешающей способностью, количеством цветов, количеством страниц видеопамяти и способом их адресации. Установкой графического режима управляет прерывание BIOS с номером 10h.
Поскольку объем страницы видеопамяти ограничен, то количество битов, приходящиеся на один пиксель, находится в обратной зависимости от общего количества пикселей на экране. Обычно атрибут пикселя состоит из 1, 2, 4 или 8 бит, в зависимости от графического режима. Все пиксели, имеющие одинаковое значение атрибута, отображаются на экране одинаковым образом.
Если атрибуту каждого пикселя в видеопамяти отводится только один бит, то графика будет двухцветной, например черно-белой (конкретные цвета зависят от типа монитора). Если каждый пиксель в графическом режиме представляется n битами, то в таком режиме имеется возможность одновременно представить на экране N_pallette=2 n оттенков цвета (палитра режима). В некоторых графических системах принято в этом случае говорить о наличии n плоскостей цветов (color planes).
В дисплейных адаптерах с монохромным монитором значение атрибута управляет интенсивностью одного электронного луча, т. е. яркостью точки на экране, а с цветным монитором - интенсивностью трех лучей, составляющих цветовые компоненты изображения пикселя. Как правило, используется разделение цвета на RGB-компоненты - красную, зеленую и синюю. Если каждая компонента имеет N градаций, то общее число цветовых оттенков для такого адаптера составляет N_colors=N 3 , при этом в число цветовых оттенков включаются черный, белый и градации серого.
Цветной видеоадаптер имеет схему, которая осуществляет во время развертки кадра преобразование значения атрибута каждого пикселя в сигналы управления интенсивностью электронных лучей монитора, отвечающих за RGB-компоненты. Работу схемы можно представить таблицей, по каждому входу которой хранится описание цвета, используемого адаптером при выводе на экран всех пикселей, значения атрибутов которых равны номеру этого входа. Такая схема называется картой или таблицей цветов. Если максимальный размер пикселя в графических режимах, поддерживаемых данным адаптером, представляется m битами, то таблица цветов такого адаптера содержит N_table=2 m строк (входов). Все три цветовые компоненты в карте цветов представлены, как правило, двоичными числами одинаковой разрядности. Способ кодирования цвета зависит от типа видеоадаптера.
Программное управление цветами пикселей на экране дисплея может осуществляться без изменений значений атрибутов пикселей в видеопамяти. Для этого нужно загрузить соответствующие значения RGB-компонент в таблицу цветов по входу с номером, равным значению нужного атрибута. Изменения карты цветов немедленно отображаются на экране изменением цвета пикселей.
Графическая система состоит из ядра и обширной библиотеки графических функций graphics.lib (ее нужно подключать при компоновке программного модуля). При создании программы, обращающейся к графическим функциям, в текст программы нужно включить файл, содержащий прототипы функций, константы, типы данных и различные перечислимые типы:
Графический интерфейс фирмы Borland International (BGI - Borland Graphics Interface) состоит из двух компонент: постоянного ядра графической системы и набора графических драйверов. Ядро графической системы воспринимает все запросы прикладной программы на выполнение графических функций. Оно не зависит от типа подключенного дисплейного адаптера. Аппаратно-зависимой частью являются графические драйверы, осуществляющие интерфейс между ядром системы и конкретным дисплейным адаптером.
Графические драйверы содержатся в отдельных файлах с расширением .bgi. Каждый файл содержит бинарный образ (binary image) драйвера для одного или нескольких близких по типу адаптеров. Для использования в программе за каждым драйвером закреплен постоянный номер, которому соответствует макроподстановка, например, EGA или VGA.
Графические драйверы поддерживают многие (но не все) графические режимы дисплейных адаптеров, предусмотренные системой BIOS. Для указания в программах графических режимов, как и для драйверов, предусмотрены макроподстановки (EGALO,EGAHI, VGAHI и другие).
Прежде чем обращаться к графическим функциям, программа должна выбрать графический драйвер, соответствующий дисплейному адаптеру, и подключить его к ядру графической системы. Графическая библиотека содержит функцию detectgraph, предназначенную для тестирования аппаратуры и автоматического выбора подходящего драйвера и графического режима. Прототип этой функции -
void far detectgraph(int far *graph_driver,int far *graph_mode);
Данная функция через свои аргументы возвращает номер графического драйвера и номер графического режима, обеспечивающего максимальное для адаптера разрешение. Возвращенные этой функцией значения в дальнейшем могут передаваться функции инициализации графической системы initgraph (но можно для инициализации выбрать и другой режим, поддерживаемый данным драйвером).
Если при тестировании аппаратуры дисплейного адаптера не обнаружено, то функция graphresult возвращает значение -2. Функция graphresult возвращает текущее значение внутренней переменной, содержащей код завершения работы графических функций. Ее прототип
Отрицательное значение кода завершения, установленное какой-либо графической функцией, хранится во внутренней переменной вплоть до вызова функции graphresult, после чего оно обнуляется.
Имеется возможность получить строку, содержащую описание любого из допустимых кодов завершения графических функций. Для чего существует функция grapherrormsg. Прототип функции -
char far *grapherrormsg(int error_code);
Если этой функции передать значение, возвращаемое функцией graphresult, то можно получить сообщение о коде завершения последней графической функции.
Графический драйвер должен быть помещен в оперативную память до того, как произойдет обращение к какой-нибудь функции графической библиотеки.
Простейшим способом включения драйвера в программу является его автоматическая загрузка при помощи функции initgraph с прототипом
void initgraph(int far *graph_driver,int far *graph_mode,char far *path_to_bgi);
Аргументами данной функции являются указатели на переменные, содержащие номер графического драйвера, номер графического режима и путь к BGI-файлу драйвера. Функция initgraph ищет на диске BGI-файл, содержащий требуемый драйвер, загружает файл целиком в динамически выделяемую память и настраивает ядро системы на работу с этим драйвером. Если инициализация прошла успешно, функция graphresult возвратит нулевое значение GR_Ok, в противном случае - одно из отрицательных значений, определенных в файле graphics.h.
прекращает работу графической системы. Она освобождает всю память, выделенную по запросам графических функций, очищает буфер видеоадаптера и восстанавливает текстовый режим, существовавший перед инициализацией графической системы.
Пример автоматической загрузки драйвера и инициализации системы:
detectgraph(&gd,&gm); /* определение номера драйвера и режима */
err=graphresult(); /* получение кода завершения */
if(err) { printf(“\n%s”,grapherrormsg(err)); return 1; }
initgraph(&gd,&gm,”c:\\borlandc\\bgi”); /* инициализация системы */
err=graphresult(); /* получение кода завершения */
if(err) { printf(“\n%s”,grapherrormsg(err)); return 2; }
/* ................различные операторы..............*/
closegraph(); /* завершение работы системы */
Можно не определять номера драйвера и режима тестированием аппаратуры, а задавать их по желанию, главное при этом соблюдать соответствие выбираемого драйвера и имеющегося в распоряжении видеоадаптера. Приведенный выше пример можно изменить тогда следующим способом:
initgraph(&gd,&gm,”c:\\borlandc\\bgi”);
/* ................различные операторы..............*/
Главным недостатком автоматической загрузки драйвера при помощи функции initgraph является то, что она обращается к диску для чтения BGI-файла во время выполнения программы. Альтернативой автоматической загрузке графического драйвера является его статическое включение на этапе построения программы. Предварительно бинарный файл драйвера .bgi должен быть превращен в обычный объектный файл типа .obj специальной утилитой bgiobj.exe. Кстати, данная утилита используется также для конвертирования chr-файлов с графическими шрифтами в объектные модули. Полученные объектные модули подключаются на этапе компоновки.
В программе, прежде чем инициализировать графическую систему, необходимо нужные драйверы зарегистрировать, т. е. сообщить графической системе, что данный драйвер уже находится в оперативной памяти. Для этого существует функция registerbgidriver, которой нужно сообщить местоположение драйвера:
int registerbgidriver(void (*driver)(void));
Аргумент функции - имя указателя на место в памяти, содержащее регистрируемый драйвер. Имена подобных указателей уже определены в объектных файлах, созданных при помощи утилиты bgiobj.exe. Ниже приведены прототипы функций, имена которых нужно употреблять для стандартных драйверов:
Если регистрация прошла успешно, функция graphresult возвратит нулевое значение, в противном случае -4. После регистрации драйвера можно инициализировать графическую систему при помощи функции initfgraph, при этом ее третий параметр не используется (передается нулевая строка “”).
Пример статической загрузки драйвера и инициализации системы:
err=graphresult(); /* получение кода завершения */
initgraph(&gd,&gm,""); /* инициализация системы */
/* ................различные операторы..............*/
closegraph(); /* завершение работы системы */
Если графическая система активизирована и необходимо по ходу выполнения программы переключиться на использование другого графического драйвера, то до повторного вызова функции initgraph необходимо сбросить графическую систему функцией closegraph для освобождения всей памяти, которую занимала система.
Имя текущего графического драйвера можно узнать с помощью функции
Она возвращает указатель на строку, содержащую имя активного в данный момент драйвера.
Максимальное значение номера графического режима, допустимое для текущего графического драйвера, можно узнать с помощью функции
Текущее значение номера графического режима для активизированного драйвера возвращает функция
По номеру режима можно получить строку с описанием данного режима для текущего драйвера. Это делается с помощью функции
char far *getmodename(int mode_number);
В графической библиотеке есть функция определения минимально и максимально допустимых значений номера графического режима для графического драйвера, номер которого ей передается (необязательно активизированного)
void far getmoderange(int graph_driver,int far *min_mode,int far *max_mode);
Есть две функции, позволяющие изменять установленный графический режим без повторного обращения к функции initgraph и даже переходить временно в текстовый режим работы видеоадаптера. Если нужно перейти в другой графический режим активизированного в данный момент драйвера, то можно воспользоваться функцией
void far setgraphmode(int new_mode);
Аргумент new_mode передает желаемый номер режима для текущего драйвера и не должен превосходить максимально допустимое для этого драйвера значение.
Для временного перехода в текстовый режим предусмотрена функция
Эта функция переводит видеоадаптер в тот текстовый режим, в котором он находился в момент последней инициализации графической системы, т. е. непосредственно перед обращением к функции initgraph. Из текстового режима можно вернуться в графический при помощи функции setgraphmode.
При инициализации графической системы всевозможные параметры системы устанавливаются по умолчанию. Различные функции могут менять значения параметров. Для того чтобы в любой момент восстановить характеристики системы, установленные при ее инициализации, существует функция
Перечислим действия, выполняемые данной функцией:
· для вывода и отображения на экране выбирается нулевая страница видеопамяти;
· графическое окно устанавливается размером во всю страницу;
· текущая графическая позиция перемещается в точку (0,0);
· устанавливаются по умолчанию цвета палитры, текущий рисующий цвет (15) и цвет фона (0);
· устанавливается сплошной шаблон для рисования линий и заполнения областей;
· инициализируется встроенный матричный шрифт со стандартным расположением и позиционированием строки.
Растром точек называется двумерная совокупность точек, представляющая экран дисплея.
Чтобы в прикладной программе иметь возможность отобразить на экране любую из имеющихся страниц видеопамяти, в графической библиотеке предусмотрена функция
Функция немедленно отображает на экране ту страницу видеопамяти, номер которой был ей передан в качестве аргумента. Страницы нумеруются с нуля. Функция graphresult не реагирует на попытку установить недопустимый номер страницы. Вся ответственность за правильность указанного номера лежит на программисте. Функция
не вызывает перерисовки страницы на экране дисплея, но зато направляет весь последующий графический вывод на ту страницу, которая указана ее аргументом. Как и при вызове предыдущей функции, ответственность за допустимость номера страницы остается на программисте.
Страницу видеопамяти (и экран дисплея) можно представить как двумерный прямоугольный массив точек (пикселей). На этом массиве точек вводится система координат X, Y. Начало системы лежит в левом верхнем углу страницы (экрана). Ось X проходит по верхнему краю страницы слева направо, а ось Y - по левому краю сверху вниз. Левая верхняя точка страницы имеет координаты (0, 0), правая нижняя - координаты (M-1, N-1), где M и N - размеры страниц по горизонтали и вертикали.
Определить максимальные значения координат точек можно с помощью функций
Значения, возвращаемые этими функциями, зависят только от текущего режима, установленного функциями initgraph или setgraphmode.
В распоряжении программиста кроме страницы как целого имеется еще одна двумерная структура. Внутри основного массива точек страницы всегда выделен некоторый его подмассив, который называется графическим окном (viewport). Графическое окно является прямоугольным массивом точек со своей системой координат. Начало этой системы координат находится в левом верхнем углу графического окна, а оси X и Y параллельны соответствующим осям координат страницы. Само окно имеет переменные размеры и может располагаться в любом месте экрана. Замена страницы никак не влияет на характеристики окна.
Многие функции, использующие координаты точек, подразумевают именно систему координат графического окна. Благодаря этому появляется возможность использовать одну и ту же программу для выполнения некоторой графической работы в окне независимо от того, в каком месте страницы и даже на какой именно странице окно находится в данный момент. В дальнейшем при описании таких функций всегда будет указываться, какая система координат (страницы или окна) имеется в виду.
При установке графического режима при помощи функций initgraph и setgraphmode сразу же создается и графическое окно, совпадающее по размерам со всей страницей. Однако есть возможность управлять размерами и расположением графического окна динамически. Делается это с помощью функции
void far setviewport(int left.int top,int right,int bottom,int clip);
Первые четыре аргумента - это координаты левой верхней и правой нижней границ графического окна в системе координат страницы. Ни одна из границ окна не может лежать за пределами страницы. Последний аргумент устанавливает режим отсечения: если он не нулевой, то всякий графический вывод будет обрезаться на границах графического окна. Если при вызове фунции setviewport были неверно заданы аргументы, то функция graphresult возвратит -11 и сохранится предыдущая установка графического окна. Функция setviewport не меняет содержимое страницы видеопамяти.
Для того чтобы можно было в любой момент узнать текущую установку графического окна, существует функция
void far getviewsettings(struct viewporttype far *viewport);
Данная функция помещает параметры текущего окна в структуру *viewport. Тип этой структуры определен в файле graphics.h:
Возвращаемые координаты представлены в системе координат стра-ницы.
С графическим окном связано понятие текущей графической позиции CP (current graphics position). Это графический эквивалент курсора в текстовом режиме. Текущая графическая позиция сама собой никак не отображается на экране и идентифицирует выбранный пиксель графического окна, к которому привязывается действие некоторых функций, таких как вычерчивание прямолинейных отрезков или вывод графических текстов.
При установке нового графического окна текущая позиция автоматически помещается в его начало координат. Для явного изменения положения текущей позиции используются функции
Первая помещает CP по указанным координатам графического окна. Вторая перемещает CP на вектор (dx, dy).
Координаты текущей графической позиции в системе координат графического окна возвращают функции:
При переустановке графического окна функцией setviewport содержимое страницы видеопамяти не изменяется. Для очистки графического окна на активной в данный момент странице используется функция
CP при этом перемещается в начало координат графического окна.
очищает всю активную страницу. Установка графического окна при этом не изменяется, а CP перемещается в его начало координат.
На многих мониторах пиксель, который высвечивается на экране, имеет форму прямоугольника, вытянутого по вертикали. Это объясняется тем, что на дисплее страница видеобуфера отображается на весь экран, а пропорции экрана и страницы в режиме максимального разрешения, как правило, не совпадают (исключение - мониторы с адаптерами VGA, где в режиме с разрешением 640 х 480 точек все пиксели квадратные). Такое несоответствие приводит к возникновению анизотропности растра пикселей: горизонтальный и вертикальный отрезки, содержащие одинаковое число пикселей, на экране будут выглядеть, как отрезки разной длины.
Тем не менее, окружности и их дуги рисуются функциями библиотеки правильно, так как эти функции используют хранящийся в графической системе корректирующий коэффициент пропорциональности (aspect ratio), учитывающий “степень неквадратности” пикселя. Чтобы правильно нарисовать квадрат, необходимо произвести корректировку количества пикселей по его горизонтальной и вертикальной сторонам. Истинные пропорции пикселя на данном дисплее можно узнать с помощью функции
void far getaspectratio(int far *x_asp,int far *y_asp);
Данная функция через свои аргументы возвращает искомое значение, причем *y_asp всегда устанавливается равным 10 000, а величина *x_asp ? *y_asp. Отношение *x_asp к *y_asp как раз и есть отношение горизонтального и вертикального размеров пикселя. Теперь, если горизонтальная сторона квадрата представлена отрезком длиной X пикселей, то длина вертикальной стороны должна быть равна значению выражения
Y = (int)(X • (float)(*x_asp) / (*y_asp)).
Заметим, что коэффициент “неквадратности” автоматически учитывается только функциями, которые рисуют окружности и их дуги, но никак не влияет на функции рисования эллипсов и их дуг.
Цветовые возможности функций графической библиотеки Borland C описываются в терминах цветовой палитры режима - закона, по которому каждому допустимому значению атрибута пикселя ставится в соответствие цвет, которым этот пиксель будет отображаться на экране.
Палитру режима можно представить как таблицу, содержащую столько строк (входов), сколько значений допускается для атрибута пикселя в данном графическом режиме. Строки палитры режима нумеруются от нуля до N_palette-1. В строке с номером k содержится код цвета, которым аппаратура видеоадаптера отображает на экране все пиксели страницы, атрибуты которых равны k. Нулевой вход палитры режима, кроме того, определяет цвет фона экрана.
Все графические режимы можно разделить на три группы:
· монохромные режимы, в которых все пиксели могут быть двух цветов - основного и фонового. Палитру таких режимов изменить невозможно;
· цветные режимы с фиксированной палитрой. Для изменения палитры режима нужно менять графический режим, что приводит к потере содержимого видеопамяти;
· графические режимы, позволяющие динамически (без потери содержимого видеопамяти) изменять код цвета по любому входу палитры режима. К данным режимам относятся режимы драйверов EGA, VGA, IBM8514.
Механизм управления цветом в Borland C включает в себя важный элемент - структуру данных, называемую внутренней палитрой. При работе в графических режимах на всех дисплейных адаптерах, кроме VGA и IBM8514, она содержит коды цветов из таблицы цветов адаптера. Роль внутренней палитры при работе с адаптером VGA несколько иная и будет рассмотрена ниже. Драйвер IMB8514 вообще не пользуется внутренней палитрой, поэтому в дальнейшем все, что будет говориться о работе с внутренней палитрой, не относится к этому драйверу. Не следует путать внутреннюю палитру (обычную переменную структурного типа) графической системы с палитрой режима с законом преобразования значения пикселя в цвет.
Определение внутренней палитры как структуры данных имеет вид:
где size - это число строк внутренней палитры, разрешенное для использования в текущем графическом режиме, а colors - массив закодированных описаний цвета.
Для всех монохромных режимов и режимов с фиксированными палитрами допускается использование во внутренней палитре 16 цветов, которые в точности совпадают со стандартными цветами текстового режима. Каждый цвет палитры кодируется числом от 0 до 15. При инициализации таких графических режимов значение каждого элемента массива colors совпадает с его индексом.
В режимах с динамическим управлением внутренняя палитра содержит 16 цветов, коды которых могут лежать в диапазоне от 0 до 63 (т. е. имеется возможность менять содержание внутренней палитры). Для 16 кодов цветов стандартного набора, устанавливаемых при инициализации этих режимов (как для драйвера EGA, так и VGA), определен перечислимый тип EGA_COLORS, т. е. стандартные коды цветов имеют символические имена:
EGA_BLACK=0, EGA_BLUE=1, EGA_GREEN=2, EGA_CYAN=3, EGA_RED=4, EGA_MAGENTA=5, EGA_BROWN=20, EGA_LIGHTGRAY=7, EGA_DARKGRAY=56, EGA_LIGHTBLUE=57, EGA_LIGHTGREEN=58, ЕGA_LIGHTCYAN=59, EGA_LIGHTRED=60, EGA_LIGHTMAGENTA=61, EGA_YELLOW=62, EGA_WHITE=63
Количество динамически управляемых строк таблицы цветов для текущего графического режима можно определить при помощи функции:
При определении реального цвета пикселя на экране значение его атрибута используется как индекс в таблице цветов дисплейного адаптера. Максимальное значение атрибута пикселя, которое разрешается использовать для записи в видеопамять такими функциями, как графические примитивы, возвращается функцией
Непосредственное изменение внутренней палитры осуществляется с помощью функций setpalette или setallpalette. Первая изменяет содержание только одного входа палитры, а вторая всех сразу. Синтаксис первой функции:
void far setpalette(int num_color_pallete,int num_color);
Аргумент num_color_palette задает номер изменяемого входа внутренней палитры и должен лежать в пределах от нуля до size-1 (size - элемент структуры данных palettetype). Аргумент color задает новое значение кода цвета для этого входа в диапазоне от 0 до 63 (реально используются только шесть младших бит аргумента num_color).
Другая функция, изменяющая внутреннюю палитру, имеет синтаксис:
void far setallpalette(struct palettetype far *palette);
Аргумент ее является указателем на структуру, содержащую ва-риант желаемой палитры. Все изменения в текущей внутренней палитре, произведенные функциями setpalette и setallpalette немедленно отображаются на экране дисплея.
Цветом фона можно управлять с помощью функции
void far setbkcolor(int num_color_palette);
Действие функции заключается в том, что нулевой вход внутренней палитры связывается со входом, имеющим номер num_color_palette. Это означает, что в нулевой элемент внутренней палитры записывается значение, которое в данный момент содержится в элементе с номером num_color_palette. Кроме того, все последующие изменения содержимого элемента с номером num_color_palette будут немедленно дублироваться в нулевой элемент. Заметим, что функция setpalette(0, color) просто изменяет цвет фона, но не связывает нулевой вход ни с каким другим.
Обратной для функции установки цвета фона является функция
которая возвращает текущее назначение для фонового цвета, т.е. номер того входа внутренней палитры, с которым связан в настоящий момент нулевой вход. Если ранее при помощи функции setbkcolor не произошло связывания ни с каким входом, то getbkcolor возвращает 0.
Для получения информации о текущей внутренней палитре существует две функции:
void far getpalette(struct palettetype far *palette);
struct palettetype far *getdefaultpalette(void);
Первая копирует в область памяти, на которую указывает аргумент, текущее состояние внутренней палитры. Другая возвращает указатель на хранящуюся в графической системе структуру, содержащую эталон внутренней палитры. Получив указатель на эту структуру, можно изменить сам эталон палитры. Такие изменения будут сохраняться до следующей инициализации какого-либо режима.
Все вышеописанные способы динамического управления цветом рассчитаны на адаптеры, в которых пиксель может быть представлен не более чем четырьмя битами. Однако некоторые адаптеры допускают восьмибитовую величину атрибута пикселя (IBM8414 и VGA, имеющие в таблице цветов 256 входов). Для них существует расширенная палитра, которая содержит 256 входов. Каждый вход соответствует коду цвета. Для того чтобы какому-либо коду соответствовал другой оттенок цвета, используется функция
void far setrgbpalette(int num_color,int red,int green,int blue);
Аргумент num_color - номер входа расширенной палитры (0-255), по которому хранятся три цветовые компоненты - красная, зеленая и синяя - составляющие желаемый цвет. Функция позволяет записать по входу расширенной палитры с номером color цветовые компоненты red, green и blue. При этом реально используются только младшие шесть байт каждой компоненты. Таким образом, общее количество цветовых оттенков равно N_colors=64*64*64=256К.
Отметим некоторые особенности использования драйвера VGA. Значения элементов массива colors (кодов цветов) обычной внутренней палитры служат индексами для поиска нужного цвета в расширенной таблице, откуда происходит выбор нужного оттенка цвета.
Заметим, что функция setrgbpalette правильно работает только с дисплейными адаптерами VGA и IBM8514. На других конфигурациях ПК она игнорируется. Кстати, изменить палитру при работе с адаптером IBM8514 можно только при помощи функции setrgbpalette.
Рассмотрим теперь понятие текущего значения рисующего цвета (current drawing color). Рисующий цвет - это т
Программирование в СИ лабораторная работа. Программирование, компьютеры и кибернетика.
Курсовая Работа На Тему Судебная Реформа Александра Ii (20 Ноября 1864 Года)
Сказка Шахерезады Для Султана Сочинение
Доклад: Якубович Леонид Аркадьевич
Реферат по теме Психология и её связь с другими науками
Правоохранительная Деятельность Таможенных Органов Курсовая
Реферат Личностно Ориентированные Технологии Образования
Реферат по теме Организационные и адаптивные структуры
Реферат: Имплантаты в стоматологии
Реферат Принципы Реферирования
Реферат: Оказание первой медицинской помощи при автомобильных катастрофах. Скачать бесплатно и без регистрации
Реферат: Роль и место финансов в рыночной экономике
Курсовая работа по теме Угрозы территориальной безопасности в Восточной Азии
Производства Стали Реферат
Лабораторная Работа Погрешности
Реферат: Виды космических аппаратов
Реферат: Экономические реформы в Китае и России и преимущества и недостатки
Доклад: Развращение и насилие у детей
Сочинение Рассуждение Почему Важно Бороться За Злость
Написать Сочинение Герой Нашего Времени
Дипломная работа по теме Мотивация персонала в современной организации (на примере ОАО МЭЗ "Лискинский")
Совет Европы и Азербайджан - Международные отношения и мировая экономика курсовая работа
Психология здоровья и здорового образа жизни - Безопасность жизнедеятельности и охрана труда презентация
Изменения транскрипционной активности синтаз оксида азота с возрастом и при развитии ретинопатии - Медицина курсовая работа


Report Page