ITEEDU

第四章 图形操作函数

 第二节 屏幕操作函数

除了清屏函数以外,关于屏幕操作还有以下函数:

void far setactivepage(int pagenum); 
void far setvisualpage(int pagenum);

这两个函数只用于EGA,VGA 以及HERCULES图形适配器。

setctivepage()函数是为图形输出选择激活页。

所谓激活页是指后续图形的输出被写到函数选定的pagenum页面,该页面并不一定可见。

setvisualpage()函数才使pagenum所指定的页面变成可见页。页面从0开始(Turbo C默认页)。

如果先用setactivepage() 函数在不同页面上画出一幅幅图像,再用setvisualpage() 函数交替显示,就可以实现一些动画的效果。

void far getimage(int xl,int yl, int x2,int y2,void far *mapbuf); 
void far putimge(int x,int,y,void * mapbuf, int op); 
unsined far imagesize(int xl,int yl,int x2,int y2);

这三个函数用于将屏幕上的图像复制到内存,然后再将内存中的图像送回到屏幕上。首先通过函数imagesize() 测试要保存左上角为(xl,yl),右上角为(x2,y2)的图形屏幕区域内的全部内容需多少个字节,然后再给mapbuf分配一个所测数字节内存空间的指针。通过调用getimage()函数就可将该区域内的图像保存在内存中,需要时可用putimage()函数将该图像输出到左上角为点(x, y)的位置上,其中getimage()函数中的参数op规定如何释放内存中图像。 关于这个参数的定义参见下表。

putimage()函数中的op值

━━━━━━━━━━━━━━━━━━━━━━━━━━ 
符号常数 数值 含 义 
────────────────────────── 
COPY_PUT  0 复制 
XOR_PUT   1 与屏幕图像异或的复制 
OR_PUT    2 与屏幕图像或后复制 
AND_PUT   3 与屏幕图像与后复制 
NOT_PUT   4 复制反像的图形 
━━━━━━━━━━━━━━━━━━━━━━━━━━ 

对于imagesize()函数,只能返回字节数小于64K字节的图像区域,否则将会出错,出错时返回-1。

本节介绍的函数在图像动画处理、菜单设计技巧中非常有用。

下面程序模拟两个小球动态碰撞过程。

#include<malloc.h>
#include<stdio.h>
#include<graphics.h>
int main()
{
	int i, gdriver, gmode, size;
	void *buf;
	gdriver=DETECT;
	initgraph(&gdriver, &gmode, "c:\\caic\\bgi");
	setbkcolor(BLUE);
	cleardevice();
	setcolor(LIGHTRED);
	setlinestyle(0,0,1);
	setfillstyle(1, 10);
	circle(100, 200, 30);
	floodfill(100, 200, 12);
	size=imagesize(69, 169, 131, 231);
	buf=malloc(size);
	if(!buf) return -1;
		getimage(69, 169, 131, 231,buf);
		putimage(500, 269, buf, COPY_PUT);
		for(i=0; i<185; i++){
			putimage(70+i, 170, buf, COPY_PUT);
			putimage(500-i, 170, buf, COPY_PUT);
		}
		for(i=0;i<185; i++){
			putimage(255-i, 170, buf, COPY_PUT);
			putimage(315+i, 170, buf, COPY_PUT);
		}
		getch();
		closegraph();
	}