Turbo C 图形编程 gaunthan Posted on Jul 16 2016 ? Graphic Programming ? >Turbo C提供了非常丰富的图形函数, 所有图形函数的原型均在 **graphics. h** 中。本文讲述了Turbo C图形编程的一些入门知识,和常见错误处理。 ## 前言 使用图形函数时要确保: * 有显示器图形驱动程序`*BGI`; 图形驱动程序由Turbo C出版商提供, 文件扩展名为.BGI。根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序 EGAVGA.BGI。 * 同时将集成开发环境Options/Linker中的`Graphics lib`选为`on` 只有这样才能保证正确使用图形函数。 ## 图形模式的初始化 不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式。 在未设置图形模式之前,微机系统默认屏幕为**文本模式**(80列,25行字符模式),此时所有图形函数均不能工作。 ### 设置屏幕为图形模式 可用下列图形初始化函数设置屏幕为图形模式: void far initgraph(int far *gdriver, int far *gmode, char *path); 其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。 ### 自动检测图形模式 有时编程者并不知道所用的图形显示器适配器种类, 或者需要将编写的程序用于不同图形驱动器, Turbo C提供了一个自动检测显示器硬件的函数, 其调用格式为: void far detectgraph(int *gdriver, *gmode); 其中 gdriver 和 gmode 的意义与上面相同。 有一种更简单的方法, 即将`gdriver`设为`DETECT`,之后再调用 `initgraph()`函数就行了。 示例程序如下: ``` c #include <stdio.h> #include <stdlib.h> #include <graphics.h> int main() { /* request autodetection */ int gdriver = DETECT, gmode, errorcode; /* initialize graphics and local variables */ initgraph(&gdriver, &gmode, "C:\\TC20\\BGI"); /* read result of initialization */ errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); exit(1); /* terminate with an error code */ } moveto(5, 5); linerel(150, 0); getch(); closegraph(); return 0; } ``` ## 独立图形运行程序的建立 Turbo C对于用initgraph()函数直接进行的图形初始化程序, 在编译和链接时并没有将相应的驱动程序(*.BGI)装入到执行程序, 而是当程序进行到intitgraph()语句时,再从该函数中第三个形式参数char *path中所规定的路径中去找相应的驱动程序。若没有驱动程序, 则在C:\TC中去找。如果C:\TC中仍没有或TC不存在, 将会出现以下错误: BGI Error: Graphics not initialized (use 'initgraph')。 因此, 为了使用方便,应该建立一个不需要驱动程序就能独立运行的可执行图形程序。 TurboC中规定用下述步骤来建立一个独立图形程序(这里以EGA、VGA显示器为例): 1. 在C:\TC子目录下输入命令:`BGIOBJ EGAVGA` 此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ的目标文件。 2. 在C:\TC子目录下输入命令:`TLIB LIB\GRAPHICS.LIB+EGAVGA` 此命令的意思是将EGAVGA.OBJ的目标模块装到GRAPHICS.LIB库文件中。 3. 在程序中initgraph()函数调用之前加上一句: `registerbgidriver(EGAVGA_driver);` 该函数调用告诉连接程序在连接时把EGAVGA的驱动程序装入到用户的执行程序中。 经过上面处理,编译链接后的执行程序可在任何目录或其它兼容机上运行。 ## 常用库函数 ### 图形显示设定 | 函数签名 | 功能 | |--| |void far initgraph(int far *gdriver, int far *gmode, char *path);|初始化图形模式| |void far detectgraph(int *gdriver, *gmode);|自动检测显示器硬件| |void far closegraph(void);|退出图形状态,进入文本方式(Turbo C 默认方式), 并释放用于保存图形驱动程序和字体的系统内存。| |void far cleardevice(void);|清屏函数| |void far setbkcolor( int color);|设置背景色| |void far setcolor(int color);|设置作图色| |int far getbkcolor(void);|获得现行背景颜色值| |int far getcolor(void);|返回现行作图颜色值| |int far getmaxcolor(void);|返回最高可用的颜色值| 颜色表如下:  ### 基本图形函数 在图形模式下, 是按像素来定义坐标的。对VGA适配器,它的最高分辨率为640x480。其中640为整个屏幕从左到右所有像素的个数,480为整个屏幕从上到下所有像素的个数。 屏幕的左上角坐标为(0, 0), 右下角坐标为(639, 479);水平方向从左到右为x轴正向,垂直方向从上到下为y轴正向。 | 函数签名 | 功能 | |--| |void far putpixel(int x, int y, int color);|用指定的像素元画一个按color所确定颜色的点| |int far getpixel(int x, int y);|获得当前点(x, y)的颜色值| |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);|移动游标到(x, y)点,移动过程中不画点| |void far moverel(int dx, int dy);|移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置, 移动过程中不画点| ### 作图函数 | 函数签名 | 功能 | 备注 | |--| |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)到按相对增量确定的点(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, int 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, 各顶点坐标由polypoints 给出的多边形|polypoints整型数组必须至少有2倍顶点数个无素| ## 错误解决 ### 图形错误:找不到 EGAVGA.BGI * 描述 图像编程时,运行程序提示以下信息 * 原因与解决方案 initgraph 函数的参数path没有正确设置,应将path路径设置为.BGI文件所在目录。 赏 Wechat Pay Alipay Git 常用配置 Turbo C 使用说明