Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*BGI,同时将集成开发环境Options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。图形模式的初始化不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:
void far initgraph(int far *gdriver, int far *gmode,char*path);
其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见如下叙述。
一、图形模式
1、函数名:initgraph
功 能:gdriver和gmode分别表示图形驱动器和图形模式,path是指图形驱动程序所在的目录路径。
用 法:voidfar initgraph(int far *gdriver, int far *gmode, char *path);
在这里必须在path目录下找到一个对应于gdriver的文件扩展名为.BGI的图形驱动程序(c语言编译器提供了对应各类适配器的不同图形驱动程序),然后对其设置模式gmode。
图形驱动器通常在TC根目录下或者根目录下面的BGI目录,以下给出一些图形驱动文件列表:
ATT.BGI
CGA.BGI(CGA模式)
EGAVGA.BGI(EGAVGA模式)
HERC.BGI
IBM8514.BGI
PC3270.BGI
事实上现在我们最常用的是EGAVGA.BGI图形驱动文件,相对于其它几个图形驱动文件它出现的时间比较晚,因此所能达到的图形模式分辨率和色彩相对就更加高。以下给出图形驱动器、模式的符号常数及数值:
2、函数名:closegraph
功能:关闭图形模式
用法:voidfar closegraph(viod)
调用该函数后即退出图形状态而进入文本方式,并释放用于保存图形驱动程序和字体的系统内存。
还需要补充一点的是我们可以采用另一个函数同样达到让硬件自动检测图形驱动器和模式的效果,其调用格式为:
3、函数名:detectgraph
功能: 通过检测硬件确定图形驱动程序和模式
用法: void far detectgraph( int far *graphdriver, int far *gmode)
二、画点函数
在图形模式下, 是按象元来定义坐标的。对VGA适配器, 它的最高分辨率为640x480,其中640为整个屏幕从左到右所有象元的个数, 480 为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(0, 0), 右下角坐标为(639, 479), 水平方向从左到右为x轴正向, 垂直方向从上到下为y轴正向。TURBO C 的图形函数都是相对于图形屏幕坐标, 即象元来说的。
1、函数名:putpixel
功 能: 在指定位置画一像素
用 法: void farputpixel (int x, int y, int pixelcolor);
2、函数名:getpixel
功 能: 取得指定像素的颜色
用 法: int fargetpixel(int x, int y);
三、坐标位置的函数
1、函数名:getmaxx
功 能: 返回屏幕的最大x坐标
用 法: int fargetmaxx(void);
函数名: getmaxy
功 能: 返回屏幕的最大y坐标
用 法: int fargetmaxy(void);
函数明: getx
功 能: 返回当前图形位置的x坐标
用 法: int fargetx(void);
函数名: gety
功 能: 返回当前图形位置的y坐标
用 法: int fargety(void);
函数名: moveto
功 能: 将CP移到(x, y)
用 法: void farmoveto(int x, int y);
函数名: moverel
功 能: 将当前位置(CP)移动一相对距离
用 法: void farmoverel(int dx, int dy);
四、画线函数
1、函数名:line
功 能: 在指定两点间画一直线
用 法: void farline(int x0, int y0, int x1, int y1);
2、函数名:lineto
功能:画一作从现行光标到点(x, y)的直线
用法:void far lineto(int x, int y);
3、函数名:linerel
功 能: 从当前位置点(CP)到与CP有一给定相对距离的点画一直线
用 法: void farlinerel(int dx, int dy);
4、函数名:circle
功 能: 在给定半径以(x, y)为圆心画圆
用 法: void farcircle(int x, int y, int radius);
5、函数名:arc
功 能: 画一弧线
用 法: void fararc( int x,int y,int stangle,int endangle, int radius );
以(x,y)为圆心, radius为半径, 从stangle开始到endangle结束(用度表示)画一段圆弧线。在TURBO C中规定x轴正向为0度, 逆时针方向旋转一周,依次为90, 180, 270和360度(其它有关函数也按此规定, 不再重述)。
6、函数名:ellipse
功 能: 画一椭圆
用 法: void farellipse( int x, int y, int stangle, int endangle, int xradius, int yradius);
以(x, y)为中心, xradius, yradius为x轴和y轴半径, 从角stangle 开始到endangle结束画一段椭圆线, 当stangle=0, endangle=360时, 画出一个完整的椭圆。
7、函数名:rectangle
功 能: 画一个矩形
用 法: void farrectangle( int left, int top, int right, int bottom );
8、函数名:drawpoly
功 能: 画多边形
用 法: void fardrawpoly( int numpoints, int far *polypoints );
画一个顶点数为numpoints,各顶点坐标由polypoints 给出的多边形。polypoints整型数组必须至少有2倍顶点数个无素。每一个顶点的坐标都定义为x,y, 并且x在前。值得注意的是当画一个封闭的多边形时, numpoints 的值取实际多边形的顶点数加一, 并且数组polypoints中第一个和最后一个点的坐标相同。
例1、使用图形初始化函数设置VGA高分辨率图形模式
#include
int main()
{
int gdriver, gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver, &gmode,"c:\\tc");
bar3d(100, 100, 300, 250, 50,1); /*画一长方体*/
getch();
closegraph();
return 0;
}
例2、自动进行硬件测试后进行图形初始化
#include
int main()
{
int gdriver, gmode;
detectgraph(&gdriver,&gmode); /*自动测试硬件*/
printf("the graphics driver is%d, mode is %d\n", gdriver,
gmode); /*输出测试结果*/
getch();
initgraph(&gdriver, &gmode,"c:\\tc");
/* 根据测试结果初始化图形*/
bar3d(10, 10, 130, 250, 20, 1);
getch();
closegraph();
return 0;
}
上例程序中先对图形显示器自动检测, 然后再用图形初始化函数进行初始化
设置, 但Turbo C提供了一种更简单的方法, 即用gdriver= DETECT 语句后再跟
initgraph()函数就行了。采用这种方法后, 上例可改为:
#include
int main()
{
int gdriver=DETECT, gmode;
initgraph(&gdriver, &gmode,"c:\\tc");
bar3d(50, 50, 150, 30, 1);
getch();
closegraph();
return 0;
}
例3:
#include
#include
int main()
{
int gdriver, gmode, i;
int arw[16]={200, 102, 300, 102, 300,107, 330,
100, 300, 93, 300, 98,200, 98, 200, 102};
gdriver=DETECT;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver, &gmode,"");
setbkcolor(BLUE);
cleardevice();
setcolor(12); /*设置作图颜色*/
drawpoly(8, arw); /*画一箭头*/
getch();
closegraph();
return 0;
}