Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КГ лабы.doc
Скачиваний:
15
Добавлен:
10.05.2015
Размер:
455.68 Кб
Скачать

Федеральное агентство по образованию

Тульский государственный университет

Кафедра автоматики и телемеханики

Копылов Андрей Валерьевич

Компьютерная графика

Методические указания по выполнению лабораторных работ

Тула 2006

ЛАБОРАТОРНАЯ РАБОТА №1

Графические средства Borland

Цель работы:изучить основные функции работы с графикой и мышью в среде программирования Borland.

Задание:создать приложение, позволяющее рисовать и перемещать некоторый графический объект при помощи мыши и клавиатуры.

Теоретическая справка

Инициализация и завершение работы с графической библиотекой.

Для инициализации библиотеки служит функция:

void far initgraph(int far *driver, int far *mode, char far *path);

Первый параметр задает библиотеке тип адаптера, с которым будет вестись работа. В соответствии с этим параметром будет загружен драйвер указанного видеоадаптера и произведена инициализация всей библиотеки. Определен ряд констант, задающих набор стандартных драйверов: CGA, EGA, VGA. DETECT и другие.

Значение DETECT сообщает библиотеке о том, что тип имеющегося видеоадаптера надо определить ей самой и выбрать для него режим наибольшего разрешения.

Второй параметр - mode - определяет режим.

Параметр

Режим

CGACO, CGAC1, CGAC2, CGAC3 CGAHl

EGALO

EGAH1

VGALO

VGAMED

VGAHI

320 на 200 точек на 4 цвета

640 на 200 точек на 2 цвета

640 на 200 точек на 16 цветов

640 на 350 точек на 16 цветов

640 на 200 точек на 16 цветов

640 на 350 точек на 16 цветов

Если в качестве первого параметра было взято значение DETECT, то параметр mode не используется.

В качестве третьего параметра выступает имя каталога, где находится драйвер адаптера - файл типа BGI (Borland's Graphics Interface), например:

  • CGA.BGI - драйвер адаптера CGA;

  • EGAVGA.BGI- драйвер адаптеров EGA и VGA;

  • HERC.BGI - драйвер адаптера Hercules.

Функция graphresult возвращает код завершения предыдущей графической операции

int far graphresult (void);

Успешному выполнению соответствует значение grOk.

Для окончания работы с библиотекой необходимою вызвать функцию closegraph:

void far closegraph(void);

// File example1.cpp

#include <conio h>

#include <graphics h>

#include <process h>

#induce <stdio h>

main()

{

int mode;

int res;

int driver = DETECT;

initgraph(&driver, &mode, “”);

if( (res = graphresult()) != grOk )

{

pnntf( “\n Graphics error %s\n “, grapherrormsg(res));

exit(1);

}

line(0, 0, 0, getmaxy());

line(0, getnmaxy(), getmaxx(), getmaxy());

line(getmaxx(), getmaxy(), getmaxx(), 0);

line(getmaxx(), 0, 0, 0);

getch();

closegraph();

}

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

Узнать максимальные значения X и Y координат пиксела можно, используя функции getmaxx и getmaxy:

int far getmaxx(void);

int far getmaxy(void);

Узнать, какой именно режим в действительности установлен, можно при помощи функции getgraphmode:

int far getgraphmode(void);

Для очистки экрана удобно использовать функцию clearviewport:

void far clearviewport(void);

Работа с отдельными точками

Функция putpixel ставит пиксел заданного цвета Color в точке с координатами (х, у):

void far putpixel(int x, int у, int Color);

Функция getpixel возвращает цвет пиксела с координатами (х, у):

unsigned far getpixel(int x, int у);

Рисование линейных объектов

При рисовании линейных объектов основным инструментом является перо, которым эти объекты рисуются. Перо имеет следующие характеристики:

  • цвет (по умолчанию белый);

  • толщина (по умолчанию 1);

  • шаблон (по умолчанию сплошной).

Шаблон служит для рисования пунктирных и штрих пунктирных линий. Для установки параметров пера используются следующие функции выбора.

Процедура setcolor устанавливает цвет пера:

void far setcolor(int Color);

Функция setlinestyle определяет остальные параметры пера:

void far setlinestyle(int Style, unsigned Pattern, int Thickness);

Первый параметр задает шаблон линии. Обычно в качестве этого параметра выступает один из предопределенных шаблонов: SOLID_LINE, DOTTED_LINE, CENTER_LINE, DASHED_LINE, USERBIT_LINE и другие. Значение USERBIT_LINE означает, что шаблон задается (пользователем) вторым параметром. Шаблон определяется 8 битами, где значение бита 1 означает, что в соответствующем месте будет поставлена точка, а значение 0 - что точка ставиться не будет.

Третий параметр задает толщину линии в пикселах. Возможные значения параметра - NORM_WIDTH и THICK_WIDTH (1 и 3).

При помощи пера можно рисовать ряд линейных объектов - прямолинейные отрезки, дуги окружностей и эллипсов, ломаные.

Рисование прямолинейных отрезков

Функция line рисует отрезок, соединяющий точки (х1, у1) и (x2, y2):

void far line(int x1, int y1, int x2, int y2);

Рисование окружностей

Функция circle рисует окружность радиуса г с центром в точке (х, у):

void far circle(int х, int у, int r);

Рисование дуг эллипса

Функции arc и ellipse рисуют дуги окружности (с центром в точке (х, у) и радиусом r и эллипса (с центром (х, у), полуосями rx и rу, параллельными координатным осям), начиная с углаa StartAngle и заканчивая углом EndAngle.

Углы задаются в градусах в направлении против часовой стрелки:

void far arc(int x, int у, int StartAngle, int EndAngle, int r);

void far ellipse(int x, int y, int StartAngle, int EndAngle, int rx, int ry);

Рисование сплошных объектов.

С понятием закрашивания тесно связано понятие кисти. Кисть определяется цветом и шаблоном - матрицей 8 на 8 точек (бит), где бит, равный 1, означает, что нужно ставить точку цвета кисти, а 0 - что нужно ставить черную точку (цвета 0).

Для задания кисти используются следующие функции:

void far setfillstyle(int Pattern, int Color);

void far setfillpattern(char far * Pattern, int Color);

Функция setfillstyle служит для задания кисти. Параметр Style определяет шаблон кисти либо как один из стандартных (EMPTY_FILL, SOLID_FILL, LINE_FILL, LTSLASH_FILL), либо как шаблон, задаваемый пользователем (USER_FILL). Пользовательский шаблон устанавливает процедура setfillpattem, первый параметр в которой и задает1 шаблон - матрицу 8 на 8 бит, собранных по горизонтали в байты. По умолчанию используется сплошная кисть (SOLID_FILL) белого цвета.

Процедура bar закрашивает выбранной кистью прямоугольник с левым верхним углом (x1, y1) и правым нижним углом (х2, y2):

void far bar( int x1, int y1, int x2, int y2);

Функция fillellipse закрашивает сектор эллипса:

void far fillellipse(int x, int у, int BegAngle, int EndAngle, int rx, int ry);

Функция floodflll служит для закраски связной области, ограниченной линией цвета BorderColor и содержащей точку (х, у) внутри себя:

void far floodfill(int x, int у, int BorderColor);

Функция fillpoly осуществляет закраску многоугольника, заданного массивом значений х и у координат:

void far fillpoly(int numpoints, int far *points);

Работа с изображениями

Библиотека поддерживает также возможность запоминания прямоугольного фрагмента изображения в обычной (оперативной) памяти и выводе его на экран. Это может использоваться для запоминания изображения в файл, создания мультипликации и т. п.

Объем памяти, требуемый для запоминания фрагмента изображения, в байтах можно получить при помощи функции imagesize:

unsigned far imagesize(int x1, int y1, int x2, int y2);

Для запоминания изображения служит процедура getimage:

void far getimage(int x1, int y1, int x2, int y2, void far *Image);

При этом прямоугольный фрагмент, определяемый точками (x1,y1)и(х2,y2), записывается в область памяти, задаваемую последним параметром - Image.

Для вывода изображения служит процедура putimage:

void far putimage(int x, int y, void far *Image, int op);

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

  • COPY_PUT - происходит простой вывод (замещение);

  • NOT_PUT - происходит вывод инверсного изображения;

  • OR_PUT - побитовая операция ИЛИ;

  • XOR_PUT - побитовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ;

  • AND_PUT - побитовая операция И.

// get/put image example

unsigned ImageSize = imagesize(x1, y1, x2, y2);

void *Image = malloc(ImageSize);

. . .

if(Image = NULL)

getimage(x1, y1, x2, y2, Image);

. . .

if(Image != HULL)

{

putimage(х, у, Image, COPY_PUT);

free(Image);

}

В этой программе происходит динамическое выделение под заданный фрагмент изображения на экране требуемого объема памяти. Этот фрагмент запоминается в отведенную память. Далее сохраненное изображение выводится на новое место (в левый верхний угол - (х, у)), и отведенная под изображение память освобождается.

Работа со шрифтами

Под шрифтом обычно понимается набор изображений символов. Шрифты могут различаться по организации (растровые и векторные), но размеру, по направлению вывода и по ряду других параметров. Шрифт может быть фиксированным (размеры всех символов совпадают) или пропорциональным (высота совпадает, но может быть разная ширина).

Для выбора шрифта и его параметров служит функция settextstyle:

int far settextstyle(int Font, int Direction, int Size);

Здесь параметр Font задает идентификатор одного из шрифтов, например:

  • DEFAULT_FONT - стандартный растровый шрифт размером 8 на 8 точек, находящийся в ПЗУ видеоадаптера,

  • TRIPLEX_FONT, GOTHIC_FONT, SANS_SERIF_FONT, SMALL_ FONT - стандартные пропорциональные векторные шрифты, входящие в комплект Boiland C++ (шрифты хранятся в файлах типа CHR и по этой команде подгружаются в оперативную память, файлы должны находиться в том же каталоге, что и драйверы устройств).

Параметр Direction задает направление вывода:

  • HORIZ_DIR - вывод по горизонтали,

  • VERT_DIR - вывод по вертикали.

Параметр Size задает, во сколько раз нужно увеличить шрифт перед выводом на экран. Допустимые значения 1,2,… ,10.

При желании можно использовать любые шрифты в формате CHR Для этого надо сначала загрузить шрифт при помощи функции int far installuserfont ( char far * FontFileHame ) а затем возвращенное функцией значение передать settextstyle в качестве идентификатора шрифта

int MyFont = installuserfont(“MYFONT.CHP”);

settextstyle (MyFont, HORIZ_DIR, 5);

Для вывода текста служит функция outtextxy:

void far outtextxy( int x, int у, char far *text);

При этом строка text выводится так, что точка (х, у) оказывается вершиной левого верхнего угла первого символа.

Для определения размера, который займет на экране строка текста при выводе текущим шрифтом, используются функции, возвращающие ширину и высоту в пикселах строки текста:

int far textwidth(char far *text);

int far textheight(char far *text);

Понятие режима (способа) вывода.

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

void far setwritemode(int Mode);

Параметр Mode задает способ наложения и может принимать одно из следующих значений:

  • COPY_PUT- происходит простой вывод (замещение),

  • XOR_PUT - побитовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ.

Режим XOR_PUT удобен тем, что повторный вывод одного и того же изображения на то же место уничтожает результат первого вывода, восстанавливая изображение, которое было на экране до этого.

Замечание.Не все функции графической библиотеки поддерживают использование режимов вывода, например, функции закраски игнорируют установленный режим наложения (вывода) Кроме того, некоторые функции могут не совсем корректно работать в режиме XOR_PUT.

Понятие окна (порта вывода)

При желании пользователь может создать на экране окно – своего рода маленький экран со своей локальной системой координат Для этого служит функция serviewport:

int far setviewport(int x1, int y1, int x2, int y2, int Clip);

Эта функция устанавливает окно с глобальными координатами (x1,y1)-(x2, y2). При этом локальная система координат вводится так, чтo точке с координатами (0, 0) соответствует точка с глобальными координатами (x1, y1). Это означает, что локальные координаты отличаются от глобальных координат лишь сдвигом на (x1, y1), причем все процедуры рисования (кроме SetViewPort) работают всегда с локальными координатами Параметр Clip определяет, нужно ли проводить усечение изображения, не помещающегося внутрь окна, или нет.

Замечание.Отсечение ряда объектов проводится не совсем корректно, так, функция outtextху производит отсечение не на уровне пикселов, а по символам.

Понятие палитры.

Адаптер EGA и все совместимые с ним адаптеры предоставляют дополнительные возможности по управлению цветом. Наиболее распространенной схемой представления цветов для видеоустройств является так называемое RGB-представление, в котором любой цвет представляется как сумма трех основных цветов - красного (Red), зеленого (Green) и синего (Blue) с заданными интенсивностями. Все возможное пространство цветов представляет из себя единичный куб, и каждый цвет определяется тройкой чисел (г, g, b). Например желтый цвет задается как (1, 1, 0), а малиновый - как (1, 0, 1). Белому цвету соответствует набор (1, 1, 1), а черному - (0, 0, 1).

Обычно под хранение каждой из компонент цвета отводится фиксированное количество бит памяти. Поэтому считается, что допустимый диапазон значений для компонент цвета не [0, 1], a [0,2n-1].

Практически любой видеоадаптер способен отобразить значительно большее количество цветов, чем определяется количеством бит, отводимых в видеопамяти под один пиксел. Для использования этой возможности вводится понятие палитры.

Палитра - это массив, в котором каждому возможному значению пиксела сопоставляется значение цвета (г, g, b), выводимое на экран. Размер палитры и ее организация зависят от типа используемого видеоадаптера.

Наиболее простой является организация палитры на EGA адаптере. Под каждый из 16 возможных логических цветов (значений пиксела) отводится 6 бит, по 2 бита на каждую цветовую компоненту! При этом цвет в палитре задается байтом следующего вида: 00rgbRGB, где г, g, b, R, G, В могут принимать значение 0 или 1. Используя функцию setpalette:

void far setpalette(int Color, int ColorValue);

можно для любого из 16 логических цветов задать любой из 64 возможных физических цветов.

Функция getpalette:

void far getpalette(struct palettetype far *palette);

служит для получения текущей палитры, которая возвращается в виде следующей структуры:

struct palettetype

{

unsigned char size;

signed char colors[MAXCOLORS+1];

}

Следующая программа демонстрирует использование палитры для получения четырех оттенков красного цвета.

// File example2.cpp

#include <conio.h>

#include <graphics.h>

#include <process h>

#include <stdio.h>

// show 4 shades of red

main ()

{

int driver = DETECT;

int mode;

int res;

int i;

initgraph(&driver, &mode, "");

if( (res = graphresult()) != grOk )

{

printf("\nGraphics error. %s\n”, grapherrormsg ( res) );

exit(1);

}

setpalette(0, 0 );

setpalette(1, 32 );

setpalette(2, 4 );

setpalette(3, 36 );

bar(0, 0, getmaxx(), getmaxy());

for(i = 0; i < 4; i++)

{

setfillstyle ( SOLID_FILL, i );

bar(120 + i*100, 75, 219 + i*100, 274);

}

getch ();

closegraph ();

}

Реализация палитры для 16-цветных режимов адаптера VGA намного сложнее. Помимо поддержки палитры адаптера EGA, видео адаптер дополнительно содержит 256 специальных DАС-регистров, где для каждого цвета хранится его 18-битов представление (по 6 бит на каждую компоненту). При этом исходному логическому номеру цвета с использованием 6-битовых регистров палитры EGA сопоставляется, как и раньше, значение от 0 до 63, но оно уже является не RGB-разложением цвета, а номером DAC-регистра, содержащего физический цвет.

Для установки значений DAC-регистров служит функция setrgbpalette:

void far setrgbpalette ( int Color, int Red, int Green, int Blue ).

Работа с мышью

Приведем несколько очень простых, но полезных функций для работы с мышью. Хотя на рынке предлагается довольно много разнообразных типов мышей, наиболее популярными являются Microsoft (IBM), Logitech и Genius Mouse. Все они поставляются вместе с драйверами в форме СОМ- или SYS-файлов, и управление ими на уровне прикладного программного обеспечения стандартно.

Для работы с мышью в MS DOS используется прерывание ЗЗН, позволяющее выполнять ряд функций. Код требуемой функции передается в регистре АХ. Ниже приводятся коды для вызова наиболее важных функций работы с мышью.

  • АХ = 0. Опрос конфигурации. Возвращаются: в регистре АХ признак установки мыши (-1 - мышь установлена, любое другое число - мышь не подключена) и в регистре ВХ число кнопок мыши (2 или 3).

  • АХ = 1. Визуализация на экране курсора мыши.

  • АХ = 2. Подавление на экране курсора мыши.

  • АХ = 3. Опрос состояния мыши.

В регистрах СХ и DX возвращаются текущие координаты курсора мыши (х и у соответственно) , младшие биты регистра ВХ показывают состояние кнопок мыши: установка бита в 1 означает, что соответствующая кнопка нажата. Обычно бит 0 показывает состояние левой кнопки, бит 1 - правой, бит 2 - средней, если таковая присутствует.

  • АХ = 4. Устанавливает курсор мыши в указанную точку экрана.

Координаты х и у передаются драйверу через регистры CX и DX.

  • АХ = 7 и АХ = 8.

Установка размеров области экрана, по которой может перемещаться мышь: регистры СХ и DX устанавливают минимальную и максимальную координаты соответственно; функция с кодом 7 определяет горизонтальные границы области (х-координату), функция с кодом 8 – вертикальные (у -координату).

Часто в программе бывает желательно обеспечить возможность параллельного управления курсором с помощью клавиатуры и мыши. При этом кнопки мыши обычно соответствуют следующим клавишам клавиатуры:

  • левая кнопка - Enter (ВВОД),

  • правая кнопка - Escape,

  • средняя кнопка - Space (ПРОБЕЛ).

Мы приводим текст функции, обеспечивающих подобную работу. Основная программа должна в цикле вызывать функцию mouse_key_status. Эта функция реагирует на все клавиши расширенной клавиатуры (в том числе и "диагональные") и на перемещения мыши, изменяя текущие координаты курсора, хранящиеся в вызывающей программе, и одновременно передавая их драйверу мыши. Возврат из функции происходит тогда, когда будет нажата какая-нибудь кнопка на мыши или любая из клавиш клавиатуры. Если функция завершилась по нажатию кнопки мыши, то через аргумент *status в программу возвращается состояние кнопок мыши (см. выше описание функции с кодом 3 драйвера мыши). Тот же эффект получается при нажатии одной из клавиш Enter, Escape или Space клавиатуры ("симуляция мыши"). При нажатии любой другой клавиши в переменной *status возвращается расширенный ASCII-код соответствующей клавиши.

Перед вызовом функции mouse_key_status в основной программе следует с помощью функции mouse_status проверить наличие на ПК мыши и ее драйвера, затем установить размеры окна экрана, по которому допускается перемещение курсора мыши (функция mouse_screen_size), и относительную скорость курсора (функция mouse_speed). Функция mouse_show позволяет делать курсор мыши невидимым на экране и снова его визуализировать.

/* Mouse services */

#include <dos.h>

#include<bios.h>

#define ON 1

#define OFF 2

/*-----------------------------------------------------*/

int __dec__ = 10;

int X_MIN, X_MAX;

int Y_MIN, Y_MAX;

int MOUSE READY = 0;

/*-----------------------------------------------------*/

/*

Функция возвращает количество кнопок у мыши и устанавливает ее

статус: готова к работе или нет.

*/

int mouse_status(void)

{

/* Функция возвращает количество кнопок у мыши и устанавливает ее

статус: готова к работе или нет. */

union REGS inr,outr;

inr.x.ax = 0;

int86(0x33,&inr,&outr);

if((signed int)outr.x.ax == -1)

MOUSE_READY = 1;

else

MOUSE_READY = 0;

return(outr.x.bx);

}

/*-----------------------------------------------------*/

int mouse_show(int show)

{

/* Функция показывает или прячет курсор мыши на экране. */

union REGS inr, outr;

switch(show)

{

case ON:

case OFF:

inr.x.ax = show;

int86(0x33,&inr,&outr);

return 0;

default:

return -1;

}

}

/*-----------------------------------------------------*/

void mouse_screen_size(int x_min, int y_min, int x_max, int y_max)

{

/* Функция устанавливает размеры окна на экране, по которому может перемещаться курсор мыши. */

union REGS inr, outr;

inr.x.ax = 7;

inr.x.cx = x_min;

inr.x.dx = x_max;

int86(0x33, &mr, &outr);

X_MIN = min(x_min,x_max);

X_MAX = max(x_min,x_max);

inr.x.ax = 8;

inr.x.cx = y_min;

inr.x.dx = y_max;

int86(0x33, &inr, &outr);

Y_MIN = min(y_min,y_max);

Y_MAX = max(y_min,y_max);

}

/*-----------------------------------------------------*/

void position_status(int *Status, int *Xcoord,int *Ycoord)

{

/* Функция записывает координаты курсора мыши и состояние кнопок

(Т-нажата, 0 - не нажата)!

0-й бит - левая кнопка;

1-й бит - правая кнопка;

2-й бит - средняя кнопка.*/

union REGS inr, outr;

inr.x.ax =3;

int86(0x33, &inr, &outr);

*Xcoord = outr.x.cx;

*Ycoord = outr.x.dx;

*Status = outr.x.bx;

}

/*-----------------------------------------------------*/

void set_position(int x, int y)

{

/* Функция устанавливает курсор мыши в указанную точку экрана. */

union REGS inr, outr;

inr.x.ax = 4;

inr.x.cx = x;

inr.x.dx = y;

int86(0x33, &inr, &outr);

}

/*-----------------------------------------------------*/

void mouse_speed(int horizontal, int vertical)

{

/* Функция устанавливает относительную скорость перемещения

курсора мыши по экрану (количество шагов ее перемещения по столу,

необходимых дли сдвига курсора на 8 пикселей).

Стандартная установка: 8 шагов по горизонтали, 16 по вертикали. */

union REGS inr, outr;

inr.x.ax = 15;

inr.x.cx = horizontal;

inr.x.dx = vertical;

int86(0x33, &inr, &outr);

}

/*-----------------------------------------------------*/

void get_key(int *status, int *x, int *y)

{

/* Функция симулирует перемещение мыши, если была нажата

клавиша расширенной клавиатуры, и записывает новые координаты курсора.

Функция симулирует статус нажатия кнопок мыши при нажатии клавиш:

<ENTER> - 0-й бит;

<ESCape> - 1-й бит;

<SРАСЕВАР> - 2-йбит.

Приажатии других клавиш в *status записывается их расширенный код. */

int buf;

buf = bioskey(0);

if( (buf & 0x0ff)== 0)

switch ((buf >> 8) & 0x0ff)

{

case 71: /*Home*/

*x -= __dec__;

*y -= __dec__;

break;

case 72: /*Up*/

*y -= __dec__;

break;

case 73: /*PgUp*/

*x += __dec__;

*y -= __dec__;

break;

case 75: /*Left*/

*x -= __dec__;

break;

case 77: /*Right*/

*x += __dec__;

break;

case 79: /*End*/

*x -= __dec__;

*y += __dec__;

break;

case 80: /*Down*/

*у += __dec__;

break;

case 81: /*PgDn*/

*x += __dec__;

*y += __dec__;

break;

default:

*status = buf;

}/* End switch ( buf >8)*/

else

switch (buf & 0x0ff)

{

case 43: /*Plus*/

if(__dec__ < 30) __dec__+= 1;

break;

case 45: /*Minus*/

if(__dec__ > 1) __dec__ -= 1;

break;

case 27: /*Esc*/

*status = 2;

break;

case 13: /*Enter*/

*status = 1;

break;

case 32; /*Space*/

*status = 4;

break;

default:

*status = buf;

}/* End switch (buf & OxOff) */

if(*x < X_MIN) *x = X_MIN;

if(*y < Y_MIN) *y = Y_MIN;

if(*x > X_MAX) *x = X_MAX;

if(*y > Y_MAX) *y = Y_MAX;

}

/*-----------------------------------------------------*/

void mouse_key_status(int *status, int *x, int *y)

{

/* Функция записывает координаты курсора мыши (*х и *у) и

состояние ее кнопок (*status):

0-й бит - левая кнопка;

1-й бит - правая кнопка;

2-й бит - средняя кнопка.

Кроме того, функция реагирует на работу с клавиатурой,

симулируя перемещение мыши при нажатии клавиш расширенной

клавиатуры и нажатие кнопок на мыши при нажатии клавиш:

<ENTER> - 0-й бит;

<ЕSСаре> - 1-й бит;

<SPACEBAR> - 2-й бит.

При нажатии любой другой клавиши клавиатуры передает

ее расширенный ASCII-код в *status. */

int i;

I = 0;

if(MOUSE_READY) position_status(status, x, y);

while (*status !=0 )

{

i = *status;

if(MOUSE_READY) position_status(status, x, y);

}

*status = i;

if((bioskey(1) != 0) && (*status == 0))

{

get_key(status, x, y);

if(MOUSE_READY) set_position(*x,*y);

}

}

/*-----------------------------------------------------*/

Порядок выполнения.

  1. Получить вариант задания.

  2. Рассчитать тестовый пример.

  3. Написать и отладить программу, в соответствии с заданием.

  4. Показать работу преподавателю.

  5. Оформить отчет и защитить работу.

Содержание отчета.

  1. Формулировка задания.

  2. Теоретическая часть.

  3. Текст программы.

  4. Тестовый пример.

  5. Выводы.

Контрольные вопросы.

  1. Как проводится инициализация и завершение работы графической библиотеки Borland?

  2. Какие способы подключения графической библиотеки вы знаете?

  3. Каковы основные функции рисования линейных объектов?

  4. Каким образом в ОС MS DOS можно получить состояние клавиш мыши?

  5. Что такое палитра и окно вывода?

  6. Как осуществляется выбор шрифта и его параметров?

  7. Что такое экранные и мировые координаты?

ЛАБОРАТОРНАЯ РАБОТА №2