1、 图形函数图形函数 Turbo C提供了非常丰富图形函数,所有图形函数原型均在graphics. h中,本节重要简介图形模式初始化、独立图形程序建立、基本图形功能、图形窗口以及图形模式下文本输出等函数。此外,使用图形函数时要保证有显示器图形驱动程序*BGI,同步将集成开发环境Options/Linker中Graphics lib选为on,只有这样才干保证对的使用图形函数。 1. 图形模式初始化 不同显示屏适配器有不同图形辨别率。即是同一显示屏适配器,在不同模式下也有不同辨别率。因而,在屏幕作图之前,必要依照显示屏适配器种类将显示屏设立成为某种图形模式,在未设立图形模式之前,微机系统默认屏幕为文
2、本模式(80列,25行字符模式),此时所有图形函数均不能工作。设立屏幕为图形模式,可用下列图形初始化函数: void far initgraph(int far *gdriver,int far *gmode,char *path); 其中gdriver和gmode分别表达图形驱动器和模式,path是指图形驱动程序所在目录途径。关于图形驱动器、图形模式符号常数及相应辨别率见表2。 图形驱动程序由Turbo C出版商提供,文献扩展名为.BGI。依照不同图形适配器有不同图形驱动程序。例如对于EGA、VGA 图形适配器就调用驱动程序EGAVGA.BGI。 表2. 图形驱动器、模式符号常数及数值 图形
3、驱动器(gdriver) 图形模式(gmode) 色调 辨别率 符号常数 数值 符号常数 数值 CGA 1 CGAC0 0 C0 320*200 CGAC1 1 C1 320*200 CGAC2 2 C2 320*200 CGAC3 3 C3 320*200 CGAHI 4 2色 640*200 MCGA 2 MCGAC0 0 C0 320*200 MCGAC1 1 C1 320*200 MCGAC2 2 C2 320*200 MCGAC3 3 C3 320*200 MCGAMED 4 2色 640*200 MCGAHI 5 2色 640*480 EGA 3 EGALO 0 16色 640*2
4、00 EGAHI 1 16色 640*350 EGA64 4 EGA64LO 0 16色 640*200 EGA64HI 1 4色 640*350 EGAMON 5 EGAMONHI 0 2色 640*350 IBM8514 6 IBM8514LO 0 256色 640*480 IBM8514HI 1 256色 1024*768 HERC 7 HERCMONOHI 0 2色 720*348 ATT400 8 ATT400C0 0 C0 320*200 ATT400C1 1 C1 320*200 ATT400C2 2 C2 320*200 ATT400C3 3 C3 320*200 ATT400
5、MED 4 2色 320*200 ATT400HI 5 2色 320*200 VGA 9 VGALO 0 16色 640*200 VGAMED 1 16色 640*350 VGAHI 2 16色 640*480 PC3270 10 PC3270HI 0 2色 720*350 DETECT 0 用于硬件测试 例4. 使用图形初始化函数设立VGA高辨别率图形模式 #include int main() int gdriver,gmode; gdriver=VGA; gmode=VGAHI; initgraph(&gdriver,&gmode,c:tc); bar3d(100,100,300,250
6、,50,1); /*画一长方体*/ getch(); closegraph(); return 0; 有时编程者并不懂得所用图形显示屏适配器种类,或者需要将编写程序用于不同图形驱动器,Turbo C提供了一种自动检测显示屏硬件函数, 其调用格式为: void far detectgraph(int *gdriver,*gmode); 其中gdriver和gmode意义与上面相似。 例5. 自动进行硬件测试后进行图形初始化 #include int main() int gdriver,gmode; detectgraph(&gdriver,&gmode); /*自动测试硬件*/ printf(
7、the graphics driver is %d,mode is %dn,gdriver, gmode); /*输出测试成果*/ getch(); initgraph(&gdriver,&gmode,c:tc); /* 依照测试成果初始化图形*/ bar3d(10,10,130,250,20,1); getch(); closegraph(); return 0; 上例程序中先对图形显示屏自动检测,然后再用图形初始化函数进行初始化设立,但Turbo C提供了一种更简朴办法, 即用gdriver= DETECT 语句后再跟initgraph()函数就行了。采用这种办法后,上例可改为: 例6.
8、#include int main() int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,c:tc); bar3d(50,50,150,30,1); getch(); closegraph(); return 0; 此外,Turbo C提供了退出图形状态函数closegraph(),其调用格式为: void far closegraph(void); 调用该函数后可退出图形状态而进入文本方式(Turbo C 默认方式),并释放用于保存图形驱动程序和字体系统内存。 2. 独立图形运营程序建立 Turbo C对于用initgraph()函数直接
9、进行图形初始化程序,在编译和链接时并没有将相应驱动程序(*.BGI)装入到执行程序,当程序进行到intitgraph()语句时,再从该函数中第三个形式参数char *path中所规定途径中去找相应驱动程序。若没有驱动程序,则在C:TC中去找,如C:TC中仍没有或TC不存在,将会浮现错误: BGI Error:Graphics not initialized (use initgraph) 因而,为了使用以便,应当建立一种不需要驱动程序就能独立运营可执行图形程序,Turbo C中规定用下述环节(这里以EGA、VGA显示屏为例): 1. 在C:TC子目录下输入命令:BGIOBJ EGAVGA 此命
10、令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ目的文献。 2. 在C:TC子目录下输入命令:TLIB LIBGRAPHICS.LIB+EGAVGA 此命令意思是将EGAVGA.OBJ目的模块装到GRAPHICS.LIB库文献中。 3. 在程序中initgraph()函数调用之前加上一句: registerbgidriver(EGAVGA_driver):该函数告诉连接程序在连接时把EGAVGA驱动程序装入到顾客执行程序中。 通过上面解决,编译链接后执行程序可在任何目录或其他兼容机上运营。假设已作了前两个环节,若再向例6中加 registerbgidriver()函数则变成: 例7:
11、 #include #include int main() int gdriver=DETECT,gmode; registerbgidriver(EGAVGA_driver): / *建立独立图形运营程序 */ initgraph( gdriver,gmode,c:tc); bar3d(50,50,250,150,20,1); getch(); closegraph(); return 0; 上例编译链接后产生执行程序可独立运营。 如不初始化成EGA或CGA辨别率,而想初始化为CGA辨别率, 则只需要将上述环节中有EGAVGA地方用CGA代替即可。 3.屏幕颜色设立和清屏函数 对于图形模式屏
12、幕颜色设立,同样分为背景色设立和前景色设立。在Turbo C中分别用下面两个函数。 设立背景色: void far setbkcolor( int color); 设立作图色: void far setcolor(int color); 其中color 为图形方式下颜色规定数值,对EGA,VGA显示屏适配器,关于颜色符号常数及数值见下表所示。 表3 关于屏幕颜色符号常数表 符号常数 数值 含义 符号常数 数值 含义 BLACK 0 黑色 DARKGRAY 8 深灰 BLUE 1 兰色 LIGHTBLUE 9 深兰 GREEN 2 绿色 LIGHTGREEN 10 淡绿 CYAN 3 青色 LI
13、GHTCYAN 11 淡青 RED 4 红色 LIGHTRED 12 淡红 MAGENTA 5 洋红 LIGHTMAGENTA 13 淡洋红 BROWN 6 棕色 YELLOW 14 黄色 LIGHTGRAY 7 淡灰 WHITE 15 白色 对于CGA适配器,背景色可觉得表3中16种颜色一种,但前景色依赖于不同调色板。共有四种调色板,每种调色板上有四种颜色可供选取。不同调色板所相应原色见表4。 表4 CGA调色板与颜色值表 调色板 颜色值 符号常数 数值 0 1 2 3 C0 0 背景 绿 红 黄 C1 1 背景 青 洋红 白 C2 2 背景 淡绿 淡红 黄 C3 3 背景 淡青 淡洋红 白
14、 清除图形屏幕内容使用清屏函数,其调用格式如下: voide far cleardevice(void); 关于颜色设立、清屏函数使用请看例8。 例8: #include #include int main() int gdriver,gmode,i; gdriver=DETECT; registerbgidriver(EGAVGA_DRIVER);/*建立独立图形运营程序*/ initgraph(&gdriver,&gmode,);/*图形初始化*/ setbkcolor(0); /*设立图形背景*/ cleardevice(); for(i=0;i=15;i+) setcolor(i);
15、/*设立不同作图色*/ circle(320,240,20+i*10); /*画半径不同圆*/ delay(100); /*延迟100毫秒*/ for(i=0;i=15;i+) setbkcolor(i); /*设立不同背景色*/ cleardevice(); circle(320,240,20+i*10); delay(100); closegraph(); return 0; 此外,TURBO C也提供了几种获得现行颜色设立状况函数。 int far getbkcolor(void); 返回现行背景颜色值。 int far getcolor(void); 返回现行作图颜色值。 int fa
16、r getmaxcolor(void); 返回最高可用颜色值。 4. 基本图形函数 基本图形函数涉及画点,线以及其他某些基本图形函数。本节对这些函数作一全面简介。 一、画点 1. 画点函数 void far putpixel(int x,int y,int color); 该函数表达有指定象元画一种按color所拟定颜色点。对于颜色color值可从表3中获得而对x,y是指图形象元坐标。 在图形模式下,是按象元来定义坐标。对VGA适配器, 它最高辨别率为640x480,其中640为整个屏幕从左到右所有象元个数,480 为整个屏幕从上到下所有象元个数。屏幕左上角坐标为(0,0),右下角坐标为(63
17、9,479),水平方向从左到右为x轴正向,垂直方向从上到下为y轴正向。TURBO C 图形函数都是相对于图形屏幕坐标,即象元来说。 关于点此外一种函数是: int far getpixel(int x,int y); 它获得当前点(x,y)颜色值。 2. 关于坐标位置函数 int far getmaxx(void); 返回x轴最大值。 int far getmaxy(void); 返回y轴最大值。 int far getx(void); 返回游标在x轴位置。 void far gety(void); 返回游标有y轴位置。 void far moveto(int x,int y); 移动游标到(
18、x,y)点,不是画点,在移动过程中亦画点。 void far moverel(int dx,int dy); 移动游标从现行位置(x,y)移动到(x+dx,y+dy)位置,移动过程中不画点。 二、画线 1. 画线函数 TURBO C提供了一系列画线函数,下面分别论述: void far line(int x0,int y0,int x1,int y1); 画一条从点(x0,y0)到(x1,y1)直线。 void far lineto(int x,int y); 画一作从现行游标到点(x,y)直线。 void far linerel(int dx,int dy); 画一条从现行游标(x,y)到按
19、相对增量拟定点(x+dx,y+dy)直线。 void far circle(int x,int y,int radius); 以(x,y)为圆心,radius为半径,画一种圆。 void far arc(int x,int y,int stangle,int endangle,int radius); 以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表达)画一段圆弧线。在TURBO C中规定x轴正向为0度,逆时针方向旋转一周, 依次为90,180,270和360度(其他关于函数也按此规定,不再重述)。 void ellipse(int x,int y,i
20、nt stangle,int endangle,int xradius,int yradius); 以(x,y)为中心,xradius,yradius为x轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时, 画出一种完整椭圆。 void far rectangle(int x1,int y1,int x2,inty2); 以(x1,y1)为左上角,(x2,y2)为右下角画一种矩形框。 void far drawpoly(int numpoints,int far *polypoints); 画一种顶点数为numpoints
21、, 各顶点坐标由polypoints 给出多边形。polypoints整型数组必要至少有2倍顶点数个无素。每一种顶点坐标都定义为x,y,并且x在前。值得注意是当画一种封闭多边形时,numpoints 值取实际多边形顶点数加一,并且数组polypoints中第一种和最后一种点坐标相似。 下面举一种用drawpoly()函数画箭头例子。 例9: #include #include int main() int gdriver,gmode,i; int arw16=200,102,300,102,300,107,330, 100,300,93,300,98,200,98,200,102; gdriv
22、er=DETECT; registerbgidriver(EGAVGA_driver); initgraph(&gdriver,&gmode,); setbkcolor(BLUE); cleardevice(); setcolor(12); /*设立作图颜色*/ drawpoly(8,arw); /*画一箭头*/ getch(); closegraph(); return 0; 2. 设定线型函数 在没有对线特性进行设定之前,TURBO C用其默认值,即一点宽实线,但TURBO C也提供了可以变化线型函数。线型涉及:宽度和形状。其中宽度只有两种选取:一点宽和三点宽。而线形状则有五种。下面简介关
23、于线型设立函数。 void far setlinestyle(int linestyle, unsigned upattern, intthickness); 该函数用来设立线关于信息,其中linestyle是线形状规定,见表5。 表5. 关于线形状(linestyle) 符号常数 数值 含义 SOLID_LINE 0 实线 DOTTED_LINE 1 点线 CENTER_LINE 2 中心线 DASHED_LINE 3 点画线 USERBIT_LINE 4 顾客定义线 thickness是线宽度,见表6。 表6. 关于线宽(thickness) 符号常数 数值 含义 NORM_WIDTH 1
24、 一点宽 THIC_WIDTH 3 三点宽 对于upattern,只有linestyle选USERBIT_LINE 时才故意义( 选其他线型,uppattern取0即可)。此进uppattern16位二进制数每一位代表一种象元,如果那位为1,则该象元打开,否则该象元关闭。 void far getlinesettings(struct linesettingstype far *lineinfo); 该函数将关于线信息存储到由lineinfo 指向构造中, 表中linesettingstype构造如下: struct linesettingstype int linestyle; unsign
25、ed upattern; int thickness; 例如下面两句程序可以读出当前线特性 struct linesettingstype *info; getlinesettings(info); void far setwritemode(int mode); 该函数规定画线方式。如果mode=0,则表达画线时将所画位置本来信息覆盖了(这是TURBO C默认方式)。如果mode=1, 则表达画线时用当前特性线与所画之处原有线进行异或(XOR)操作, 事实上画出线是原有线与当前规定线进行异或后成果。因而,当线特性不变,进行两次画线操作相称于没有画线。 关于线型设定和画线函数例子如下所示。 例
26、10. #include #include int main() int gdriver,gmode,i; gdriver=DETECT; registerbgidriver(EGAVGA_driver); initgraph(&gdriver,&gmode,); setbkcolor(BLUE); cleardevice(); setcolor(GREEN); circle(320,240,98); setlinestyle(0,0,3); /*设立三点宽实线*/ setcolor(2); rectangle(220,140,420,340); setcolor(WHITE); setlin
27、estyle(4,0xaaaa,1); /*设立一点宽顾客定义线*/ line(220,240,420,240); line(320,140,320,340); getch(); closegraph(); return 0; 5. 封闭图形填充 填充就是用规定颜色和图模填满一种封闭图形。 一、先画轮廓再填充 TURBO C提供了某些先画出基本图形轮廓, 再按规定图模和颜色填充整个封闭图形函数。在没有变化填充方式时,TURBO C以默认方式填充。 下面简介这些函数。 void far bar(int x1,int y1,int x2,int y2); 拟定一种以(x1,y1)为左上角,(x2,
28、y2)为右下角矩形窗口,再按规定图模和颜色填充。 阐明:此函数不画出边框,因此填充色为边框。 void far bar3d(int x1,int y1,int x2,int y2, int depth, inttopflag); 当topflag为非0时,画出一种三维长方体。当topflag为0时,三维图形不封顶,事实上很少这样使用。 阐明:bar3d()函数中,长方体第三维方向不随任何参数而变, 即始终为45度方向。 void far pieslice(int x,int y,int stangle,int endangle, intradius); 画一种以(x,y)为圆心,radius为
29、半径,stangle为起始角度,endangle 为终结角度扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一种实心圆,并在圆内从圆点沿X轴正向画一条半径。 void far sector(int x,int y, int stanle, intendangle, intxradius,int yradius); 画一种以(x,y)为圆心分别以xradius,yradius为x轴和y轴半径, stangle为起始角,endangle为终结角椭圆扇形,再按规定方式填充。 二、设定填充方式 TURBO C有四个与填充方式关于函数。下面分别简介: void far se
30、tfillstyle(int pattern,int color); color值是当前屏幕图形模式时颜色有效值。pattern值及与其等价符号常数如表7所示。 表7. 关于填充式样pattern规定 符号常数 数值 含义 EMPTY_FILL 0 以背景颜色填充 SOLID_FILL 1 以实填充 LINE_FILL 2 以直线填充 LTSLASH_FILL 3 以斜线填充(阴影线) SLASH_FILL 4 以粗斜线填充(粗阴影线) BKSLASH_FILL 5 以粗反斜线填充(粗阴影线) LTBKSLASH_FILL 6 以反斜线填充(阴影线) HATCH_FILL 7 以直方网格填充 XHATCH_FILL 8 以斜网格填充 INTTERLEAVE_FILL 9 以间隔点填充