主题:[转帖]T C图形函数一览(1,2)
TC 图形函数
函数名:initgraph
功 能:gdriver和gmode分别表示图形驱动器和图形模式,path是指图形驱动程序所在的目录路径。
用 法:void far 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图形驱动文件,相对于其它几个图形驱动文件它出现的时间比较晚,因此所能达到的图形模式分辨率和色彩相对就更加高。以下给出图形驱动器、模式的符号常数及数值:
图形驱动器(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 硬件测试
函数名:closegraph
功能:关闭图形模式
用法:void far closegraph(viod)
调用该函数后即退出图形状态而进入文本方式,并释放用于保存图形驱动程序和字体的系统内存。
还需要补充一点的是我们可以采用另一个函数同样达到让硬件自动检测图形驱动器和模式的效果,其调用格式为:
函数名: detectgraph
功能: 通过检测硬件确定图形驱动程序和模式
用法: void far detectgraph( int far *graphdriver, int far *gmode)
画点函数
函数名: putpixel
功 能: 在指定位置画一像素
用 法: void far putpixel (int x, int y, int pixelcolor);
函数名: getpixel
功 能: 取得指定像素的颜色
用 法: int far getpixel(int x, int y);
坐标位置的函数
函数名: getmaxx
功 能: 返回屏幕的最大x坐标
用 法: int far getmaxx(void);
函数名: getmaxy
功 能: 返回屏幕的最大y坐标
用 法: int far getmaxy(void);
函数明: getx
功 能: 返回当前图形位置的x坐标
用 法: int far getx(void);
函数名: gety
功 能: 返回当前图形位置的y坐标
用 法: int far gety(void);
函数名: moveto
功 能: 将CP移到(x, y)
用 法: void far moveto(int x, int y);
函数名: moverel
功 能: 将当前位置(CP)移动一相对距离
用 法: void far moverel(int dx, int dy);
画线函数
函数名: line
功 能: 在指定两点间画一直线
用 法: void far line(int x0, int y0, int x1, int y1);
函数名:lineto
功能:画一作从现行光标到点(x, y)的直线
用法:void far lineto(int x, int y);
函数名: linerel
功 能: 从当前位置点(CP)到与CP有一给定相对距离的点画一直线
用 法: void far linerel(int dx, int dy);
函数名: circle
功 能: 在给定半径以(x, y)为圆心画圆
用 法: void far circle(int x, int y, int radius);
函数名: arc
功 能: 画一弧线
用 法: void far arc( int x,int y,int stangle,int endangle, int radius );
函数名: ellipse
功 能: 画一椭圆
用 法: void far ellipse( int x, int y, int stangle, int endangle, int xradius, int yradius);
函数名: rectangle
功 能: 画一个矩形
用 法: void far rectangle( int left, int top, int right, int bottom );
函数名: drawpoly
功 能: 画多边形
用 法: void far drawpoly( int numpoints, int far *polypoints );
线型函数
函数名: setlinestyle
功 能: 设置当前画线宽度和类型
用 法: void far setlinestyle( int linestype, unsigned upattern, int thickness);
有关线的形状(linestyle) :
符号常数 数值 含义
SOLID_LINE 0 实线
DOTTED_LINE 1 点线
CENTER_LINE 2 中心线
DASHED_LINE 3 点画线
USERBIT_LINE 4 用户定义线
有关线宽(thickness):
符号常数 数值 含义
NORM_WIDTH 1 一点宽
THIC_WIDTH 3 三点宽
函数名: getlinesettings
功 能: 取当前线型、模式和宽度
用 法: void far getlinesettings( struct linesettingstype far *lininfo );
该函数将有关线的信息存放到由lineinfo 指向的结构中,表中linesettingstype的结构如下:
struct linesettingstype{
int linestyle;
unsigned upattern;
int thickness;
}
例如下面两句程序可以读出当前线的特性
struct linesettingstype *info;
getlinesettings(info);
函数名: setwritemode
功 能: 设置图形方式下画线的输出模式
用 法: void far setwritemode(int mode);
如果mode=0,则表示画线时将所画位置的原来信息覆盖了(复制模式)。如果mode=1,则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。因此,异或模式下当线的颜色不变的时候,进行两次画线操作相当于没有画线。这一功能将在下一章“简单动画”中得到充分使用。
图形填充函数
函数名: bar
功 能: 画一个二维条形图
用 法: void far bar(int left,int top,int right,int bottom);
函数名: bar3d
功 能: 画一个三维条形图
用 法: void far bar3d( int left, int top, int right, int bottom, int depth, int topflag);
函数名: pieslice
功 能: 绘制并填充一个扇形
用 法: void far pieslice( int x, int stanle, int endangle, int radius );
函数名: sector
功 能: 画并填充椭圆扇区
用 法: void far sector( int x, int y, int stangle, int endangle );
填充方式
函数名: setfillstyle
功 能: 设置填充模式和颜色
用 法: void far setfillstyle(int pattern, int color);
color的值是当前屏幕图形模式时颜色的有效值。pattern的值及与其等价的符号常数。
关于填充式样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 以间隔点填充
WIDE_DOT_FILL 10 以稀疏点填充
CLOSE_DOS_FILL 11 以密集点填充
USER_FILL 12 以用户定义式样填充
除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle()函数设置。当选用USER_FILL时, 该函数对填充图模和颜色不作任何改变。之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。
函数名: setfillpattern
功 能: 选择用户定义的填充模式
用 法: void far setfillpattern( char far *upattern, int color );
其中upattern是一个指向8个字节的指针。这8个字节定义了8x8点阵的图形。每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。
函数名: getfillpattern
功 能: 将用户定义的填充模式拷贝到内存中
用 法: void far getfillpattern(char far *upattern);
函数名:getfillsetings
功 能:获得现行图模的颜色并将存入结构指针变量fillinfo中
用 法:viod far getfillsetings(struct linesettingstype far *lineinfo);
其中fillsettingstype结构定义如下:
struct fillsettingstype{
int pattern; // 现行填充模式
int color; // 现行填充模式
};
函数名: floodfill
功 能: 填充一个有界区域
用 法: void far floodfill(int x, int y, int border);
x,y为封闭图形内的任意一点。border为边界的颜色,也就是封闭图形轮廓的颜色。调用了该函数后, 将用规定的颜色和图模填满整个封闭图形。
使用这个函数有几点需要注意:
1.不能对边界点进行填充;
2.不封闭的图形将溢出到其外的封闭图区域,若其外没有封闭区域,以屏幕为封闭区域,填充整个屏幕;
3.点在图形外面,则填充封闭图形外的屏幕区域;
4.border的颜色值必须与图形边框颜色值相同。
文本输出函数
函数名: outtext
功 能: 在视区显示一个字符串
用 法: void far outtext(char far *textstring);
函数名: outtextxy
功 能: 在指定位置显示一字符串
用 法: void far outtextxy(int x, int y, char *textstring);
由于没有中文平台的支持,所以*textstring通常只能是英文字符串。
函数名: settextjustify
功 能: 为图形函数设置文本的对齐方式
用 法: void far settextjustify(int horiz, int vert);
outtextxy()函数指定了字符串输出的初始位置(x,y),可是,比如对于字符串"Game"来说,初始位置(x,y)到底是对应"G"的左上角、左下角还是中间这需要由settextjustify()函数来规定。
settextjustify()函数,将字符串按垂直方向可分为顶部, 中部和底部三个位置, 水平方向可分为左, 中, 右三个位置, 两者结合就有9个位置。请注意,这里的位置是针对字符串(如:Game)而不是第一个字母(如:G)而言的。
settextjustify()函数的第一个参数horiz是指水平方向,第二个参数vert是指垂直方向,两个参数都有3个值可供选择,其实也就是各自选择三个位置中的一个,二者以结合就确定了其中一个位置对应于初始位置(x,y)。函数中各个参数的规定见下列各表所示:
参数horiz和vert的取值 (修改):
符号常数 数值 用于
LEFT_TEXT 0 水平
RIGHT_TEXT 2 水平
BOTTOM_TEXT 0 垂直
TOP_TEXT 2 垂直
CENTER_TEXT 1 水平或垂直
配图
函数名: settextstyle
功 能: 为图形输出设置当前的文本属性
用 法: void far settextstyle ( int font, int direction, char size );
该函数用来设置输出字符的字形(由font确定)、输出方向(由direction确定)和字符大小(由charsize确定)等特性。函数中各个参数的规定见下列各表所示:
font的取值:
符号常数 数值 含义
DEFAULT_FONT 0 8*8点阵字(缺省值)
TRIPLEX_FONT 1 三倍笔划字体
SMALL_FONT 2 小号笔划字体
SANSSERIF_FONT 3 无衬线笔划字体
GOTHIC_FONT 4 黑体笔划字
direction的取值:
符号常数 数值 含义
HORIZ_DIR 0 从左到右
VERT_DIR 1 从底到顶
charsize的取值:
符号常数或数值 含义
1 8*8点阵
2 16*16点阵
3 24*24点阵
4 32*32点阵
5 40*40点阵
6 48*48点阵
7 56*56点阵
8 64*64点阵
9 72*72点阵
10 80*80点阵
USER_CHAR_SIZE=0 用户定义的字符大小
函数名: setusercharsize
功 能: 为矢量字体改变字符宽度和高度
用 法: void far setusercharsize( int multx, int dirx, int multy, int diry );
这个函数只有在settextstyle( ) 函数中的charsize为0(或USER_CHAR_SIZE)时才起作用。调用函数setusercharsize()后, 每个显示在屏幕上的字符都以其缺省大小乘以mulx/divx为输出字符宽, 乘以muly/divy为输出字符高。
附录D
时间延迟函数
函数名: delay
功 能: 将程序的执行暂停一段时间(毫秒)
用 法: void delay(unsigned milliseconds);
重画屏幕区域的函数
函数名:getimage
功 能:将指定区域的一个位图存到主存中
用 法:void far getimage( int left, int top, int right, int bottom, void far *bitmap);
函数名:putimage
功 能:在屏幕上输出一个位图
用 法:void far putimage( int x, int y, void far *bitmap, int op );
图像大小函数
函数名: imagesize
功 能: 返回保存位图像所需的字节数
用 法: unsigned far imagesize( int left, int top, int right, int bottom );
异或模式函数
函数名: setwritemode
功 能: 设置图形方式下画线的输出模式
用 法: void far setwritemode(int mode);
参数MODE可以被设置位COPY_PUT或者XOR_PUT两种模式。当mode被设置为XOR_PUT,其后的图形操作将都采用异或方式。此外之前提到的putimage()函数也可以采用异或模式向屏幕复制图像。
检测键盘输入函数
函数名: kbhit
功 能: 检查当前按下的键
用 法: int kbhit(void);
键盘接口函数
函数名: bioskey
功 能: 直接使用BIOS服务的键盘接口
用 法: int bioskey(int cmd);
该函数通过bois中断0x16执行键盘操作,由参数cmd来决定具体的操作。
Cmd 具体操作
0 读取按键的ascii码
1 测试是否有按键如果没有按键 返回0如果按键为ctrl+brk 返回-1如果是其他按键 返回按键本身键值(直到此按键被取出后恢复0)
2 返回shift key 状态
以下是当cmd为2的时候,返回值的具体含义
cmd返回值 触发特殊键
0X01 Left ctrl
0X02 Left alt
0X04 Right ctrl
0X08 Right alt
0X10 Scroll lock
0X20 Num lock
0X40 Caps lock
0X80 Sys rq
bioskey()函数的优点在于:
1.和kbhit()函数一样可以在不影响主程序运行的情况下检测是否有按键;
2.可以方便地检测普通键具体ASCII码和扫描码;
3.可以方便地检测功能键具体扫描码;
4.可以检测特殊按键;
5.只需要一个函数就能解决检测按键和读入按键的任务。