资源描述
图形函数
图形函数
Turbo C提供了非常丰富图形函数,所有图形函数原型均在graphics. h
中,本节重要简介图形模式初始化、独立图形程序建立、基本图形功能、图
形窗口以及图形模式下文本输出等函数。此外,使用图形函数时要保证有显示
器图形驱动程序*BGI,同步将集成开发环境Options/Linker中Graphics lib选
为on,只有这样才干保证对的使用图形函数。
1. 图形模式初始化
不同显示屏适配器有不同图形辨别率。即是同一显示屏适配器,在不同
模式下也有不同辨别率。因而,在屏幕作图之前,必要依照显示屏适配器种类将
显示屏设立成为某种图形模式,在未设立图形模式之前,微机系统默认屏幕为文
本模式(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. 图形驱动器、模式符号常数及数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
图形驱动器(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 用于硬件测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
例4. 使用图形初始化函数设立VGA高辨别率图形模式
#include <graphics.h>
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;
}
有时编程者并不懂得所用图形显示屏适配器种类,或者需要将编写程序
用于不同图形驱动器,Turbo C提供了一种自动检测显示屏硬件函数, 其调用
格式为:
void far detectgraph(int *gdriver,*gmode);
其中gdriver和gmode意义与上面相似。
例5. 自动进行硬件测试后进行图形初始化
#include <graphics.h>
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()函数就行了。采用这种办法后,上例可改为:
例6.
#include <graphics.h>
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()函数直接进行图形初始化程序,在编译和链接
时并没有将相应驱动程序(*.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
此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ目的文献。
2. 在C:\TC子目录下输入命令:TLIB LIB\GRAPHICS.LIB+EGAVGA
此命令意思是将EGAVGA.OBJ目的模块装到GRAPHICS.LIB库文献中。
3. 在程序中initgraph()函数调用之前加上一句:
registerbgidriver(EGAVGA_driver):
该函数告诉连接程序在连接时把EGAVGA驱动程序装入到顾客执行程序中。
通过上面解决,编译链接后执行程序可在任何目录或其他兼容机上运营。
假设已作了前两个环节,若再向例6中加 registerbgidriver()函数则变成:
例7:
#include<stdio.h>
#include<graphics.h>
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.屏幕颜色设立和清屏函数
对于图形模式屏幕颜色设立,同样分为背景色设立和前景色设立。在
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 青色 LIGHTCYAN 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 背景 淡青 淡洋红 白
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
清除图形屏幕内容使用清屏函数,其调用格式如下:
voide far cleardevice(void);
关于颜色设立、清屏函数使用请看例8。
例8:
#include<stdio.h>
#include<graphics.h>
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); /*设立不同作图色*/
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 far getmaxcolor(void); 返回最高可用颜色值。
4. 基本图形函数
基本图形函数涉及画点,线以及其他某些基本图形函数。本节对这些函数
作一全面简介。
一、画点
1. 画点函数
void far putpixel(int x,int y,int color);
该函数表达有指定象元画一种按color所拟定颜色点。对于颜色color
值可从表3中获得而对x,y是指图形象元坐标。
在图形模式下,是按象元来定义坐标。对VGA适配器, 它最高辨别率为
640x480,其中640为整个屏幕从左到右所有象元个数,480 为整个屏幕从上到
下所有象元个数。屏幕左上角坐标为(0,0),右下角坐标为(639,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);
移动游标到(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)到按相对增量拟定点(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倍顶点数个无素。每一种顶点坐标都定义为x,
y,并且x在前。值得注意是当画一种封闭多边形时,numpoints 值取实际
多边形顶点数加一,并且数组polypoints中第一种和最后一种点坐标相似。
下面举一种用drawpoly()函数画箭头例子。
例9:
#include<stdlib.h>
#include<graphics.h>
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;
}
2. 设定线型函数
在没有对线特性进行设定之前,TURBO C用其默认值,即一点宽实线,
但TURBO C也提供了可以变化线型函数。线型涉及:宽度和形状。其中宽度只有
两种选取:一点宽和三点宽。而线形状则有五种。下面简介关于线型设立函
数。
void far setlinestyle(int linestyle, unsigned upattern, int
thickness);
该函数用来设立线关于信息,其中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 一点宽
THIC_WIDTH 3 三点宽
━━━━━━━━━━━━━━━━━━━━━━━━━
对于upattern,只有linestyle选USERBIT_LINE 时才故意义( 选其他线型,
uppattern取0即可)。此进uppattern16位二进制数每一位代表一种象元,如
果那位为1,则该象元打开,否则该象元关闭。
void far getlinesettings(struct linesettingstype far *lineinfo);
该函数将关于线信息存储到由lineinfo 指向构造中, 表中
linesettingstype构造如下:
struct linesettingstype{
int linestyle;
unsigned upattern;
int thickness;
}
例如下面两句程序可以读出当前线特性
struct linesettingstype *info;
getlinesettings(info);
void far setwritemode(int mode);
该函数规定画线方式。如果mode=0,则表达画线时将所画位置本来信息
覆盖了(这是TURBO C默认方式)。如果mode=1, 则表达画线时用当前特性线
与所画之处原有线进行异或(XOR)操作, 事实上画出线是原有线与当前规定
线进行异或后成果。因而,当线特性不变,进行两次画线操作相称于没有
画线。
关于线型设定和画线函数例子如下所示。
例10.
#include<stdlib.h>
#include<graphics.h>
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);
setlinestyle(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,y2)为右下角矩形窗口,再按规定图
模和颜色填充。
阐明:此函数不画出边框,因此填充色为边框。
void far bar3d(int x1,int y1,int x2,int y2, int depth, int
topflag);
当topflag为非0时,画出一种三维长方体。当topflag为0时,三维图形不
封顶,事实上很少这样使用。
阐明:bar3d()函数中,长方体第三维方向不随任何参数而变, 即始终为
45度方向。
void far pieslice(int x,int y,int stangle,int endangle, int
radius);
画一种以(x,y)为圆心,radius为半径,stangle为起始角度,endangle 为
终结角度扇形,再按规定方式填充。当stangle=0,endangle=360 时变成一种
实心圆,并在圆内从圆点沿X轴正向画一条半径。
void far sector(int x,int y, int stanle, intendangle, int
xradius,int yradius);
画一种以(x,y)为圆心分别以xradius,yradius为x轴和y轴半径, stangle
为起始角,endangle为终结角椭圆扇形,再按规定方式填充。
二、设定填充方式
TURBO C有四个与填充方式关于函数。下面分别简介:
void far setfillstyle(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 以间隔点填充
展开阅读全文