TC图形函数
一、图形模式的初始化
微机系统默认屏幕为文本模式(80列,25行字符模式)。图形驱动程序由TurboC出版商提供,文件扩展名为.BGI。根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。所有图形函数的原型均在graphics. h 中,使用图形函数时要确保有显示器图形驱动程序*.BGI。
1.图形模式初始化函数:initgraph(int far *gdriver, int far *gmode,char *path);
2.自动检测显示器硬件的函数:detectgraph(int *gdriver, *gmode);
3.退图进文本释放内存函数:closegraph();
4.驱动程序装入函数:registerbgidriver(EGAVGA_driver);
5.背景色设置函数:setbkcolor(int color);
6.前景色(作图色)设置函数:setcolor(int color);
7.清除图形屏幕内容函数:cleardevice(void);
8.返回现行背景颜色值函数:getbkcolor(void); 。
9.返回现行作图颜色值函数:getcolor(void);
10.返回最高可用的颜色值函数:getmaxcolor(void);
例1. #include
void Init(void);/*图形驱动函数说明*/
int main()
{
Init();/*调用图形驱动集成函数*/
bar(100,150,200,50);
pieslice(200,300,0,360,90);
sector(500,300,0,360,100,50);
getch();
closegraph();
return 0;
}
void Init(void)/*图形驱动集成函数*/
{
int gd=DETECT,gm;/*检测显卡驱动并赋值*/
registerbgidriver(EGAVGA_driver);/*建立独立图形运行程序 */
initgraph(&gd,&gm,"");/*启动图形驱动函数*/
cleardevice();/*清屏函数*/
}
例2.置色与清屏函数应用:
#include
#include
int main()
{
int gdriver, gmode, i;
gdriver=DETECT;
initgraph(&gdriver, &gmode, ""); /*图形初始化*/
setbkcolor(0); /*设置图形背景*/
cleardevice();
for(i=0; i<=15; i++)
{
setcolor(i); /*设置不同作图色*/
circle(320, 240, 20+i*10); /*画半径不同的圆*/
delay(10000); /*延迟100毫秒*/
}
for(i=0; i<=15; i++)
{
setbkcolor(i); /*设置不同背景色*/
cleardevice();
circle(320, 240, 20+i*10);
delay(100000);
}
closegraph();
return 0;
}
二、光标操作函数
1.返回x轴的最大值函数:getmaxx(void);
2.返回y轴的最大值函数:getmaxy(void);
3.返回游标在x轴的位置函数:getx(void);
4.返回游标有y轴的位置函数:gety(void);
5.移动游标到(x, y)点,moveto(int x, int y);
6.移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置函数:moverel(int dx, int dy);
例句:moveto(20,40);lineto(60,80);moverel(140,220); /*光标到(200,300)*/
三、基本图形函数
1.画点函数 putpixel(int x, int y, int color);
2.获得当前点(x, y)的颜色值函数:getpixel(int x, int y);
3.直线函数:line(int x0, int y0, int x1, int y1);
4.从现行游标到点(x, y)的直线函数:lineto(int x, int y);
5.从现行游标(x,y)到点(x+dx, y+dy)的直线函数:linerel(int dx, int dy);
例句:lineto(0,180);linerel(640,120);/*光标到(640,300)*/
6.以(x, y)为圆心radius为半径的圆函数:circle(int x, int y, int radius);
7.以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(度)画一段圆弧线函数:
arc(x,y,stangle,endangle,radius);
8.以(x, y)为中心,xradius,yradius为x轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线函数:ellipse(x,y,stangle,endangle,xradius,yradius);
9.矩形框函数:rectangle(x1,y1,x2,y2);
10.多边形函数:drawpoly(numpoints,*polypoints);
例3.用drawpoly()函数画箭头:
#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;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
cleardevice();
setcolor(12); /*设置作图颜色*/
drawpoly(8, arw); /*画一箭头*/
getch();
closegraph();
return 0;
}
变式练习(正五角星)
#include
#include
int main()
{
int gdriver, gmode, i;
int arw[22]={100,0,76,73,0,73,62,118,32,190,100,145,162,190,138,118,200,73,124,73,100,0};
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
cleardevice();
setcolor(12); /*设置作图颜色*/
drawpoly(11, arw);
getch();
closegraph();
return 0;
}
11.设定线型函数:setlinestyle(linestyle,upattern,thickness);
有关线的形状(linestyle)
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
─────────────────────────
SOLID_LINE 0 实线
DOTTED_LINE 1 点线
CENTER_LINE 2 中心线
DASHED_LINE 3 点画线
USERBIT_LINE 4 用户定义线
━━━━━━━━━━━━━━━━━━━━━━━━━
有关线宽(thickness)
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
─────────────────────────
NORM_WIDTH 1 一点宽
THIC_WIDTH 3 三点宽
━━━━━━━━━━━━━━━━━━━━━━━━━
对于upattern,只有linestyle选USERBIT_LINE 时才有意义 (选其它线型,uppattern取0即可)。此时uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。例句:setlinestyle(4, 0x2184, 3);
例4.有关线型设定和画线函数应用:
#include
#include
int main()
{
int gdriver, gmode, i;
gdriver=DETECT;
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);
setlinestyle(4, 0x2184, 3);/*设置一点宽用户定义线*/
line(220, 240, 420, 240);
line(320, 140, 320, 340);
getch();
closegraph();
return 0;
}
12.getlinesettings(struct linesettingstypefar *lineinfo);
该函数将有关线的信息存放到由lineinfo 指向的结构中,linesettingstype的结构如下:
struct linesettingstype{
int linestyle;
unsigned upattern;
int thickness;
}
例如下面两句程序可以读出当前线的特性
struct linesettingstype info;
getlinesettings(&info);
例5.函数getlinesettings应用
#include
#include
int main()
{
int gdriver, gmode, i;
struct linesettingstype info;
gdriver=DETECT;
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);
setlinestyle(4, 0x2184, 3);/*设置一点宽用户定义线*/
line(220, 240, 420, 240);
line(320, 140, 320, 340);
getch();
getlinesettings(&info);
cleardevice(); /*清除图形屏幕内容*/
printf("\n");
printf("\n");
printf("\n");
printf("The linestyle is %d\tThe upattern is %x\tThe thickness is %d\t", info . linestyle , info . upattern , info . thickness );
getch();
clrscr();
getch();
return 0;
}
13.画线方式函数:setwritemode(int mode);
mode=0,表示画线时将所画位置的原来信息覆盖了(这是TURBO C的默认方式)。如果mode=1, 则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作, 实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,当线的特性不变,进行两次画线操作相当于没有画线。
例6.函数setwritemode应用
#include
#include
int main()
{
int gdriver, gmode, i;
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");
setbkcolor(15);
cleardevice();
setcolor(GREEN);
setcolor(1);
setlinestyle(0, 0, 3);
rectangle(220, 140, 420, 340);
line(220, 240, 420, 240);
setwritemode(1);
line(320, 140, 320, 340);
setwritemode(1);
setlinestyle(0, 0, 1);
setcolor(2);
line(220, 240, 420, 240);
line(320, 140, 320, 340);
getch();
return 0;
}
四、填充函数
1.填充式样颜色设置函数:setfillstyle(int pattern, int color);
关于填充式样pattern的规定
━━━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
───────────────────────────
EMPTY_FILL 0 以背景颜色填充
SOLID_FILL 1 以color指定单色填充
LINE_FILL 2 以直线填充
LTSLASH_FILL 3 以斜线填充(阴影线)
SLASH_FILL 4 以粗斜线填充(粗阴影线)
BKSLASH_FILL 5 以粗反斜线填充(粗阴影线)
LTBKSLASH_FILL 6 以反斜线填充(阴影线)
HATCH_FILL 7 以直方网格填充
XHATCH_FILL 8 以斜网格填充
INTTERLEAVE_FILL 9 以间隔点填充
WIDE_DOT_FILL 10 以稀疏点填充
CLOSE_DOS_FILL 11 以密集点填充
USER_FILL 12 以用户定义式样填充 (另有函数)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle() 函数设置。当选用USER_FILL时,该函数对填充图模和颜色不作任何改变。 之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。例句:setfillstyle(1,8);
2.设置用户定义的填充图模及颜色函数:setfillpattern(char * upattern,int color);
upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向整个封闭区域填充。例句:char str[8]={0x18,0x24,0x42,0x81,0x81,0x42,0x24,0x18}; /*用户定义图模*/
setfillpattern(str, RED);
例7.函数setfillpattern应用
#include
main()
{
int driver,mode;
static char diamond[8]={0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00};
driver=DETECT;
mode=0;
initgraph(&driver,mode,"");
setcolor(GREEN);
rectangle(80,200,220,300);
setfillpattern(diamond,RED);
floodfill(160,260,GREEN);
getch();
restorecrtmode();
}
3.对任意封闭图形填充的函数:floodfill(x,y,border);
例8:floodfill应用border为边界颜色
#include
main()
{
int driver,mode;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"");
setbkcolor(9);
setcolor(14);
circle(100,100,10);
circle(100,100,20);
circle(100,100,30);
setfillstyle(1,12);
floodfill(100,125,14);
circle(100,100,40);
circle(100,100,50);
circle(100,100,60);
setfillstyle(1,4);
floodfill(100,135,14);
getch();
restorecrtmode();
}
变式练习
#include
#include
main()
{
int gdriver, gmode;
struct fillsettingstype save;
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
setlinestyle(0,0,3);
setcolor(5);
bar3d(100,200,400,350,200,1); /*画长方体并填充*/
setfillstyle(1,11);
floodfill(450,300,5);
setfillstyle(1,14);
floodfill(250,150,5);
setfillstyle(1,8);
floodfill(200,300,5);
getch();
closegraph();
}
4.矩形窗口函数:bar(x1,y1,x2,y2); 无边框,
例句:setfillstyle(1,8);bar(100,150,200,50);
5.bar3d(x1,y1,x2,y2,depth,topflag);
当topflag为非0时, 画出一个三维的长方体。当topflag为0时,三维图形不封顶,实际上很少这样使用。长方体第三维的方向始终为45度的方向。
6.pieslice(x,y,stangle,endangle,radius);
画一个以(x, y)为圆心,radius为半径,stangle为起始角度,endangle 为终止角度的扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。
7.sector(x,y,stanle,endangle,xradius,yradius);
画一个以(x, y)为圆心分别以xradius, yradius为x轴和y轴半径,stangle 为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。
8.获得现行图模数及颜色数函数:
getfillsetings(struct fillsettingstype far * fillinfo);
其中fillsettingstype结构定义如下:
struct fillsettingstype
{
int pattern; /* 现行填充模式 * /
int color; /* 现行填充模式 * /
};
例9.函数getfillsetings应用
#include
main()
{
char str[8]={10,20,30,40,50,60,70,80}; /*用户定义图模*/
int gdriver,gmode,i;
struct fillsettingstype save;/*定义一个用来存储填充信息的结构变量*/
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:\\caic\\bgi");
setbkcolor(BLUE);
cleardevice();
setcolor(14);
setfillpattern(str, RED);
bar(100,150,200,50);
pieslice(200,300,0,360,90);
sector(500,300,0,360,100,50);
getch();
getfillsettings(&save);/*获得用户定义的填充模式信息*/
clrscr();
cleardevice(); /*清除图形屏幕内容*/
printf("\n");
printf("\n");
printf("\n");
printf("The pattern is %d, The color of filling is %d",save.pattern, save.color);/*输出目前填充图模和颜色值*/
getch();
}
9.获取用户图样设置函数:getfillpattern(char*pattern);
函数getfillpattern()返回上一次调用setfillpattern()设置的用户定义的填充图样,把定义当前用户填充图样的8个字节填入pattern所指向的数组,该数组必须至少8字节长,用户图样以8个8位字节的模式排列,如果还没有调用setfillpattern()设置用户定义的填充图样,那么函数将填入数组元素的值全为0xff。例句:
char fp[8];
getfillpattern(fp);
for(i=0;i<8;i++)printf(" %x\t",fp[i]);
例10.自定义填充并读取
#include
main()
{
char fp[8];
int i,gd=DETECT,gm;
char str[8]={0x18,0x24,0x42,0x81,0x81,0x42,0x24,0x18}; /*用户定义图模*/
initgraph(&gd,&gm,"");
cleardevice();
setbkcolor(BLUE);
setfillpattern(str, RED);
bar(100,150,200,50);
getch();
clrscr();
cleardevice();
getfillpattern(fp);
printf("\n");
printf("\n");
printf("\n");
for(i=0;i<8;i++)printf(" %x\t",fp[i]);
getch();
closegraph();
}
10.fillpoly()填充多边形函数:fillpoly(intpointnum,int*points);
用当前绘图色、线型及线宽画出给定点的多边形,然后用当前填充图样和填充色填充这个多边形。与drawpoly()的一样,其参数含义相同。该函数中pointnum为所填充多边形的顶点数,points指向存放所有顶点坐标的整型数组。fillpoly()是通过连接起点和终点将图形封闭起来,然后填充被包围的区域。与floodfill()不同的是,fillpoly()所用的填充方法不依靠边界连续的轮廓来确定填充区域。这样间断的线型是允许的,并且可以很简单地填充多边形确定的区域,包括在新的边界范围内任何其它图形上重画。如果出错,graphresult()函数将返回错误代码-6(Scan填充内存不足)。头文件为graphics.h返回值:无例11:用红色间隔点填充一个等腰直角三角形:#include
main()
{
int driver,mode;
static int points[]={100,100,100,200,200,200,100,100};
driver=DETECT;
mode=0;
initgraph(&driver,mode,"");
setfillstyle(INTERLEAVE_FILL,RED);
fillpoly(4,points);
getch();
restorecrtmode();
}
五、图形窗口操作函数
图形方式下也可以在屏幕上某一区域设定窗口,只是设定的为图形窗口而已,其后的有关图形操作都将以这个窗口的左上角(0, 0)作为坐标原点,而且可以通过设置使窗口之外的区域为不可接触。这样,所有的图形操作就被限定在窗口内进行。
1.setviewport(xl,yl,x2,y2,clipflag);
设定一个以(xl,yl)象元点为左上角,(x2,y2)象元为右下角的图形窗口,其中x1,y1,x2,y2是相对于整个屏幕的坐标。若 clipflag为非0,则设定的图形以外部分不可接触,若clipflag为0,则图形窗口以外可以接触。
2.clearviewport(); 清除现行图形窗口的内容。
3.getviewsettings(struct viewporttype far * viewport);
获得关于现行窗口的信息,并将其存于viewporttype定义的结构变量viewport中,其中viewporttype的结构说明如下:
structviewporttype{
int left, top, right, bottom;
int cliplag;};
注意:
a.窗口颜色的设置与前面讲过的屏幕颜色设置相同,但屏幕背景色和窗口背景色只能是一种颜色,如果窗口背景色改变,整个屏幕的背景色也将改变。
b.可以在同一个屏幕上设置多个窗口,但只能有一个现行窗口工作,要对其它窗口操作,通过将定义那个窗口的setviewport()函数再用一次即可。
c.前面讲过图形屏幕操作的函数均适合于对窗口的操作。
例12.
#include
main()
{
int gdriver, gmode, i;
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
for(i=0;i<440;i++)
{
clearviewport();
setviewport(1.35*i,i,40+1.35*i,40+i,0);
setcolor(5);
setfillstyle(1,5);
circle(20,20,18);
floodfill(20,20,5);
delay(8000);
}
getch();
closegraph();
}
变式练习1
#include
#include
int main()
{
int gdriver, gmode, i;
int arw[22]={100,0,76,73,0,73,62,118,32,190,100,145,162,190,138,118,200,73,124,73,100,0};
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
cleardevice();
for(i=0;i<200;i++)
{
clearviewport();
setviewport(1.35*i,i,200+1.35*i,200+i,0);
setcolor(5);
drawpoly(11, arw);
setfillstyle(1,5);
floodfill(100,100,5);
delay(800);
}
getch();
closegraph();
return 0;
}
变式练习2
#define N 0.2
#include
#include
int main()
{
int gdriver, gmode, i;
int arw[22]={100,0,76,73,0,73,62,118,32,190,100,145,162,190,138,118,200,73,124,73,100,0};
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
cleardevice();
for(i=0;i<23;i++)arw[i]=arw[i]*N;
for(i=0;i<450;i++)
{
clearviewport();
setviewport(1.35*i,i,200*N+1.35*i,200*N+i,0);
setcolor(5);
drawpoly(11, arw);
setfillstyle(1,5);
floodfill(100*N,100*N,5);
delay(8000);
}
getch();
closegraph();
六、屏幕图像操作函数
1.测图像大小函数:unsigned far imagesize (xl,yl,x2,y2);
imagsize()返回存储一块屏幕图像所需的内存大小,若字节数大于64KB,则返回-1.
2.将指定区域图像存到指定内存函数:getimage(xl,yl,x2,y2,*buf);
3.将指定内存图像输出的屏幕指定位置函数:putimage (x,y,*buf,op);
左上角为点(x, y),参数op=0(复制)
━━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含 义
──────────────────────────
COPY_PUT 0 复制
XOR_PUT 1 与屏幕图像异或的复制
OR_PUT 2 与屏幕图像或后复制
AND_PUT 3 与屏幕图像与后复制
NOT_PUT 4 复制反像的图形
━━━━━━━━━━━━━━━━━━━━━━━━━━
例句: void *buf; int size;
size=imagesize(0,0,100,100);
buf=malloc(size);
if(!buf) return -1;
getimage(0,0,100,100,buf);
putimage(300, 200, buf, 0);
例13.下面程序模拟两个小球动态碰撞过程。
#include
#include
#include
int main()
{
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,0);
for(i=0; i<185; i++){
putimage(70+i, 170, buf, 0);
putimage(500-i, 170, buf,0);
delay(500);
}
for(i=0;i<185; i++){
putimage(255-i, 170, buf,0);
putimage(315+i, 170, buf,0);
}
getch();
closegraph();
}
变式练习1
#include
#include
#include
int main()
{
int i, gdriver, gmode, size;
void *buf;
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
setcolor(5);
setlinestyle(0,0,2);
setfillstyle(1, 5);
circle(100, 200, 30);
floodfill(100, 200, 5);
size=imagesize(69, 169, 131, 231);
buf=malloc(size);
if(!buf) return -1;
getimage(69, 169, 131, 231,buf);
for(i=0; i<600; i=i+2){
putimage(10+i, 170, buf, COPY_PUT);
delay(5000);
}
getch();
closegraph();
}
变式练习2
#include
#include
#include
main()
{
int driver,mode;
unsigned size;
void *buf;
driver=DETECT;
mode=0;
initgraph(&driver,&mode,"");
rectangle(20,20,200,200);
setcolor(RED);
line(20,20,200,200);
setcolor(GREEN);
line(20,200,200,20);
getch();
size=imagesize(20,20,200,200);
if(size!=-1){
buf=malloc(size);
if(buf){
getimage(20,20,200,200,buf);
putimage(100,100,buf,0);
putimage(300,50,buf,0);
}
}
outtext("pressakey");
getch();
restorecrtmode();
}
附:操作页面函数
1.setvisualpage(pagenum);
页面从0开始(Turbo C默认页)1,2,3。使指定的页面变成可见页函数,只用于EGA,VGA 以及HERCULES图形适配器。EGA/3/EGALO/0/16色640*200有4个page,VGA/9/VGAMED/1/16色640*350有2个page,/VGAHI/2/16色640*480只有1个 page.所以无效不可用。
2.setactivepage(pagenum);
如果先用setactivepage() 函数在不同页面上画出一幅幅图像,再用函数交替显示,就可以实现一些动画的效果。(见变式练习)
例14.不同的页面地址不同不可用(目前电脑上)
#include
main()
{
int i,gd,gm;
gd=DETECT;
initgraph(&gd,&gm,"");
cleardevice();
for(i=0;i<3;i=i+1)
{
setvisualpage(0);
cleardevice();
setbkcolor(0);
setfillstyle(1,5);
bar(0,0,320,240);
setfillstyle(1,9);
bar(320,0,640,240);
setfillstyle(1,12);
bar(0,240,320,480);
setfillstyle(1,14);
bar(320,240,640,480);
delay(50000);
getch();
setvisualpage(1);
cleardevice();
setbkcolor(0);
setfillstyle(1,5);
bar(0,0,320,240);
setfillstyle(1,9);
bar(320,0,640,240);
setfillstyle(1,12);
bar(0,240,320,480);
setfillstyle(1,14);
bar(320,240,640,480);
delay(50000);
getch();
setvisualpage(2);
cleardevice();
setbkcolor(0);
setfillstyle(1,5);
bar(0,0,320,240);
setfillstyle(1,9);
bar(320,0,640,240);
setfillstyle(1,12);
bar(0,240,320,480);
setfillstyle(1,14);
bar(320,240,640,480);
delay(50000);
getch();
setvisualpage(3);
cleardevice();
setbkcolor(0);
setfillstyle(1,5);
bar(0,0,320,240);
setfillstyle(1,9);
bar(320,0,640,240);
setfillstyle(1,12);
bar(0,240,320,480);
setfillstyle(1,14);
bar(320,240,640,480);
delay(50000);
getch();
}
getch();
closegraph();
}
变式练习1
#include
#include
#include
#include
int main(void)
{
/*选择驱动程序和支持的模式多个页面*/
int gdriver=EGA,gmode=EGAHI,errorcode;
int x, y, ht;
/*图形和局部变量初始化*/
initgraph(&gdriver, &gmode, "");
/*读取初始化的结果*/
errorcode = graphresult();
if (errorcode!=grOk)
/*出现了一个错误*/
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
/*终止一个错误代码*/
}
x=getmaxx()/2;
y=getmaxy()/2;
ht=textheight("W");
/*选择关闭屏幕为绘图页*/
setactivepage(1);
/*绘制一条直线在#1页上*/
line(0,0,getmaxx(),getmaxy());
/*输出消息#1页*/
settextjustify(CENTER_TEXT, CENTER_TEXT);
outtextxy(x, y, "This is page #1:");
outtextxy(x, y+ht, "Press any key to halt:");
/*选择绘图页#0*/
setactivepage(0);
/*输出一个#0页上的信息*/
outtextxy(x, y, "This is page #0.");
outtextxy(x, y+ht, "Press any key to view page #1:");
getch();
/*选择作为可见页面的页面#1*/
setvisualpage(1);
/*清理*/
getch();
closegraph();
return 0;
}
变式练习2
#include
#include
#include
#include
#include
#include
main()
{
int gdriver,gmode;
gdriver=DETECT;/*gmode=EGAHI;*/
initgraph(&gdriver,&gmode,NULL);
printf("\n\t%d\t%d",gmode,gdriver);
setbkcolor(0);
setactivepage(0);
rectangle(2,2,190,110);
setactivepage(1);
setcolor(4);
moveto(0,0);
linerel(450,490);
getch();
setvisualpage(0);
getch();
setvisualpage(1);
getch();
closegraph();
}
变式练习3
#include
#include
#include
#include
#include
#include
main()
{
int gdriver,gmode;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"");
printf("\n\n\n\t%d\t%d",gmode,gdriver);
setbkcolor(4);
setactivepage(0);
rectangle(20,20,190,110);
setactivepage(1);
setcolor(4);
moveto(0,0);
linerel(450,490);
getch();
setvisualpage(0);
getch();
setvisualpage(1);
getch();
closegraph();
}
附:图形驱动器、模式的符号常数及数值:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
图形驱动器(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*200
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
ATT400MED 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 用于硬件测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
图形操作信息名称 代码 含义 grOK 0 成功
grNoInitGraph -1 没有图形初始化
grNoDetected -2 没有检测到图形硬件
grFileNoFound -3 没有找到图形驱动文件
grInvalidDriver -4 无效图形驱动程序
grNoLoadMem -5 没有足够内存装入图形驱动程序
grNoScanMem -6 Scan填充内存不足
grNoFloadMem -7 Flood填充内存不足
grFontNotFound -8 没有找到字体文件
grNoFontMem -9 没有足够内存用于装字体文件
grInvalidMode -10 无效图形模式
grError -11 一般图形错误
grIOerror -12 输入输出错误
grInvalidFont -13 无效字体文件
-14 无效字体号
grInvalidDeviceNum -15 无效设备号
本文来源:https://www.2haoxitong.net/k/doc/95d2cbfe770bf78a652954fe.html
文档为doc格式