第一讲C语言图形方式下的编程Word格式.docx
《第一讲C语言图形方式下的编程Word格式.docx》由会员分享,可在线阅读,更多相关《第一讲C语言图形方式下的编程Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
![第一讲C语言图形方式下的编程Word格式.docx](https://file1.bdocx.com/fileroot1/2022-12/12/2f18b89c-fade-469e-b009-02bd20418860/2f18b89c-fade-469e-b009-02bd204188601.gif)
颜色与灰度是衡量显示系统的重要参数。
单色显示器只有亮和暗两种灰度;
彩色显示器的颜色和灰度要受显示内存的限制,分辨率越高,颜色越丰富,所需要的显示内存就越多。
4.图形显示能力
图形显示能力是显示系统对屏幕上的每一个像素点都可以设置成不同的值的能力。
通常,图形显示对硬件的要求比字符显示要求高得多,同时,图形显示对显示缓冲区的要求也比字符显示时高得多。
显示卡的种类
常用的显示卡有以下几种
1.MDA卡
MDA卡(MonochromeDisplayAdapter——单色字符显示器适配卡)与单色字符显示器配接,它只支持字符显示功能,无图形功能。
2.HGC卡
HGC卡(HerculesGraphicsCard——单色显示图形卡)不仅支持字符显示,而且支持单色图形功能。
在图形方式下,其图形显示分辨率最高可达720~348点阵。
通过软件的设置,还可以支持640~400单色图形显示以及模拟CGA卡图形方式。
3.CGA卡
CGA卡(ColorGraphicsAdapter--彩色图形显示卡)支持字符/图形两种方式。
在字符方式下,它支持80列、25行及奶列、25行的方式,颜色可选16种。
但是字符的质量比较差,只有8X8点阵。
在图形方式下,它支持最大为640~200分辨率,但只有黑、白两种颜色。
此外,它还支持320~200的分辨率,每个像素点可以有四种颜色。
CGA卡有16K的显示缓冲区,用于显示字符及属性或图形方式下的图形数据。
4.EGA卡
EGA卡(EnhancedGraphicsAdapter——增强型图形显示卡)的字符显示能力和图形显示能力都比CGA卡有了较大的提高,显示分辨率达到640~350,最高分辨率图形方式的颜色达到了16种。
EGA卡的显示模式也比CGA卡丰富,并且兼容CGA卡及MDA卡的显示模式。
5.VGA卡
VGA卡(VideoGraphicsArray一一视频图形阵列)是一种功能十分强大、颜色丰富的显示卡。
VGA的标准分辨率可达到640~480,并且具有16种颜色。
一些兼容的VGA卡(如TVGA卡、EVGA卡)的分辨率可达640~480(256种颜色)、800~600(16种颜色)或1024~768(16种颜色)。
VGA卡兼容MDA卡、CGA卡、EGA卡的所有显示模式。
随着显示技术的发展,目前的显示卡的分辨率一般都可以达到1024X768,显示32位真彩(232种颜色)。
视频BIOS
视频BIOS(BasicI/OSystem基本输入/输出系统)是与显示卡配套的一个重要组成部分。
用户通过调用它可以完成一些与显示有关的控制功能。
对于要用到显示系统的一般程序设计都可以通过调用视频BIOs或视频函数库来完成。
但要想获得更高性能的显示程序,还需要对显示卡的寄存器和显示内存直接进行编程。
显示模式
显示模式按功能可以分为字符模式和图形模式两大类。
字符模式也称为字母数字模式,即A/N模式(A1phaNumbermode)。
在这种模式下,显示缓冲区中存放的是显示字符的代码和属性,而显示屏幕被分为若干个字符显示行和列。
图形模式(Graphicsmode)也称为APA模式(A1lPointsAddressablemode)。
在这种模式下,显示缓冲区中存放的是显示器屏幕上的每个像素点的颜色或灰度值,而显示屏幕被划分为像素行和像素列。
由于显示卡的种类很多,其中有些显示模式在不同类型的显示卡及不同厂家的显示卡之间是通用的,这类显示模式称为标准模式。
还有些模式是专用的,称为非标准模式。
通常,显示模式号小于14H的是标准模式;
其他则为非标准模式。
图形模式的初始化
不同的显示器适配器有不同的图形分辨率。
即使是同一显示器适配器,在不同模式下也有不同分辨率。
因此,在屏幕作图之前,必须根据显示器适配器的种类将显示器设置成为某种图形模式。
在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。
设置屏幕为图形模式,可用下列图形初始化函数:
voidfarinitgraph(intfar*gdriver,intfar*gmode,char*path);
其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。
图形驱动程序由TurboC出版商提供,文件扩展名为.BGI。
根据不同的图形适配器有不同的图形驱动程序。
例如对于EGA、VGA图形适配器的图形驱动程序为EGAVGA.BGI。
有时编程者并不知道所用的图形显示器适配器种类,而且我们为了将编写的程序可以用于不同图形驱动器,增强程序的通用性,我们通常不指定图形显示器适配器种类,而使用TurboC提供了一个自动检测显示器硬件的函数,其调用格式为:
voidfardetectgraph(int*gdriver,*gmode);
其中gdriver和gmode意义同上。
例1:
自动进行硬件测试后进行图形初始化
#include"
graphics.h"
main()
{
intgdriver,gmode;
detectgraph(&
gdriver,&
gmode);
/*自动测试硬件*/
printf("
driveris%d,modeis%d\n"
gdriver,gmode);
/*输出结果*/
getch();
initgraph(&
gmode,"
"
);
/*根据测试结果初始化图形*/
circle(320,240,50);
circle(320,240,80);
circle(320,240,110);
closegraph();
}
上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置。
其中,closegraph()为退出图形状态的函数,其调用格式为:
voidfarclosegraph(void);
调用该函数后可退出图形状态而进入文本方式,并释放用于保存图形驱动程序和字体的系统内存。
同时TurboC提供了一种更简单的初始化图形的方法,即用gdriver=DETECT语句后再跟initgraph()函数就行了。
比如,上例可改为例2的样子。
例2:
main()
intgdriver=DETECT,gmode;
屏幕颜色的设置
对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。
在Turboc中分别使用以下两个函数:
voidfarsetbkcolor(intcolor);
设置背景色
voidfarsetcolor(intcolor);
设置作图色
其中color为图形方式下颜色的规定数值,符号常数及数值如下所示。
符号常数
数值
含义
字符或背景
BLACK
黑
两者均可
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
闪烁
清除图形屏幕内容使用清屏函数,其调用格式如下
voidfarcleardevice(void);
有关颜色设置、清屏函数的使用请看例3。
例3:
stdio.h"
intgdriver,gmode,i,j;
gdriver=DETECT;
/*图形初始化*/
setbkcolor(0);
/*设置图形背景*/
cleardevice();
for(i=0;
i<
=15;
i++)
{
setcolor(i);
/*设置不同作图色*/
circle(319,239,20+i*15);
/*画半径不同的圆*/
delay(3000);
/*延迟3000毫秒*/
}
setbkcolor(i);
/*设置不同背景色*/
for(j=0;
j<
j++)
setcolor(j);
circle(319,239,20+j*15);
另外,TURBOC也提供了几个获得现行颜色设置情况的函数。
intfargetbkcolor(void);
返回现行背景颜色值。
intfargetcolor(void);
返回现行作图颜色值。
intfargetmaxcolor(void);
返回最高可用的颜色值。
基本图形函数
基本图形函数包括画点,线以及其它一些基本图形的函数。
本节对这些函数作一全面的介绍。
画点
1.画点函数voidfarputpixel(intx,inty,intcolor);
该函数表示有指定的象元画一个按color所确定颜色的点。
对于颜色color的值可从上表中获得而对x,y是指图形象元的坐标。
在图形模式下,是按象元来定义坐标的。
对VGA适配器,它的最高分辨率为640x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。
屏幕的左上角坐标为(0,0),右下角坐标为(639,479),水平方向从左到右为x轴正向,垂直方向从上到下为y轴正向。
TURBOC的图形函数都是相对于图形屏幕坐标,即象元来说的。
关于点的另外一个函数是:
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);
画一条从点(x0,y0)到(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轴正向为0度,逆时针方向旋转一周,依次为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用其默认值,即一点宽的实线,但TURBOC也提供了可以改变线型的函数。
线型包括:
宽度和形状。
其中宽度只有两种选择:
一点宽和三点宽。
而线的形状则有五种。
下面介绍有关线型的设置函数。
voidfarsetlinestyle(intlinestyle,unsignedupattern,intthickness);
该函数用来设置线的有关信息,其中linestyle是线形状的规定,
见下表:
有关线的形状(linestyle)
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数数值含义
─────────────────────────
SOLID_LINE0实线
DOTTED_LINE1点线
CENTER_LINE2中心线
DASHED_LINE3点画线
USERBIT_LINE4用户定义线
━━━━━━━━━━━━━━━━━━━━━━━━━
有关线宽(thickness)
thickness是线的宽度,见下表。
NORM_WIDTH1一点宽
THIC_WIDTH3三点宽
对于upattern,只有linestyle选USERBIT_LINE时才有意义(选其它线型,uppattern取0即可)。
此进uppattern的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,否则该象元关闭。
voidfargetlinesettings(structlinesettingstypefar*lineinfo);
该函数将有关线的信息存放到由lineinfo指向的结构中,表中linesettingstype的结构如下:
structlinesettingstype
{
intlinestyle;
unsignedupattern;
intthickness;
}
例如下面两句程序可以读出当前线的特性structlinesettingstype*info;
getlinesettings(info);
voidfarsetwritemode(intmode);
该函数规定画线的方式。
如果mode=0,则表示画线时将所画位置的原来信息覆盖了(这是TURBOC的默认方式)。
如果mode=1,则表示画线时用现在特性的线与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定的线进行异或后的结果。
因此,当线的特性不变,进行两次画线操作相当于没有画线。
封闭图形的填充
填充就是用规定的颜色和图模填满一个封闭图形。
1.先画轮廓再填充
TURBOC提供了一些先画出基本图形轮廓,再按规定图模和颜色填充整个封闭图形的函数。
在没有改变填充方式时,TURBOC以默认方式填充。
下面介绍这些函数。
voidfarbar(intx1,inty1,intx2,inty2);
确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模和颜色填充。
说明:
此函数不画出边框,所以填充色为边框。
voidfarbar3d(intx1,inty1,intx2,inty2,intdepthinttopflag);
当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为终止角的椭圆扇形,再按规定方式填充。
2.设定填充方式
TURBOC有四个与填充方式有关的函数。
下面分别介绍:
voidfarsetfillstyle(intpattern,intcolor);
color的值是当前屏幕图形模式时颜色的有效值。
pattern的值及与其等价的符号常数如下表所示。
关于填充式样pattern的规定:
━━━━━━━━━━━━━━━━━━━━━━━━━━━
───────────────────────────
EMPTY_FILL0以背景颜色填充
SOLID_FILL1以实填充
LINE_FILL2以直线填充
LTSLASH_FILL3以斜线填充(阴影线)
SLASH_FILL4以粗斜线填充(粗阴影线)
BKSLASH_FILL5以粗反斜线填充(粗阴影线)
LTBKSLASH_FILL6以反斜线填充(阴影线)
HATCH_FILL7以直方网格填充
XHATCH_FILL8以斜网格填充
INTTERLEAVE_FILL9以间隔点填充
WIDE_DOT_FILL10以稀疏点填充
CLOSE_DOS_FILL11以密集点填充
USER_FILL12以用户定义式样填充
除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);
获得现行图模的颜色并将存入结构指针变量fillinf