48247 (Программирование в СИ), страница 2

2016-07-28СтудИзба

Описание файла

Документ из архива "Программирование в СИ", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48247"

Текст 2 страницы из документа "48247"

Главным недостатком автоматической загрузки драйвера при помощи функции initgraph является то, что она обращается к диску для чтения BGI-файла во время выполнения программы. Альтернативой автоматической загрузке графического драйвера является его статическое включение на этапе построения программы. Предварительно бинарный файл драйвера .bgi должен быть превращен в обычный объектный файл типа .obj специальной утилитой bgiobj.exe. Кстати, данная утилита используется также для конвертирования chr-файлов с графическими шрифтами в объектные модули. Полученные объектные модули подключаются на этапе компоновки.

В программе, прежде чем инициализировать графическую систему, необходимо нужные драйверы зарегистрировать, т. е. сообщить графической системе, что данный драйвер уже находится в оперативной памяти. Для этого существует функция registerbgidriver, которой нужно сообщить местоположение драйвера:

int registerbgidriver(void (*driver)(void));

Аргумент функции – имя указателя на место в памяти, содержащее регистрируемый драйвер. Имена подобных указателей уже определены в объектных файлах, созданных при помощи утилиты bgiobj.exe. Ниже приведены прототипы функций, имена которых нужно употреблять для стандартных драйверов:

void CGA_driver(void);

void EGAVGA_driver(void);

void IBM8514_driver(void);

void Herc_driver(void);

void ATT_driver(void);

void PC3270_driver(void).

Если регистрация прошла успешно, функция graphresult возвратит нулевое значение, в противном случае -4. После регистрации драйвера можно инициализировать графическую систему при помощи функции initfgraph, при этом ее третий параметр не используется (передается нулевая строка “”).

Пример статической загрузки драйвера и инициализации системы:

int main(void)

{

int gd,gm,err;

detectgraph(&gd,&gm);

err=graphresult();

if(err)

{

printf(“\n%s”,grapherrormsg(err));

return 1;

}

registerbgidriver(EGAVGA_driver);

err=graphresult(); /* получение кода завершения */

if(err)

{

printf(“\n%s”,grapherrormsg(err));

return 1;

}

initgraph(&gd,&gm,""); /* инициализация системы */

if((err = graphresult()) != grOk)

{

printf(“\n%s”,grapherrormsg(err));

return 1;

}

/* ................различные операторы..............*/

closegraph(); /* завершение работы системы */

return 0;

}

Если графическая система активизирована и необходимо по ходу выполнения программы переключиться на использование другого графического драйвера, то до повторного вызова функции initgraph необходимо сбросить графическую систему функцией closegraph для освобождения всей памяти, которую занимала система.

Имя текущего графического драйвера можно узнать с помощью функции

char far *getdrivername(void);

Она возвращает указатель на строку, содержащую имя активного в данный момент драйвера.

Максимальное значение номера графического режима, допустимое для текущего графического драйвера, можно узнать с помощью функции

int far getmaxmode(void);

Текущее значение номера графического режима для активизированного драйвера возвращает функция

int far getgraphmode(void);

По номеру режима можно получить строку с описанием данного режима для текущего драйвера. Это делается с помощью функции

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 передает желаемый номер режима для текущего драйвера и не должен превосходить максимально допустимое для этого драйвера значение.

Для временного перехода в текстовый режим предусмотрена
функция

void far restorecrtmode(void);

Эта функция переводит видеоадаптер в тот текстовый режим, в котором он находился в момент последней инициализации графической системы, т. е. непосредственно перед обращением к функции initgraph. Из текстового режима можно вернуться в графический при помощи функции setgraphmode.

При инициализации графической системы всевозможные параметры системы устанавливаются по умолчанию. Различные функции могут менять значения параметров. Для того чтобы в любой момент восстановить характеристики системы, установленные при ее инициализации, существует функция

void far graphdefaults(void);

Перечислим действия, выполняемые данной функцией:

  • для вывода и отображения на экране выбирается нулевая страница видеопамяти;

  • графическое окно устанавливается размером во всю страницу;

  • текущая графическая позиция перемещается в точку (0,0);

  • устанавливаются по умолчанию цвета палитры, текущий рисующий цвет (15) и цвет фона (0);

  • устанавливается сплошной шаблон для рисования линий и заполнения областей;

  • инициализируется встроенный матричный шрифт со стандартным расположением и позиционированием строки.

    1. Работа с растром точек

Растром точек называется двумерная совокупность точек, представляющая экран дисплея.

Чтобы в прикладной программе иметь возможность отобразить на экране любую из имеющихся страниц видеопамяти, в графической библиотеке предусмотрена функция

void far setvisualpage(int page);

Функция немедленно отображает на экране ту страницу видеопамяти, номер которой был ей передан в качестве аргумента. Страницы нумеруются с нуля. Функция graphresult не реагирует на попытку установить недопустимый номер страницы. Вся ответственность за правильность указанного номера лежит на программисте. Функция

void far setactivepage(int page);

не вызывает перерисовки страницы на экране дисплея, но зато направляет весь последующий графический вывод на ту страницу, которая указана ее аргументом. Как и при вызове предыдущей функции, ответственность за допустимость номера страницы остается на программисте.

Страницу видеопамяти (и экран дисплея) можно представить как двумерный прямоугольный массив точек (пикселей). На этом массиве точек вводится система координат X, Y. Начало системы лежит в левом верхнем углу страницы (экрана). Ось X проходит по верхнему краю страницы слева направо, а ось Y – по левому краю сверху вниз. Левая верхняя точка страницы имеет координаты (0, 0), правая нижняя – координаты (M-1, N-1), где M и N – размеры страниц по горизонтали и вертикали.

Определить максимальные значения координат точек можно с помощью функций

int far getmaxx(void);

int far getmaxy(void);

Значения, возвращаемые этими функциями, зависят только от текущего режима, установленного функциями 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:

struct viewporttype

{

int left,top,right,bottom;

int clip;

}

Возвращаемые координаты представлены в системе координат стра­ницы.

С графическим окном связано понятие текущей графической позиции CP (current graphics position). Это графический эквивалент курсора в текстовом режиме. Текущая графическая позиция сама собой никак не отображается на экране и идентифицирует выбранный пиксель графического окна, к которому привязывается действие некоторых функций, таких как вычерчивание прямолинейных отрезков или вывод графических текстов.

При установке нового графического окна текущая позиция автоматически помещается в его начало координат. Для явного изменения положения текущей позиции используются функции

void far moveto(int x, int y);

void far moverel(int dx, int dy);

Первая помещает CP по указанным координатам графического окна. Вторая перемещает CP на вектор (dx, dy).

Координаты текущей графической позиции в системе координат графического окна возвращают функции:

int far getx(void);

int far gety(void);

При переустановке графического окна функцией setviewport содержимое страницы видеопамяти не изменяется. Для очистки графического окна на активной в данный момент странице используется функция

void far clearviewport(void);

CP при этом перемещается в начало координат графического окна.

Похожая функция

void far cleardevice(void);

очищает всю активную страницу. Установка графического окна при этом не изменяется, а 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)).

Заметим, что коэффициент “неквадратности” автоматически учитывается только функциями, которые рисуют окружности и их дуги, но никак не влияет на функции рисования эллипсов и их дуг.

    1. Управление цветом

Цветовые возможности функций графической библиотеки Borland C описываются в терминах цветовой палитры режима – закона, по которому каждому допустимому значению атрибута пикселя ставится в соответствие цвет, которым этот пиксель будет отображаться на экране.

Палитру режима можно представить как таблицу, содержащую столько строк (входов), сколько значений допускается для атрибута пикселя в данном графическом режиме. Строки палитры режима нумеруются от нуля до N_palette-1. В строке с номером k содержится код цвета, которым аппаратура видеоадаптера отображает на экране все пиксели страницы, атрибуты которых равны k. Нулевой вход палитры режима, кроме того, определяет цвет фона экрана.

Все графические режимы можно разделить на три группы:

  • монохромные режимы, в которых все пиксели могут быть двух цветов – основного и фонового. Палитру таких режимов изменить невозможно;

  • цветные режимы с фиксированной палитрой. Для изменения палитры режима нужно менять графический режим, что приводит к потере содержимого видеопамяти;

  • графические режимы, позволяющие динамически (без потери содержимого видеопамяти) изменять код цвета по любому входу палитры режима. К данным режимам относятся режимы драйверов EGA, VGA, IBM8514.

Механизм управления цветом в Borland C включает в себя важный элемент – структуру данных, называемую внутренней палитрой. При работе в графических режимах на всех дисплейных адаптерах, кроме VGA и IBM8514, она содержит коды цветов из таблицы цветов адаптера. Роль внутренней палитры при работе с адаптером VGA несколько иная и будет рассмотрена ниже. Драйвер IMB8514 вообще не пользуется внутренней палитрой, поэтому в дальнейшем все, что будет говориться о работе с внутренней палитрой, не относится к этому драйверу. Не следует путать внутреннюю палитру (обычную переменную структурного типа) графической системы с палитрой режима с законом преобразования значения пикселя в цвет.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5209
Авторов
на СтудИзбе
430
Средний доход
с одного платного файла
Обучение Подробнее