Направления программирования. История создания языка Си. Особенности языка, страница 31

Для инициализации графического режима используется функция: INITGRAPT ().

Её прототип       VOID INITGRAPT(INT FAR *DRAVER, INT FAR *MODE, CHAR FAR  *PATH) 

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

Пример: INT driver = DETECT, MODE, EVICODE

Макрос DETECT – задает автоматическое определение типа видеоадаптера и выбора соответствующего драйвера во время выполнения программы. Это позволяет переносить без труда изменения программы на компьютере с другими видеоадаптерами.

INITGRAPH (& DRIVER, &MODE, “D:\\BGI”);

EVICODE = graphresult();

IF (EVICODE! = 0) /*произошла ошибка*/

{

PRINTF (“Ошибка: %s ”, grapherrormsg(EVICODE));

/* функция  grapherrormsg() – возвращает строку с сообщением по заданному коду ошибки*/

}

EXIT (1); /* завершение работы программы */  

ELSE 

- - - - }

п. 19. Работа с образами экрана.

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

1.  Определить размер области памяти для хранения изображения, используя функцию IMAGESIZE ().

Её прототип:  UNSIGNET FAR IMAGESIZE (INT LEFT, INT TOP, INT RIGHT, INT BOTTOM) - возвращает объем буфера, нужного для сохранения графической информации окна экрана с заданными координаты.  

2.  Выделить область памяти для хранения образа, например, используя функцию MALLOC.

3.  Сохранить изображение, заключенное в прямоугольной области, в буфере, используя функцию:

VOID FAR GETIMAGE (INT LEFT, INT TOP,  INT RIGHT, INT BOTTOM, VOID FAR *BUF); - сохранение в области памяти, на которую указывает указатель  BUF, образ экрана заданный координатами.

4.    Восстановить изображение в любом месте экрана, используя вызов функции: PUTIMAGE ()

VOID FAR PUTIMAGE (INT LEFT, INT TOP, VOID FAR *BUF, INT OP); - вывод ранее сохраненного графического изображения в окно экрана с левым верхним углом (LEFT, TOP). ОР – параметр определяющий способ вывода образа на экран. Этот параметр может принимать одно из следующих  значений:

-  0 – означает, что каждый пиксель (бит) изображения из области памяти будет пересылаться на экран.

-  1 – означает, что при пересылке на экран между битами образа и битами экрана выполняется логическая    операция “исключающая или” (XOR).

-      2 - означает, что при пересылке на экран между битами образа и битами экрана выполняется логическая    операция “или”.

-      3 -  означает, что при пересылке на экран между битами образа и битами экрана выполняется логическая    операция “и”.

-      4 -  означает, что при пересылке на экран между битами образа и битами экрана выполняется логическая    операция “не” (негатив).

За счет использования различных операций можно различным образом восстанавливать изображение на экране. Очевидно, что применение операции XOR(1) к той же позиции экрана, где был заполнен образ, приведет к исчезновению изображения. Это операция часто используется для создания движущихся изображений.

Пример: Рисуем  движущейся круг на экране. 

#include<math.h>

#include<graphics.h>

#define R 20

#define Sx 20

#define Sy 20

main()

{

int driver = DETECT, mode,evicode;

int size,i,j;

void *p;

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

evicode= graphresult();

if (evicode == 0)

{

pieslice(Sx,Sy,0,360,R);       //закрашенный круг

// сохраняем изображение

size = imagesize(Sx-R,Sy-R,Sx+R,Sy+R);

p = malloc(size);

// сохранили

getimage(Sx-R,Sy-R,Sx+R,Sy+R,p);

// выполняем движение

i=j=20;

do

{

putimage(i-R,j-R,p,1); // стереть изображение

i+=6;

j+=3;

putimage(i-R,j-R,p,0); // в любом месте

delay(100);

}

while(i<600);

getch();

free(p);

}

}