C++: Стандартные библиотечные функции работы с графикой
Обновлено
2
Волжский Университет им. В.Н. Татищева
Факультет Информатики и Телекоммуникаций
Курсовая работа
Дисциплина: Системное программное обеспечение
Тема:
«C++: Стандартные библиотечные функции работы с графикой»
Тольятти 200г.
Содержание
Введение1. Анализ графического модуля “graphics.h”1.1 Анализ функции модуля1.2 Анализ констант, типов и глобальных переменных модуля2. Реализация пользовательской библиотеки “mouse.h”ЗаключениеПриложение 1Список используемой литературыВведениеТема данной курсовой работы стандартные библиотечные функции работы с графикой в C++. В данном работе я постараюсь раскрыть основные моменты работы функций стандартного модуля C++, который можно подключить к любому проекту написанном на языке Си, с помощью заголовочного файла graphics.h. Конечно, кроме данного модуля в современных средах разработки программных приложений на данном языке есть и такие не менее интересные модули как glu32.lib и glaux.lib, подключаемые к проектам с помощью заголовочных файлов gl.h, glu.h, glaux.h. Они позволяют программисту показать всю красоту приложения, а также могут использоваться для спецэффектов, но данные модули предназначены для работы с библиотекой opengl32.dll. Использование данной библиотеки, по сути дела, является работа с “компьютерной графикой”, но под графические оболочки таких операционных систем как Windows 9x/2k/XP, Linux Mandrake/Red Hat/Slackware и тому подобных. Эта тема куда более обширная и интересная, но, как мы знаем, модуль graphics.h предназначен, в основном, для работы под операционную систему MS-DOS, в которой просто невозможно использование самого opengl'а. А по этому поводу, я считаю нужным, перейти непосредственно к основному разделу данной работы. Т.е. приступить к рассмотрению стандартных функций.1. Анализ графического модуля “graphics.h”Как было уже сказано, данный модуль используется для работы с графикой под ОС MS-DOS. Функции, используемые в нём, для работы с графикой, да и как и сама графика, довольно примитивны. Итак, начнём.
Для инициализации модуля требуется подключить, так называемый, заголовочный файл (#include <graphics.h>). В этом файле описаны все функции, которые требуются для написания программы работающей с “графикой”.
1.1 Анализ функции модуляinitgraph( &grdriver, &grmode, “path”); - функция инициализации графического режима, где &grdriver, &grmode, “path” - параметры загружаемого режима;grdriver и grmode - переменные типа integer;“path” - путь к загружаемому драйверу графического режима.Функция закрытия графического режима: closegraph(); - данная функция без каких либо параметров и закрывает текущий графический режим.Функция определения графического драйвера и видео режима: detectgraph( &grdriver, &grmode);Функция, возвращающая структуру определения палитры: getdefaultpalette(); - возвращает указатель на заданную по умолчанию структуру палитры для текущего драйвера инициализированного по initgraph.getdrivername(); - функция возвращает имя текущего графического драйвера.getgraphmode(); - функция возвращает текущий графический режим.getmoderange( grdriver, &low, &high); - функция возвращает диапазон режимов для данного графического драйвера, где grdriver, low, high - переменные типа integer.graphdefaults(); - сбрасывает текущие настройки в настройки по умолчанию._graphgetmem(); - функция выделения памяти. Эту функцию вызывают подпрограммы в графической библиотеке, чтобы распределить память. Данную функцию можно использовать независимо от графической библиотеки, вызвав её с указанием нужного объёма памяти в байтах._graphfreemem(); - функция освобождения памяти. Используется в сочетании с _graphgetmem().setgraphbufsize(); - функция изменяет внутренний размер графического буфера. Вызывается до initgraph().graphresult(); - возвращает код ошибки для последней неудачно выполненной операции.installuserdriver( int *name, int huge( *detect)); - функция устанавливает драйвер определённый программистом. *name - название нового драйвера, *detect - указатель на дополнительную функцию авто определения, которая может сопровождать новый драйвер. Эта функция (авто определения) не берёт ни каких параметров и возвращает целочисленное значение.registerbgidriver( *grdriver) - Функция сообщает графической системе, что драйвер устройства, на который указывает *grdriver был включён во время “линковки”.registerbgifont( *font) - Функция информирует графическую систему, что шрифт, на который указывает *font был включен во время “линковки”.restorecrtmode() - Функция восстанавливает режим, существовавший до активизации графического режима функцией initgraph().arc( int x, int y, int stangle, int endangle, int radius); - Функция рисует дугу, по заданным координатам x, y, начальным и конечным углом stangle, endangle и заданным радиусом radius.bar( int left, int top, int right, int bottom); - Функция рисует прямоугольник начиная от левого верхнего угла с координатами left, top до правого нижнего угла с координатами right, bottom.bar3d( int left, int top, int right, int bottom, int depth); - Функция рисует “трёхмерный прямоугольник” или, так сказать, подобие параллелепипеда, начиная от верхнего левого угла, до правого нижнего угла и с указанием глубины depth.circle( int x, int y, int radius); - Функция рисует окружность с центром в точке с координатами ( x, y) и радиусом radius.cleardevice(); - Функция очищает экран в графическом режиме и возвращает текущую позицию указателя в точку с координатами ( 0, 0).clearviewport(); - Функция стирает область просмотра и перемещает текущую позицию в точку с координатами ( 0, 0), относительно области просмотра.drawpoly( int numpoints, int *polypoints); - Функция рисует полигон с количеством вершин numpoints и координатами вершин *polypoints. *polypoints является одномерным массивом.ellipse( int x, int y, int stangle, int endangle, int xradius, int yradius); - Функция рисует эллипс с координатами в точке ( x, y), начальным и конечным углами stangle, endangle, и радиусами xradius, yradius по осям x и y.fillpoly( int numpoints, int *polypoints); - Функция рисует и закрашивает заданным цветом полигон.fillelipse( int x, int y, int xradius, int yradius); - Функция рисует закрашенный эллипс.floodfill( int x, int y, int border); - Область, ограниченная цветной границей закрашивается установленным образцом и цветом.getarccoords( &arcinfo); - Функция возвращает координаты последней точки, на которую был переведён указатель, где параметр &arcinfo объявлен как struct arccoordstype arcinfo.getaspectratio( &xasp, &yasp); - Получает значения коэффициента сжатия в &xasp, &yasp, где xasp, yasp являются переменными типа integer.getbkcolor() - Возвращает значение типа integer текущего цвета фона.getcolor() - Возвращает значение типа integer установленного на данный момент цвета.getdefaultpalette() - ( дополнение) Возвращает структуру определения палитры в переменную объявленную как struct palettetype far *<имя_переменной>=(void *) 0;.getfillpattern( char far *pattern); - Копирует определённый пользователем заполненный образец в память.getfillsetting( &fillinfo); - Получает информацию о текущих настройках стиля и цвета, где параметр &fillinfo объявлен как struct fillsettingstype fillinfo.getimage( int left, int top, int right, int bottom, void far *bitmap); - Сохраняет картинку в специально отведённой области памяти, где left, top, right, bottom координаты картинки, а *bitmap указатель на область памяти.getlinesettings( &lineinfo); - Получает текущий тип линии, образец и толщину, где параметр &lineinfo объявлен как struct linesettingstype lineinfo.getmaxcolor(); - Возвращает значение типа integer, которое соответствует номеру цвета.getmaxmode(); - Возвращает значение типа integer, которое соответствует максимальному номеру графического режима, для текущего драйвера.getmaxx(); - Возвращает значение типа integer, которое соответствует максимальному количеству точек по оси x для текущего графического режима.getmaxy(); - Возвращает значение типа integer, которое соответствует максимальному количеству точек по оси y для текущего графического режима.getmodename( int mode_number); - Возвращает значение типа integer, которое соответствует указанному графическому режиму.getpalette( &palette); - Получает информацию о текущей палитре, где параметр &palette объявлен как struct palettetype palette.getpalettesize(); - Функция возвращает значение типа integer, соответствующее количеству цветов палитры для текущего графического режима.getpixel( int x, int y); - Функция возвращает номер цвета точки, находящейся по координатам ( x, y).gettextsettings( &textinfo); - Функция возвращает текущие настройки фонта для текущего графического режима, где параметр &textinfo определён как struct textsettingstype textinfo.getviewsettings( &viewinfo); - Получает информацию о текущей области просмотра, где параметр &viewinfo определяется как struct viewporttype viewinfo.getx(); - Функция типа integer возвращает текущую позицию указателя по оси x.gety(); - Функция типа integer возвращает текущую позицию указателя по оси y.grapherrormsg( int errorcode); - Возвращает код ошибки в виде переменной errorcode типа intger.imagesize( int left, int top, int right, int bottom); - Определяет размер области памяти, необходимый для сохранения двоичного образа.installuserfont( char far *name); - Функция типа intger возвращает номер идентификатора шрифта, который можно передать функции settextstyle для выбора данного шрифта. Параметр *name это путь к файлу шрифта. Одновременно данной функцией можно подключить до двадцати шрифтов.line( int x0, int y0, int x1, int y1); - Функция рисует линию от точки с координатами x0, y0 до точки с координатами x1, y1. Не обновляет текущую позицию.linerel( int dx, int dy); - Функция рисует линию от текущей позиции до точки, находящейся на относительном расстоянии от текущей позиции, затем передвигает текущую позицию.lineto( int x, int y); - Рисует линию от текущей позиции до точки с координатами ( x, y), затем переносит текущую позицию в ( x, y).moverel( int dx, int dy); - Перемещает текущую позицию на относительное растояние.moveto( int x, int y); - Перемещает текущую позицию в точку с координатами ( x, y).outtext( char far *textstring); - Выводит строку в графическом режиме. Строка должна заключатся в “”.outtextxy( int x, int y, char far *textstring); - Выводит строку в графическом режиме предварительно перейдя в точку с координатами ( x, y).pieslice( int x, int y, int stangle, int endangle, int radius); - Рисует и закрашивает замкнутый сектор круга.putimage( int left, int top, void far *bitmap, int op); - Выводит битовый образ на экран.putpixel( int x, int y, int color); - Рисует точку с координатами ( x, y) и цветом color.rectangle( int left, int top, int right, int bottom); - Рисует прямоугольник от точки с координатами (left, top) до точки с координатами ( right, bottom).Registerfarbgidriver (void far *driver); - Данная функция используется для регистрации удалённых графических драйверов.Registerfarbgifont (void far *font); - Данная функция используется для регистрации удалённых шрифтов.sector (int x, int y, int stangle, int endangle, int xradius, int yradius); - Функция рисует сектор круга установленным цветом, затем заполняет его используя образец и цвет, установленные функциями setfillstyle или setfillpattern.setactivepage( int page); - Устанавливает активную страницу для графического вывода.setallpalette( &palette); - Устанавливает полную палитру цветов для данного режима, где переменная &palette определена как struct palettetype palette.setaspectratio( int xasp, int yasp); - Заменяет заданный по умолчанию аспект сжатия графической системы.setbkcolor( int color); - Устанавливает цвет фона по его номеру заданному переменной color.setcolor( int color); - Устанавливает цвет по его номеру заданному переменной color.setfillpattern( char far *upattern, int color); - Выбирает определённый пользователем образец заливки.setfillstyle( int pattern, int color); - Функция устанавливает образец и цвет заливки.setgraphmode( int mode); - Устанавливает систему в графический режим, определённый параметром mode. Сбрасывает все настройки в положение “по умолчанию”. Очищает экран.setlinestyle( int linestyle, unsigned upattern, int thickness); - Устанавливает стиль рисуемых линий для функций рисования line, lineto, rectangle, drawpoly, etc.setpalette( int colornum, int color); - Устанавливает палитру от цвета colornum до цвета color.setrgbpalette( int colornum, int red, int green, int blue); - Данная функция может использоваться с IBM 8514 и VGA драйверами.settextjustify( int horiz, int vert); - Устанавливает выравнивание текста для графического режима. По умолчанию стоит выравнивание по верхнему левому углу.settextstyle( int font, int direction, int charsize); - Устанавливает характеристики текста: стиль, положение( горизонтальное или вертикальное), размер шрифта.setusercharsize( int multx, int divx, int multy, int divy); - Устанавливает определённый пользователем “коэффициент сжатия” шрифта. По умолчанию ширина шрифта определена как multx:divx, высота как multy:divy.setviewport( int left, int top, int right, int bottom, int clip); - Устанавливает новую область просмотра для графического вывода. Параметр clip определяет отсечены или нет все рисунки текущей области просмотра.setvisualpage( int page); - Устанавливает страницу с номером page визуальной графической страницей.setwritemode( int mode); - Устанавливает режим вывода объектов в графическом режиме. Параметр mode может принимать значения 0, которое соответствует режиму copy_put или 1, соответствующее режиму xor_put. Параметр copy_put использует ассемблерную команду MOV, рисуя поверх всех объектов новый объект. Параметр xor_put использует команду XOR (команду неэквивалентности), замещая предыдущий объект таким же новым. Используя дважды параметр xor_put, вы получите первоначальный результат.textheight( char far *textstring); - Функция возвращает высоту строки в количестве точек.textwidth( char far *textstring); - Функция возвращает ширину строки в количестве точек.1.2 Анализ констант, типов и глобальных переменных модуляarccoordstype - Используется функцией getarccoords для получения параметров текущей области просмотра.struct arccoordstype{ int x, y; /* center points of arc */ int xstart, ystart; /* start position */ int xend, yend; /* end position */}CGA_COLORS - Данная константа определяет цветовую схему, доступную для функция BGI, выполняющихся на CGA мониторах. Определена в модуле GRAPHICS.H. Используется функциями setallpalette, setbkcolor, setcolor, setpalette.COLORS - Данная символьная константа устанавливает атрибут цвета символов на EGA и CGA мониторах. Определена в модуле CONIO.H. Используется функциями (функции описаны в модуле CONIO.H) textattr, textbackground, textcolor.EGA_COLORS - Данная константа определяет цветовую схему, доступную для функция BGI, выполняющихся на EGA мониторах. Определена в модуле GRAPHICS.H. Используется функциями setallpalette, setbkcolor, setcolor, setpalette.fill_patterns - Образцы заливки применяемые функциями getfillsettings и setfillstyle( см. таблицу 1).Таблица 1.Название | Значение | Результат заполнения | |
EMPTY_FILL | 0 | Цвет фона | |
SOLID_FILL | 1 | Сплошная заливка | |
LINE_FILL | 2 | Заливка типа “---” | |
LTSLASH_FILL | 3 | Заливка типа “///” | |
SLASH_FILL | 4 | “///” толстые линии | |
BKSLASH_FILL | 5 | “\\\” толстые линии | |
LTBKSLASH_FILL | 6 | Заливка типа “\\\” | |
HATCH_FILL | 7 | Редкая штриховка | |
XHATCH_FILL | 8 | Сильная перекрестная | |
INTERLEAVE_FILL | 9 | “Чередование строк” | |
WIDE_DOT_FILL | 10 | Заливка точками(широк) | |
Таблица 1. продолжение. | |||
CLOSE_DOT_FILL | 11 | Заливка точками(узк) | |
USER_FILL | 12 | Определ. пользователем |
Название | Значение | Результат | |
DEFAULT_FONT | 0 | 8x8 растровый шрифт | |
TRIPLEX_FONT | 1 | Штриховой тройной шрифт | |
SMALL_FONT | 2 | Штриховой маленький шрифт | |
SANS_SERIF_FONT | 3 | Штриховой "гротесковый” шрифт | |
GOTHIC_FONT | 4 | Штриховой готический шрифт |
Константа | Значение | |
DETECT | 0 (авто определение) | |
CGA | 1 | |
Таблица 3. продолжение. | ||
MCGA | 2 | |
EGA | 3 | |
EGA64 | 4 | |
EGAMONO | 5 | |
IBM8514 | 6 | |
HERCMONO | 7 | |
ATT400 | 8 | |
VGA | 9 | |
PC3270 | 10 |
Код ошибки | Константа graphics_errors | Соответствующее сообщение об ошибке | |
0 | grOk | Нет ошибок | |
-1 | grNoInitGraph | (BGI) графика не установлена (использовать initgraph) | |
-2 | grNotDetected | Графические аппаратные средства не обнаружены | |
-3 | grFileNotFound | Файл драйвера не найден | |
Таблица 4. продолжение. | |||
-4 | grInvalidDriver | Недействительный файл драйвера | |
-5 | grNoLoadMem | Недостаточно памяти чтобы загрузить драйвер | |
-6 | grNoScanMem | Недостаточно памяти в просмотре заливки | |
-7 | grNoFloodMem | Недостаточно памяти для заливки | |
-8 | grFontNotFound | Файл шрифта не найден | |
-9 | grNoFontMem | Недостаточно памяти для загрузки шрифта | |
-10 | grInvalidMode | Недопустимый графический режим для выбранного драйвера | |
-11 | grError | Графическая ошибка | |
-12 | grIOerror | Графическая ошибка ввода/вывода | |
-13 | grInvalidFont | Недопустимый файл шрифта | |
Таблица 4. продолжение. | |||
-14 | grInvalidFontNum | Недопустимый номер шрифта | |
-15 | grInvalidDeviceNum | Недопустимый номер устройства | |
-18 | grInvalidVersion | Недопустимый номер версии |
Графический драйвер | Графические режимы (graphics_modes) | Значение | Разрешение | Палитра | Страницы | |
CGA | CGAC0CGAC1CGAC2CGAC3 CGAHI | 0123 4 | 320 x 200320 x 200320 x 200320 x 200 640 x 200 | C0C1C2C3 2color | 1111 1 | |
MCGA | MCGAC0MCGAC0MCGAC0MCGAC0MCGAMED MCGAHI | 01234 5 | 320 x 200320 x 200320 x 200320 x 200640 x 200 640 x 480 | C0C1C2C32color 2color | 11111 1 | |
EGA | EGALO EGAHI | 0 1 | 640 x 200 640 x 350 | 16color 16color | 4 2 | |
Таблица 5. продолжение. | ||||||
EGA64 | EGA64LO EGA64HI | 0 1 | 640 x 200 640 x 350 | 16color 4color | 1 1 | |
EGA-MONO | EGAMONOHI EGAMONOHI | 0 1 | 640 x 350 640 x 350 | 2color 2color | 1* 2** | |
HERC | HERCMONOHI | 0 | 720 x 348 | 2color | 2 | |
ATT400 | ATT400C0ATT400C1ATT400C2ATT400C3ATT400MED ATT400HI | 01234 5 | 320 x 200320 x 200320 x 200320 x 200640 x 200 640 x 400 | C0C1C2C32color 2color | 11111 1 | |
VGA | VGALOVGAMED VGAHI | 01 2 | 640 x 200640 x 350 640 x 480 | 16color16color 16color | 22 1 | |
PC3270 | PC3270HI | 0 | 720 x 350 | 2color | 1 | |
IBM8514 | IBM8514HI IBM8514LO | 1 0 | 1024x 760 640 x 480 | 256color 256color |
Константа | Значение | Результат | |
SOLID_LINE | 0 | Сплошная линия | |
DOTTED_LINE | 1 | Пунктир | |
CENTER_LINE | 2 | Центрированная линия | |
DASHED_LINE | 3 | Пунктирная линия | |
USERBIT_LINE | 4 | Определяется пользователем |
Константа | Значение | Результат | |
NORM_WIDTH | 1 | Ширина в 1-н пиксель | |
THICK_WIDTH | 3 | Ширина в 3-и пикселя |
Элемент | Описание | |
upattern | Установленный пользователем битовый образец используется когда стиль линии стоит как USERBIT_LINE. | |
Таблица 8. продолжение. | ||
linestyle | Определяет в каком виде будут выводится следующие линии( сплошной, пунктирный, центрированный). | |
thickness | Определяет будет ли толщина следующих линий обычной или толстой. |
16-и битный образец | upattern | |
| ..xx..xx..xx..xx....xxxx....xxxx..xxxxxx..xxxxxx xxxxxxxxxxxxxxxx | 0x3333(штрих пунктир)0x0F0F(длинный штрих пунктир)0x3F3F(более длинный штрих пунктир) 0xFFFF(сплошная линия) |
Элемент | Описание | |
Size | Даёт номер цветов в палитре для текущего графического драйвера в текущем режиме. | |
colors | Массив байтов, содержащий необработанный номер цвета для каждого входа в палитру. Если элемент цветов -1, то палитра для данного входа не определена. |
Константа | Значение | Описание | |
COPY_PUT | 0 | Битовый рисунок источника копируется на экран. | |
XOR_PUT | 1 | Исключающее ИЛИ. Отображает на экране исходное изображение. | |
OR_PUT | 2 | ИЛИ. Отображает на экране текущее изображение, не убирая предыдущего выведенного этого же изображения. | |
Таблица 11. продолжение. | |||
AND_PUT | 3 | Выводит на экран картинку поверх остальных объектов. | |
NOT_PUT | 4 | Копирует и вставляет инверсированный источник. |
text_just - Параметр горизонтального и вертикального выравнивания для функции settextjustify().
Таблица 12. Значения параметра text_just.
Аргумент | Константа | Значение | Результат | |
Horiz | LEFT_TEXT CENTER_TEXT RIGHT_TEXT | 0 1 2 | По левому краю По центру По правому краю | |
Vert | BOTTOM_TEXT CENTER_TEXT TOP_TEXT | 0 1 2 | По низу По центру По верху |
text directions - Настройки текста. Содержит два параметра HORIZ_DIR и VERT_DIR.
textsettingstype - Используется для получения текущих настроек текста функцией gettextsettings().
struct textsettingstype
{
int font;
int direction;
int charsize;
int horiz;
int vert;
}
USER_CHAR_SIZE - Определённый пользователем размер символа. В таблице 13 указаны значения данного параметра, а так же размеры шрифтов, соответствующие заданному параметру.
Таблица 13.
Значение | Размер дисплея 8x8 растровых шрифтов | |
1 | Символы дисплея в 8x8 экранных блоков | |
2 | Символы дисплея в 16x16 экранных блоков | |
... | ... | |
10 | Символы дисплея в 80x80 экранных блоков |
Используется функциями gettextsettings(), settextstyle(), setusercharsize() и параметром textsettingstype.
VERT_DIR - Данный параметр устанавливает направление графического вывода шрифта (Имя параметра: VERT_DIR; Значение: 1; Направление: Снизу в верх, поворачивает выводимый текст на 90 градусов против часовой стрелки). Данный параметр используется функциями gettextsettings(), settextstyle(), setusercharsize().
viewporttype - Используется для получения настроек области вывода функцией getviewsettings().
struct viewporttype
{
int left;
int top;
int right;
int bottom;
int clip;
}
2. Реализация пользовательской библиотеки “mouse.h”В стандартной комплектации BorlandC2.0, BorlandC3.1 или любой версии компилятора C++ от любой другой корпорации, будь то MicroSoft, AT&T и т.д. нет ни одного модуля работы с мышью как-то в обычном или графическом режиме. Я имею в виду приложения под ОС MS-DOS. Конечно, написание такого модуля сводится не только к знаниям языка C++, но и так называемого языка низкоуровневого программирования Assembler'а.Итак, приступим. Для начала мы должны определить основные функции, типы и константы.Таблица 1. Константы.Константа | Значение | Описание | |
MB_NONE | 0 | Кнопки мыши не нажаты | |
MB_LEFT | 1 | Нажата левая кнопка мыши | |
MB_RIGHT | 2 | Нажата правая кнопка мыши | |
MB_LAR | 3 | Нажаты обе кнопки мыши | |
MB_MIDDLE | 4 | Нажата средняя кнопка мыши |
