Програмиране на C
Абстрактен портал
Препоръчва се
Катедра: Автоматика и информационни технологии
C ПРОГРАМИРАНЕГРАФИЧЕН РЕЖИМ
1. ПРЕГЛЕД НА ГРАФИЧНИТЕ ФУНКЦИИ3
1.1. Главна информация
1.2. Инициализиране на графичния драйвер и режим
1.3. Работа с растер от точки
1.4. Управление на цветовете
1.6. Графични примитиви
1.7. Извеждане на графичен текст
2. ТЕХНИКИ ЗА ПРОГРАМИРАНЕ НА ГРАФИЧНИЯ РЕЖИМ
2.1. Свързване на графичната библиотека
2.2. Инициализация на графичен режим
2.3. Включително драйвера и шрифтовете в изпълнимия файл
2.4. Рисуване на геометрични фигури
2.5. Разпределяне на памет за големи едномерни масиви
2.6. Извеждане на числова информация
2.7. Забавяне на екрана
2.8. Реакцията на програмата при натискане на определен клавиш
2.9. Организация на цифровия вход
2.10 Проверка на изхода на аргумента на функцията от ODZ
2.11.Графични и математически координатни системи
2.13 Чертеж на изображения в bmp формат
2.14.Работа с мишката
3. ЗАДАЧИ ЗА ЛАБОРАТОРНА РАБОТА
3.1. звездно небе
3.3. Чертане на графика на функция
3.4. Звездно въртене
1.ПРЕГЛЕД НА ГРАФИЧНИТЕ ФУНКЦИИ
1.1. Обща информация
Графичният режим на персоналните компютри е по-привлекателен от текстовия режим. Сериозните софтуерни приложения, написани под DOS, като правило имат графична обвивка.
Графичният дисплей, който се появява на екрана на монитора, е резултат от следните действия:
На адаптери за дисплей с монохромен монитор стойността на атрибутаконтролира интензитета на един електронен лъч, т.е. яркостта на точка от екрана, а при цветен монитор - интензитета на трите лъча, които съставляват цветовите компоненти на пикселното изображение. Като правило се използва разделянето на цвета на RGB компоненти - червено, зелено и синьо. Ако всеки компонент има N градации, тогава общият брой цветови нюанси за такъв адаптер е N_colors=N3, като черното, бялото и сивата скала са включени в броя на нюансите.
1.2.Инициализиране на графичен драйвер и режим
Графичната система се състои от ядро и обширна библиотека от графични функции, graphics.lib (която трябва да бъде включена при свързване на програмен модул). Когато създавате програма, която има достъп до графични функции, текстът на програмата трябва да включва файл, съдържащ прототипи на функции, константи, типове данни и различни изброени типове:
Графичният интерфейс BGI (Borland Graphics Interface) на Borland International се състои от два компонента: постоянно графично ядро и набор от графични драйвери. Графичното ядро обработва всички заявки от приложната програма за изпълнение на графични функции. Не зависи от вида на свързания дисплей адаптер. Зависещата от хардуера част са графичните драйвери, които взаимодействат между системното ядро и конкретен адаптер за дисплей.
Графичните драйвери се съдържат в отделни .bgi файлове. Всеки файл съдържа двоично изображение (двоично изображение) на драйвера за един или повече подобни адаптери. За използване в програмата на всеки драйвер се присвоява постоянен номер, който съответства на макро заместване, например EGA или VGA.
Графичните драйвери поддържат много (но не всички) графични режимиадаптери за дисплей, предоставени от BIOS. За да зададете графични режими в програмите, както и за драйвери, се предоставят макро замествания (EGALO, EGAHI, VGAHI и други).
Преди достъп до графични функции, програмата трябва да избере подходящия графичен драйвер за адаптера на дисплея и да го свърже към графичното ядро. Графичната библиотека съдържа функция detectgraph за тестване на хардуера и автоматично избиране на подходящ драйвер и графичен режим. Прототипът на тази функция е
void far detectgraph(int far *graph_driver,int far *graph_mode);
Тази функция чрез своите аргументи връща номера на графичния драйвер и номера на графичния режим, който осигурява максимална разделителна способност за адаптера. Стойностите, върнати от тази функция, могат по-късно да бъдат предадени на функцията за инициализация на графичната система initgraph (но можете също да изберете друг режим, поддържан от този драйвер за инициализация).
Ако по време на хардуерното тестване не бъде открит адаптер за дисплей, тогава функцията graphresult връща -2. Функцията graphresult връща текущата стойност на вътрешна променлива, съдържаща изходния код за графичните функции. Нейният прототип
int far graphresult(void);
Отрицателната стойност на кода за прекратяване, зададен от някаква графична функция, се съхранява във вътрешна променлива, докато не бъде извикана функцията graphresult, след което се нулира.
Възможно е да получите низ, съдържащ описание на всеки от валидните изходни кодове за графични функции. За какво е функцията grapherrormsg? Функционален прототип -
char far *grapherrormsg(int error_code);
Ако тази функция бъде предадена, стойността, върната от функциятаgraphresult, можете да получите съобщение за изходния код на последната графична функция.
Графичният драйвер трябва да бъде поставен в RAM, преди да бъде извикана функция на графична библиотека.
Най-лесният начин да включите драйвер в програма е автоматично да го заредите с помощта на функцията initgraph с прототип
void initgraph(int far *graph_driver,int far *graph_mode,char far *path_to_bgi);
Аргументите на тази функция са указатели към променливи, съдържащи номера на графичния драйвер, номера на графичния режим и пътя до BGI файла на драйвера. Функцията initgraph търси на диска BGI файл, съдържащ необходимия драйвер, зарежда целия файл в динамично разпределената памет и конфигурира системното ядро да работи с този драйвер. Ако инициализирането е било успешно, функцията graphresult ще върне нулева стойност GR_Ok, в противен случай ще върне една от отрицателните стойности, дефинирани във файла graphics.h.
void far closegraph(void)
Пример за автоматично зареждане на драйвери и инициализация на системата :
детектиране(&gd,&gm); /* определя номера на драйвера и режима */
грешка=графичен резултат(); /* получаване на изходен код */
грешка=графичен резултат(); /* получаване на изходен код */
closegraph(); /* изключване на системата */
Основният недостатък на автоматичното зареждане на драйвер с функцията initgraph е, че той осъществява достъп до диска, за да прочете BGI файла, докато програмата работи. Алтернатива на автоматичното зареждане на графичен драйвер е да го активирате статично на етапа на изграждане на програмата. Двоичният файл на драйвера .bgi трябва първо да бъде преобразуван в обикновен обектен файл от типа .obj с помощта на специалната помощна програма bgiobj.exe. Между другото,тази програма се използва и за конвертиране на chr файлове с графични шрифтове в обектни модули. Получените обектни модули се включват по време на свързване.
В програмата, преди да инициализирате графичната система, е необходимо да регистрирате необходимите драйвери, т.е. да информирате графичната система, че този драйвер вече е в RAM. За да направите това, има функция registerbgidriver, на която трябва да се каже местоположението на драйвера:
int registerbgidriver(void (*driver)(void));
Аргументът на функцията е името на указател към място в паметта, съдържащо регистрирания драйвер. Имената на такива указатели вече са дефинирани в обектните файлове, създадени с помощната програма bgiobj.exe. По-долу са прототипите на функции, чиито имена трябва да се използват за стандартни драйвери:
Ако регистрацията е успешна, функцията graphresult ще върне нула, в противен случай -4. След като регистрирате драйвера, можете да инициализирате графичната система с помощта на функцията initfgraph, докато третият й параметър не се използва (нулевият низ "") се предава.
Пример за зареждане на статичен драйвер и инициализация на системата: