2.7 屏幕操作函数
除了清屏函数以外,关于屏幕操作还有以下函数: 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 复制
- 21 -
XOR_PUT 1 与屏幕图像异或的复制 OR_PUT 2 与屏幕图像或后复制 AND_PUT 3 与屏幕图像与后复制 NOT_PUT 4 复制反像的图形
━━━━━━━━━━━━━━━━━━━━━━━━━━ 对于imagesize()函数,只能返回字节数小于64K字节的图像区域,否则将会出错,出错时返回-1。
本节介绍的函数在图像动画处理、菜单设计技巧中非常有用。 下面程序模拟两个小球动态碰撞过程。
#include
int i, gdriver, gmode, size; void *buf;
gdriver=DETECT;
initgraph(&gdriver, &gmode, \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++){
- 22 -
putimage(255-i, 170, buf, COPY_PUT); putimage(315+i, 170, buf, COPY_PUT); }
getch();
closegraph(); }
2.8 图形模式下的文本输出
在图形模式下,只能用标准输出函数,如printf(),puts(),putchar()函数输出文本到屏幕。除此之外,其它输出函数(如窗口输出函数)不能使用,即是可以输出的标准函数,也只以前景色为白色,按80列,25行的文本方式输出。
Turbo C2.0也提供了一些专门用于在图形显示模式下的文本输出函数。下面将分别进行介绍。
一、 文本输出函数
void far outtext(char far *textstring); 该函数输出字符串指针textstring所指的文本在现行位置。
void far outtextxy(int x, int y, char far *textstring);该函数输出字符串指针textstring所指的文本在规定的(x, y)位置。其中x和y为象元坐标。 说明:
这两个函数都是输出字符串,但经常会遇到输出数值或其它类型的数据,此时就必须使用格式化输出函数sprintf()。
sprintf()函数的调用格式为: int sprintf(char *str, char *format, variable-list); 它与printf()函数不同之处是将按格式化规定的内容写入str 指向的字符串中,返回值等于写入的字符个数。 例如:
sprintf(s, \这里s应是字符串指针或数组,mark为整型变量。
- 23 -
2.9 文本字体、字型和输出方式的设置
有关图形方式下的文本输出函数,可以通过setcolor()函数设置输出文本的颜色。另外,也可以改变文本字体大小以及选择是水平方向输出还是垂直方向输出。
void far settexjustify(int horiz, int vert); 该函数用于定位输出字符串。
对使用outtextxy(int x, int y, char far *str textstring)函数所输出的字符串,其中哪个点对应于定位坐标(x,y)在TurboC2.0中是有规定的。如果把一个字符串看成一个长方形的图形,在水平方向显示时,字符串长方形按垂直方向可分为顶部,中部和底部三个位置,水平方向可分为左,中,右三个位置,两者结合就有9个位置。
settextjustify()函数的第一个参数horiz 指出水平方向三个位置中的一个,第二个参数vert指出垂直方向三个位置中的一个,二者就确定了其中一个位置。当规定了这个位置后,用outtextxy() 函数输出字符串时, 字符串长方形的这个规定位置就对准函数中的(x,y)位置。而对用uttext()函数输出字符串时,这个规定的位置就位于现行游标的位置。
有关参数horiz和vert的取值参见下表。 参数horiz和vert的取值
━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数 数值 用于
──────────────────────── LEFT_TEXT 0 水平 RIGHT_TEXT 2 水平 BOTTOM_TEXT 0 垂直 TOP_TEXT 2 垂直
CENTER_TEXT 1 水平或垂直
━━━━━━━━━━━━━━━━━━━━━━━━
void far settextstyle(int font, int direction,int charsize); 该函数用来设置输出字符的字形(由font确定)、输出方向(由direction确定)和字符大小(由charsize确定)等特性。
- 24 -
Turbo C2.0对函数中各个参数的规定见下列各表所示: font的取值
━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数 数值 含义
──────────────────────── DEFAULT_FONT 0 8*8点阵字(缺省值) TRIPLEX_FONT 1 三倍笔划字体 SMALL_FONT 2 小号笔划字体
SANSSERIF_FONT 3 无衬线笔划字体 GOTHIC_FONT 4 黑体笔划字
━━━━━━━━━━━━━━━━━━━━━━━━ direction的取值
━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数 数值 含义
──────────────────────── HORIZ_DIR 0 从左到右 VERT_DIR 1 从底到顶
━━━━━━━━━━━━━━━━━━━━━━━━ charsize的取值
━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数或数值 含义
──────────────────────── 1 8*8点阵 2 16*16点阵 3 24*24点阵 4 32*32点阵 5 40*40点阵 6 48*48点阵 7 56*56点阵 8 64*64点阵 9 72*72点阵 10 80*80点阵
USER_CHAR_SIZE=0 用户定义的字符大小
━━━━━━━━━━━━━━━━━━━━━━━━
有关图形屏幕下文本输出和字体字型设置函数的用法请看下例: #include
- 25 -