C语言图形编程.docx
- 文档编号:4469624
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:22
- 大小:185.76KB
C语言图形编程.docx
《C语言图形编程.docx》由会员分享,可在线阅读,更多相关《C语言图形编程.docx(22页珍藏版)》请在冰豆网上搜索。
C语言图形编程
C的图形编程
、屏幕显示模式
1、文本模式
在文本模式又称字符模式。
在此模式下整个屏幕被划分成(25行,80列),
共25*80个文本单元,每个单元包括一个字符和一个属性,字符即ASCII码字符,属性规定该字符的颜色和强度。
坐标原点在屏幕的左上角。
如下图所示:
°,1)
屏幕区
在vconio.h>头文件中定义了文本模式下一些函数常用的有;
(1)定义一个文本窗口
voidwindow(intleft,inttop,intright,intbottom);
如要定义一个窗口左上角在屏幕(20,5)处,大小为30列15行的窗口可写成:
window(20,5,50,25);
2)
文本窗口颜色的设置
voidtextbackground(intcolor);
//设置背景颜色
voidtextcolor(intcolor);
//设置字符颜色
有关颜色的定义见表1。
3)
光标定位
voidgotoxy(intx,inty);
4)
清屏
voidclrscr(void);
5)
其它函数
一、
窗口内文本的输出函数
intcprintf("<格式化字符串>",<变量表>);
intcputs(char*string);
intputch(intch);
cprintf()函数输出一个格式化的字符串或数值到窗口中。
它与printf()函数的用法完全一样,区别在于cprintf()函数的输出受窗口限制,而printf()函数的输出为整个屏幕。
cputs()函数输出一个字符串到屏幕上,它与puts()函数用法完全一
样,只是受窗口大小的限制。
putch()函数输出一个字符到窗口内。
二、窗口内文本的输入函数
intgetche(void);
getche()函数从键盘上获得一个字符,在屏幕上显示的时候,如果字符超过了窗口右边界,则会被自动转移到下一行的开始位置。
例1:
下面这个程序使用了关于窗口大小的定义、颜色的设置等函数,在一个屏幕上不同位置定义了7个窗口,其背景色分别使用了7种不同的颜色。
#include
#include
voidmain(void)
{inti;
char*c[]={"BLACK","BLUE","GREEN","CYAN","RED","MAGENTA","BROWN","LIGHTGRAY"};
textbackground(0);/*设置屏幕背景色*/
clrscr();/*清除文本屏幕*/
cputs(c[0]);
for(i=1;i<8;i++)
{window(10+i*5,5+i,30+i*5,15+i);/*定义文本窗口*/textbackground(i);/*定义窗口背景色*/
clrscr();
cputs(c[i]);/*清除窗口*/
}
getch();
}
表1.有关颜色的定义
符号常数
数值
含义
字符或背景
BLACK
0
黑
两者均可
BLUE
1
两者均可
GREEN
2
绿
两者均可
CYAN
3
青
两者均可
RED
4
红
两者均可
MAGENTA
5
洋红
两者均可
BROWN
6
棕
两者均可
LIGHTGRAY
7
淡灰
两者均可
DARKGRAY
8
深灰
只用于字符
LIGHTBLUE
9
淡兰
只用于字符
LIGHTGREEN
10
淡绿
只用于字符
LIGHTCYAN
11
淡青
只用于字符
LIGHTRED
12
淡红
只用于字符
LIGHTMAGENTA
13
淡洋红
只用于字符
YELLOW
14
黄
只用于字符
WHITE
15
白
只用于字符
BLINK
128
闪烁
只用于字符
例2:
捕获键盘按键。
键盘扫描码:
每个键都有一个两字节的扫描码,其格式:
High
Low
#defineESCOxOIIB
#defineUP0x4800
#defineDOWN0x5000#defineLEFT0x4B00
#defineRIGHT0x4D00
#defineENTER0x1C0D
在头文件vbios.h>中定义如下函数,用以捕获键盘按键。
intbioskey(intmode);〃此函数声明于bios.h
mode为1时,如有按键盘,则记录其扫描码至缓冲区,并返回其扫描码;无按键则返回0;不清除缓冲区。
mode为0时,从键盘缓冲区取出按键,并清除缓冲区。
若没有的话,贝U等待。
UP
DOWN
H8ghi
0
LEFT
H7gh
0
RIGHT
H7gh
0
F1
H5gh
0
F2
H6ghi
0
A
Hjghi
65
Z
H4gh
90
a
Hjghi
97
Hjghi
122
#include
#inlcude
unionkeyTest
{
intc;
charch[2];
};
voidmain(void)
{unionkeyTestk;
while
(1)
{while(bioskey
(1)==0);
/*function1returns0untilakeyispressed*/k.c=bioskey(0);
/*function0returnsthekeythatiswaiting*/printf(High=[%d],Low=[%d]\n”,k.c,k.ch[1],k.ch[0]);
}
}
例3:
C提供的随机函数:
voidrandomize();〃初始化随机数发生器
intrandom(intubound);//返回范围在0到ubound-1之间的一个随机整数。
2、图形模式
不同的显示器适配器(显卡)有不同的图形分辨率。
即是同一显卡,在
不同模式下也有不同分辨率。
因此,在屏幕作图之前,必须根据显卡种类将显示器设置成为某种图形模式。
016色640*200
116色640*350
216色640*480
1)图形模式的初始化
在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。
设置屏幕为图形模式,可用下列图形初始化函数:
voidinitgraph(int*gdriver,int*gmode,char*path);
表2.图形驱动器、模式的符号常数及数值
图形驱动器(gdriver)
图形模式(gmode)
一调分辨率
符号常数
数值
符号常数
数值
CGA
1
CGAC0
0
C0
320*200
CGAC1
1
C1
320*200
CGAC2
2
C2
320*200
CGAC3
CGAHI
3
4
C3
2色
320*200
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
用于硬件测试
例子1:
使用图形初始化函数设置VGA高分辨率图形模式#include
intmain()
intgdriver,gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode,"c:
\\tc");//图形模式初始化
bar3d(100,100,300,250,50,1);/*画一长方体*/
getch();
closegraph();//关闭图形模式,返回默认文本模式
return0;
}
例子2:
自动进行硬件测试后进行图形初始化有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,TurboC提供了一个自动检测显示器硬件后进行图形初始化的方法。
(2)退出图形状态
TurboC提供了函数closegraph(),其调用格式为:
voidfarclosegraph(void);
调用该函数后可退出图形状态而进入文本方式(TurboC默认方式),并释放用于保存图形驱动程序和字体的系统内存。
(3)屏幕颜色的设置和清屏函数
对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。
在TurboC中分别用下面两个函数。
voidfarsetbkcolor(intcolor);//设置背景色:
voidfarsetcolor(intcolor);//设置作图色:
其中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
白色
清除图形屏幕内容使用清屏函数,其调用格式如下:
(4).基本图形函数
基本图形函数包括画点,线以及其它一些基本图形的函数。
本节对这些函数作一全面的介绍。
一、画点
1.画点函数
voidfarputpixel(intx,inty,intcolor);
该函数表示有指定的象素画一个按color所确定颜色的点。
对于颜色color的值可从表3中获得而对x,y是指图形象元的坐标。
对VGA适配器,它的最高分辨率为640x480,屏幕的左上角坐标为(0,0),右下角坐
标为(639,479),关于点的另外一个函数是:
intfargetpixel(intx,inty);
它获得当前点(x,y)
的颜色值。
2.有关坐标位置的函数
intfargetmaxx(void);
//
返回x轴的最大值。
intfargetmaxy(void);
//
返回y轴的最大值。
intfargetx(void);
//
返回光标在x轴的位置。
voidfargety(void);
//
返回光标有y轴的位置
voidfarmoveto(intx,inty);
移动光标到(x,y)点,虽不是画点,在移动过程中亦画点。
voidfarmoverel(intdx,intdy);移动光标从当前位置(x,y)移动到(x+dx,y+dy)的位置,移动过程中不画点。
二、画线
1.画线函数
TURBOC提供了一系列画线函数,下面分别叙述:
voidfarline(intx0,inty0,intx1,inty1);
画一条从点(xO,yO)到(x1,y1)的直线。
voidfarlineto(intx,inty);画一从当前光标到点(x,y)的直线。
voidfarlinerel(intdx,intdy);
画一条从当前光标(x,y)到按相对增量确定的点(x+dx,y+dy)的直线。
voidfarcircle(intx,inty,intradius);
以(x,y)为圆心,radius为半径,画一个圆。
voidfararc(intx,inty,intstangle,intendangle,intradius);
以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。
在TURBOC中规定x轴正向为O度,逆时针方向旋转一周,依次为90,180,270和360度(其它有关函数也按此规定,不再重述)。
voidellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);以(x,y)为中心,xradius,yradius为x轴和y轴半径,从角stangle开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时,画出一个完整的椭圆。
voidfarrectangle(intx1,inty1,intx2,inty2);
以(x1,y1)为左上角,(x2,y2)为右下角画一个矩形框。
voidfardrawpoly(intnumpoints,intfar*polypoints);
画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。
polypoints整型数组必须至少有2倍顶点数个无素。
每一个顶点的坐标都定义为x,y,并且x在前。
值得注意的是当画一个封闭的多边形时,numpoints的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。
2.设定线型函数
线型包括:
宽度和形状。
其中宽度只有两种选择:
一点宽和三点宽。
而线的形状则有五种。
在没有对线的特性进行设定之前,TURBOC用其默认值,即一点宽的实线。
下面介绍有关线型的设置函数。
voidfarsetlinestyle(intlinestyle,unsignedupattern,intthickness);
该函数用来设置线的有关信息,其中linestyle是线形状的规定,见表5。
符号常数
数值
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
点宽
含义
实线
点线
中心线
点画线
用户定
含义
表5.有关线的形状(linestyle)
线型,
对于upattern,只有linestyle选USERBIT_LINE时才有意义(选其它
uppattern取0即可)。
此进uppattern的16位二进制数的每一位代表一个象素如果那位为1,则该象素打开,否则该象素关闭。
有关线型设定和画线函数的例子如下所示。
(5)封闭图形的填充
填充就是用规定的颜色和图模填满一个封闭图形。
一、先画轮廓再填充
TURBOC提供了一些先画出基本图形轮廓,再按规定图模和颜色填充整个封闭图形的函数。
在没有改变填充方式时,TURBOC以默认方式填充。
下面介绍这些函数。
voidfarbar(intx1,inty1,intx2,inty2);
确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图
模和颜色填充。
说明:
此函数不画出边框,所以填充色为边框。
voidfarbar3d(intx1,inty1,intx2,inty2,intdepth,inttopflag);
当topflag为非0时,画出一个三维的长方体。
当topflag为0时,三维图形不封顶,实际上很少这样使用。
说明:
bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。
voidfarpieslice(intx,inty,intstangle,intendangle,intradius);
画一个以(x,y)为圆心,radius为半径,stangle为起始角度,endangle为
终止角度的扇形,再按规定方式填充。
当stangle=0,endangle=360时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。
voidfarsector(intx,inty,intstanle,intendangle,intxradius,intyradius);
画一个以(x,y)为圆心分别以xradius,yradius为x轴和y轴半径,stangle为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。
、设定填充方式
TURBOCt四个与填充方式有关的函数。
下面分别介绍
voidfarsetfillstyle(intpattern,intcolor);
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
以间隔点填充
WIDE_DOT_FILL
10
以稀疏点填充
CLOSE_DOS_FILL
11
以密集点填充
USER_FILL
12
以用户定义式
样填充
除USER_FILL用户定义填充式样)以外,其它填充式样均可由
setfillstyle()函数设置。
当选用USER_FILL时,该函数对填充图模和颜色不作
任何改变。
之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。
voidfarsetfillpattern(char*upattern,intcolor);
设置用户定义的填充图模的颜色以供对封闭图形填充。
其中upattern是一个指向8个字节的指针。
这8个字节定义了8x8点阵的图形。
每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。
voidfargetfillpattern(char*upattern);该函数将用户定义的填充图模存入upattern指针指向的内存区域。
voidfargetfillsetings(structfillsettingstypefar*fillinfo);获得现行图模的颜色并将存入结构指针变量fillinfo中。
其中fillsettingstype结构定义如下:
structfillsettingstype{
intpattern;/*现行填充模式*/
intcolor;/*现行填充模式*/
};
三、任意封闭图形的填充截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对任意封闭图形进行填充。
为此,TURBOC提供了一个可对任意封闭图形填充的函数,其调用格式如下:
voidfarfloodfill(intx,inty,intborder);
其中:
x,y为封闭图形内的任意一点。
border为边界的颜色,也就是封闭图形轮廓的颜色。
调用了该函数后,将用规定的颜色和图模填满整个封闭图形。
1.如果x或y取在边界上,则不进行填充。
2.如果不是封闭图形则填充会从没有封闭的地方溢出去,填满其它地方。
3.如果x或y在图形外面,则填充封闭图形外的屏幕区域。
4.由bor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 图形 编程