版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章*图形设计11.1图形处理基本概念11.2文本模式下的图形处理11.3图形模式下的图形处理习题11
本章学习要求:
1.了解图形处理的基本概念,了解文本模式、图形模式,理解图形模式的
定义。
2.掌握文本模式下颜色的设置、文本的输出、文本图形处理,掌握图形系统初始化,绘图函数的使用,图形动画设计。
图形设计在计算机应用领域占有很重要的地位,它广泛应用于计算机辅助设计、计算机辅助制造、医学等领域,即使是软件本身也越来越多地以图形界面进行人机交互。各种微机上的C语言都提供了图形处理功能,事实上,各自的标准库函数中大部分是图形处理函数。不同的C编译系统,图形功能可能有些差别,相同功能所用的库函数名也可能不一样,但它们的处理方法基本上是一致的。本章以TurboC
2.0作为工作环境,介绍图形程序的设计。
11.1.1图形处理与显示适配器
计算机中的图形显示都需经过显示适配器(又称显卡)的处理才能输出到显示器上,显示适配器在图形处理中有着重要的作用。由于显示适配器的不同,所支持的图形模式也不同,下面介绍一下TurboC2.0所支持的显示适配器类型。11.1图形处理基本概念
1. CGA
CGA是PC/XT等微机配置的彩色图形适配器,它可以显示单色或彩色字符和图形。
在图形方式下,TurboC支持两种分辨率:一种是高分辨率方式(CGAHI),这种方式分辨率可达640
×
200像素,达到这种最高分辨率时,背景色是黑色(也可以重新设置),前景色可以选择一种(也只能选择一种),因此图形只显示两种色彩(即前景色和背景色);另一种是中分辨率显示方式,这种方式分辨率可达320
×
200像素,其背景色和前景色均可由用户选择,但仅能显示4种颜色。因此,可以有4种颜色模式供选择,即CGAC0、CGAC1、CGAC2和CGAC3,主要区别是显示的4种颜色不同。
2. EGA
EGA是一种增强图形适配器,它除了能支持CGA的4种显示模式外,TurboC中支持两种分辨率:一种是低分辨率方式(EGALO),分辨率为640×200像素的16色显示方式;另一种是高分辨率显示方式(EGAHI),分辨率为640×350像素的16色显示方式。
3. VGA
VGA是目前流行的显示标准,称为视频图形阵列适配器,它支持CGA、EGA的所有显示方式,同时还有640
×
480像素的高分辨率显示方式(VGAHI),还支持640
×
350像素的中分辨率显示方式(VGAMED)和620
×
200像素的低分辨率显示方式(VGALO),它们均可达到16种显示颜色。
4. MCGA
MCGA的功能与CGA相似,它和CGA部分兼容,但有些功能又和VGA类似,它有640
×
480像素的2色模式。
5. IBM8514
IBM8514适配器有较强的图形功能,最高分辨率可达1024
×
768像素,有256种颜色。
6. EGAMONO
EGAMONO(单色适配器)是一种640
×
350像素单色显示模式。
其他TurboC支持的适配器及其显示模式参见后面的表11.3。11.1.2文本模式
文本模式是显示文本字符的一种显示方式,它显示的是字符,而在图形模式下,显示的是像素。
在文本模式下绘图时需要对显示字符的位置进行定位,这种定位是由坐标系统来决定的,由于是文本显示模式,要控制字符的位置就可以用字符显示时的行、列为设置坐标的单位。
在缺省方式下,TurboC规定屏幕坐标为每屏80列25行,屏幕的左上角为第1行第1列,右下角为第25行第80列,如图11.1所示。
图11.1文本模式坐标系统在TurboC中除了缺省的80列25行显示方式外,还提供了其他文本显示方式(见后面的表11.1)。
在文本模式下,可以显示各种字符,可以控制字符的色彩、亮度和背景色等。TurboC中还提供了很多在文本模式下进行屏幕处理的函数,这些函数在使用时需要包含头文件“conio.h”。11.1.3图形模式
在图形模式下,显示的基本单位是像素,像素作为图形处理的基本单位,在屏幕上显示为一个点(又称像素点)。屏幕上像素的数目就是我们常说的屏幕分辨率,分辨率的高低取决于显示适配器、显示器和屏幕显示模式。
显示图形时,也可以通过屏幕坐标系统来决定像素点的位置,在屏幕坐标系统中,以左上角为坐标原点,x轴向右,y轴向下,原点坐标为(0,0),如图11.2所示。如:(310,195)表示第310列第195行处像素的坐标。
图11.2图形屏幕坐标系统在程序设计中使用像素时,必须先初始化屏幕,其中必须指定图形模式,TurboC中使用到的图形模式参见后面的表11.3。11.1.4设计图形程序的步骤
利用C语言设计的图形程序,通常具有以下程序框架:
(1)确定图形显示方式,即图形模式的初始化。
(2)设置屏幕的背景色和前景色等属性。
(3)利用图形函数,在规定的坐标位置上画图形或写文字。
(4)在一些封闭的图形区域填充颜色。
(5)关闭图形的显示方式。
在文本模式下,Turbo
C提供了一系列屏幕处理函数,这些函数包含在头文件“conio.h”中。11.2文本模式下的图形处理11.2.1文本模式设置
文本模式的设置可以通过函数textmode()来实现。该函数的使用格式如下:
textmode(intmode);
其中:参数mode是将要设置的文本模式,可以取的参数值如表11.1所示。
表11.1文本模式在使用函数textmode()时,参数mode可以是文本模式名,也可以是文本模式代码。例如,下面的程序代码都是设置文本模式为彩色、40
×
25。
textmode(1);
textmode(C40);11.2.2颜色设置
在文本模式下,如果使用了彩色的文本模式,就可以设置输出时的文本颜色及背景颜色,这些设置可以由相应的函数完成。
1.文本颜色设置
文本颜色可以由函数textcolor()来设置。该函数的功能是:设置显示文本的前景色,也就是字符的颜色。该函数使用格式如下:
textcolor(intcolor);
参数color是将要设置的颜色,可以取的参数值如表11.2所示。
表11.2屏幕颜色表可以使用颜色常量或数值来设置文本颜色,例如:
textcolor(GREEN);
textcolor(2);
上面的两行语句都可以设置文本的前景色为绿色。
2.文本背景颜色设置
除了可以设置文件的前景色外,还可以设置文本的背景色,文本的背景色由函数textbackground()来设置。该函数使用格式如下:
textbackground(intcolor);
其中:参数color是将要设置的颜色,可使用的参数值为表11.2中的前8种(即数值为0~7)。
3.文本属性设置
文本颜色设置函数textattr()可用于设置文本的属性,包括前景色、背景色,以及字符显示时是否闪烁、是否加亮。该函数使用格式如下:
textattr(intattr);
其中:参数attr使用一个字节来描述文本的属性,各位的含义如图11.3所示。
图11.3文本属性字节的含义从图中可以看出,低4位(0~3位)用来设置字符显示的颜色(前景色),对应取的颜色值为0~15;第4~6位用于设置背景色;最高位设置显示出的字符是否闪烁。
设置文本属性时,可以通过位运算来控制颜色设置到字节的具体位。例如,下面的语句将设置黄色背景下的红色字符:
textattr(RED+(YELLOW<<4));
下面的语句将设置白色背景下的绿色闪烁字符:
textattr(GREEN+BLINK+(WHITE<<4));
4.文本亮度设置
TurboC中提供了三个设置文本亮度的函数,分别如下:
highvideo(); /*用于设置文本为高亮显示*/
lowvideo(); /*用于设置文本为低亮显示*/
normvideo(); /*用于设置文本为正常亮度*/11.2.3文本输出
文本窗口是文本模式下在屏幕上定义的一个矩形区域,在文本窗口定义后,如果要在屏幕上显示文本信息,将只显示在这个窗口中,而不能输出到窗口以外的区域。默认情况下,窗口就是整个屏幕。
1.文本窗口的设置
使用window()函数可以将全屏幕窗口设置成指定大小的窗口。其使用格式如下:
window(intleft,inttop,intright,intbottom);
其中:(left,top)是窗口左上角的坐标,而(right,bottom)是窗口右下角的坐标。
一旦窗口定义好,前面的textcolor()、textbackground()和textattr()函数将只对窗口有效,窗口以外的区域不受影响。
2.文本的输出
以前我们学过的printf()、puts()和putchar()等函数都是以全屏幕为窗口进行输出的,如果要以自定义的窗口为输出对象,则需要使用文本窗口下的输出函数,它们分别是:
cprintf(char*format,表达式表列);
cputs(char*str);
putch(intch);
这三个函数的功能相当于printf()、puts()和putchar(),用法也相同,只是它们以窗口作为输出对象,而不是全屏幕。
3.屏幕清除
在图形绘制中经常需要将屏幕或窗口中原来的输出清除掉,为此,TurboC提供了文本方式下对屏幕进行清除的函数,分别如下:
clrscr();
clreol();
delline();
clrscr()函数将整个窗口或屏幕中的文本全部清除,并将光标移到窗口/屏幕左上角,如果在执行该函数前设置过文本颜色、背景颜色或文本属性,则清屏后这些设置将生效。
clreol()函数将当前文本从光标位置开始到本行结束的所有字符都清除,但不改变光标位置。
delline()函数将清除光标所在行的所有字符。
例11.1
显示彩色文本。
#include<stdio.h>
#include<conio.h> /*将文本模式处理函数头文件包 含进来*/
main()
{
charstr[80]="彩色文字";
textmode(C80); /*设置文本模式*/
textcolor(YELLOW); /*设置文本颜色*/
textbackground(CYAN); /*设置背景色*/
clrscr();
window(5,1,20,4); /*设置窗口*/
textcolor(RED); /*设置文本颜色*/
clrscr();
cprintf("\n%s\n",str); /*输出字符串*/
window(25,1,40,4);
textbackground(BLUE); /*设置背景色*/
clrscr();
cprintf("\n%s\n",str); /*输出字符串*/
window(45,1,60,4);
textattr(BLACK+(WHITE<<4)); /*设置文本属性*/
clrscr();
cprintf("\n%s\n",str); /*输出字符串*/
getch(); /*等待按键*/
}
程序执行时显示结果如图11.4所示。
程序中的语句“getch();”是暂停程序向下执行,当按任意键才继续执行,常用来让运行程序停留在输出界面。
图11.4显示结果
4.光标定位
前面学习的几种输出函数都是从当前行当前光标位置顺序输出,不能满足绘图的需要。为了能在窗口的指定位置输出,可以使用gotoxy()函数。该函数的使用格式如下:
gotoxy(intx,inty);
gotoxy()函数的功能是:将光标移动到坐标(x,y)位置,并以此位置作为当前的输出位置。注意:这里的(x,y)是相对当前窗口而言的。例11.2
文字字幕。
本例实现了在文本模式下移动文本,将像电影中的字幕一样。
#include<conio.h> /*将文本模式处理函数头文件包 含进来*/
main()
{inti,k=1;
charstr[80]="TurboC2.0";
textmode(C80); /*设置文本模式*/
window(1,1,80,4); /*设置窗口*/
textcolor(RED); /*设置文本颜色*/
textbackground(BLUE); /*设置背景色*/
clrscr(); /*清除整个窗口*/
i=1;
while(1)
{delay(10000); /*设置延时*/
if(i>70){i=i%70;k++;} /*循环移动文本,k为循环 次数*/
gotoxy(i,2); /*设置光标位置*/
delline(); /*清除当前行所有字符*/
cprintf("%s",str); /*输出文本*/
i++;
if(k>10)break; /*当循环10次后将结束*/
}
getch(); /*暂停程序执行,直到按任意键后继续*/
}
程序运行时可以看到字符串“TurboC2.0”文字在定义的窗口(蓝底、红字)中从左到右循环移动,一共移动10次。11.2.4文本图形处理
在ASCII码和扩展ASCII码中有一些字符图形,如果要在屏幕上输出一些文本图形,就要使用这些图形字符。在文本模式下,要想输出这些字符图形,只需要使用putch()函数将ASCII码输入即可,例如:
putch('8'); /*向屏幕输出一个字符8*/
putch(0x01); /*向屏幕输出一个小笑脸图形*/
在输出之前可以使用gotoxy()函数将光标定位到需要输出图形的位置,再将字符图形输出。
1.文本图形的移动函数
函数movetext()可以将指定矩形区域中的文本复制到一个新的位置。该函数的使用格式如下:
movetext(intx1,inty1,intx2,inty2,intx3,inty3);
movetext()函数的功能是:将左上角为(x1,y1)、右下角为(x2,y2)的矩形区域复制到以(x3,y3)为左上角坐标的新位置,并且,原矩形区域内的图形不会改变。
需要注意的是,movetext()函数中的坐标是以全屏幕为坐标系统的,而与窗口无关。
例11.3
文本图形移动举例。
#include<conio.h> /*将文本模式处理函数头 文件包含进来*/
main()
{
charstr[80]="移动区域";
textmode(C80); /*设置文本模式*/
window(1,1,80,25); /*设置窗口*/
clrscr();
textcolor(RED); /*设置文本颜色*/
textbackground(CYAN);
/*设置背景色*/
cprintf("%s",str);
/*输出文本*/
movetext(1,1,10,1,10,10);
/*将(1,1)~(10,1)矩形区域 复制到(10,10)为左上角的新位置*/
movetext(1,1,10,1,20,15);
/*将(1,1)~(10,1)矩形区域 复制到(20,15)为左上角的新位置*/
movetext(1,1,10,1,30,20);
/*将(1,1)~(10,1)矩形区域 复制到(30,20)为左上角的新位置*/
getch();
/*暂停程序执行,直到按任意 键后继续*/
}
2.文本图形的存取函数
文本图形可以存储起来以供多次使用,例如,当某部分区域被掩盖后需要重新绘制时,TurboC中可以使用函数gettext()来存取文本图形。该函数的使用格式如下:
gettext(intx1,inty1,intx2,inty2,void*buffer);
gettext()函数可以将左上角为(x1,y1)、右下角为(x2,y2)的矩形区域内的文本图形存储到buffer指向的缓冲区,在存储时,矩形内的文本图形按字符从上向下、从左向右连接并存储到缓冲区内。在调用该函数前应先计算出所需缓冲区的大小,由于屏幕上一个字符需要占用2个字节的存储空间,即1个字节存储ASCII码,另1个字节存储文本属性。因此计算缓冲区大小可以用下面的公式:
缓冲区字节数
=
矩形行数
×
矩形列数
×
2
矩形行数
=
y2
-y1
+
1
矩形列数
=
x2
-x1
+
1使用gettext()函数存储在缓冲区内的文本图形可以使用puttext()函数读出,puttext()函数的使用格式如下:
puttext(intx1,inty1,intx2,inty2,void*buffer);
puttext()函数完成的功能是:将buffer指向的存储缓冲区内的文本图形显示到左上角为(x1,y1)、右下角为(x2,y2)的矩形区域中。
3.状态查询
如果需要知道当前屏幕的显示方式、窗口的坐标、光标位置和文本属性等,就需要使用gettextinfo()函数,该函数的使用格式如下:
gettextinfo(structtext_info*f);
该函数在执行时,将获得的信息存储到指针f所指向的结构体变量中。Structtext_info结构类型在头文件conio.h中有定义,其成员结构的含义如下:
structtext_info
{
unsignedcharwinleft; /*窗口左上角x坐标*/
unsignedcharwintop; /*窗口左上角y坐标*/
unsignedcharwinright; /*窗口右下角x坐标*/
unsignedcharwinbottom; /*窗口右下角y坐标*/
unsignedcharattribute; /*文本属性*/
unsignedcharnormattr; /*默认属性*/
unsignedcharcurrmode; /*当前文本模式*/
unsignedcharscreenheight; /*屏幕高度*/
unsignedcharscreenwidth; /*屏幕宽度*/
unsignedcharcurx; /*当前光标x坐标*/
unsignedcharcury; /*当前光标y坐标*/
};
尽管使用gettextinfo()函数可以得到当前光标位置的坐标,但光标位置查询在图形输出中用得最多。因此,TurboC还提供了两个光标位置查询的函数,即
intwherex(); /*返回光标所在x坐标*/
intwherey(); /*返回光标所在y坐标*/例11.4获取当前屏幕文本信息。
#include<stdio.h>
#include<conio.h> /*将文本模式处理函数头文件包 含进来*/
main()
{structtext_infoinfo;
textmode(C80);
textattr(WHITE+(BLUE<<4));
window(1,1,60,25);
clrscr();
gettextinfo(&info); /*获取屏幕文本信息放入info结构 体变量中*/
printf("屏幕文本信息\n\n");
printf("窗口左上角坐标为:(%d,%d)\n",info.winleft,info.wintop);
printf("窗口右下角坐标为:(%d,%d)\n",info.winright,info.winbottom);
printf("当前文本模式为:%d\n",info.attribute);
printf("当前屏幕高度为:%d\n",info.screenheight);
printf("当前屏幕宽度为:%d\n",info.screenwidth);
printf("当前光标位置为:(%d,%d)\n",wherex(),wherey()); /*获取光标位置信息*/
printf("当前光标位置为:(%d,%d)\n",info.curx,info.cury); /*获取光标位置信息*/
getch(); /*暂停程序执行,直到按 任意键后继续*/
}程序运行结果如图11.5所示,试想一下:为什么最后一行输出的是(1,1),而不与倒数第二行输出的一样呢?主要是因为用gettextinfo()函数时光标定位就在(1,1),后来光标随着输出而移动了,但并没有更新info.curx、info.cury中的值。
还有一个问题,如果本例中不用printf()函数,而改用cprintf()函数,会有什么样的结果呢?(提示:cprintf()函数是从当前光标位置处开始输出。)
图11.5程序运行结果
在文本模式下,存在屏幕的行列数太少、图形字符比较少等弱点,并且看起来的效果也不太好,因此,对于要求复杂、精确、漂亮的图形,一般都在图形模式下绘制。TurboC中提供了丰富的图形函数库,它包括图形库文件graphics.lib、图形函数头文件graphics.h和许多以BGI(图形接口)为后缀的显示适配器的驱动程序,如EGAVGA.BGI、CGA.BGI等。11.3图形模式下的图形处理11.3.1图形系统的初始化
在TurboC中默认的是文本方式,因此在进行图形绘制前要先进行图形系统的初始化,并且在绘图结束后还要将其关闭,还原回文本方式。
1.图形模式的检测
如果对当前显示器的型号和分辨率模式不清楚,可以使用detectgraph()函数对图形模式进行检测。
detectgraph()函数的使用格式如下:
detectgraph(intfar*graphdriver,intfar*graphmode);
其中:参数graphdriver为取得的图形适配器类型,graphmode为分辨率模式。函数执行时,将检测到的图形适配器类型赋给graphdriver,将检测到的该类型适配器所支持的最高分辨率模式赋给graphmode。参数far表示长指针,这与程序的存储模式有关,TurboC中支持多种类型的存储模式,比如:极小型、小型、中型、紧凑型、大型和特大型。只有极小型和小型是用near指针(16位),其他三种存储模式使用far指针(32位)。关于各种指针的使用,请参考相关专业书籍。本书介绍的程序均为near型指针,由于是小程序,因此可省略指针修饰,所以detectgraph()函数在使用时可省略成下面的格式:
detectgraph(&graphdriver,&graphmode);
TurboC中支持的图形适配器和图形模式见表11.3。
表11.3常用图形适配器及图形模式续表2.图形模式的初始化
图形模式的初始化是指选择某一与所用显示器和显卡相适应的模式,使显示器按与该模式对应的分辨率显示图形或字符。图形模式的初始化是图形程序设计的前提,这一工作是由initgraph()函数完成的。该函数的格式如下:
initgraph(int*gdriver,int*gmode,char*path);
initgraph()函数的功能是:从指定的磁盘目录路径中装入一个图形驱动程序来初始化图形系统,并将显示器设置成具有一定分辨率及可显示的颜色数和可存储图形的显示页数的图形模式。参数gdriver为调用的图形驱动程序(.bgi)。TurboC系统中的*.bgi文件是各种显示器的驱动程序。使用不同的显示系统,要装入不同的图形驱动程序。gdriver的常用代码及其含义见表11.3,其代码可以使用符号常量或数值表示。
参数gmode为图形模式,其代码见表11.3。
参数path为图形驱动程序的存储路径,该参数可省略(用""表示),此时在系统当前目录下查找驱动程序。特别注意,该函数中的三个形参都是指针,因此在引用时实参要用地址值。在使用本函数和其他所有图形函数时,要注意显示器的驱动程序*.bgi是不可缺少的。另外,*.chr文件是笔画的字符模型,同样也不可缺少。并要求TurboC2.0主菜单的Options功能项中的Linker-Graphicslibrary要选取on,程序才能可靠地连接运行。在某些情况下,还可以使用DETECT常量让系统在初始化时自动检测,例如:
intdriver=DETECT;
intmode;
initgraph(&driver,&mode);
…
上面的程序段将自动检测适配器,并以检测到的适配器的最高分辨率模式进行初始化。
3.清除屏幕
在绘图前,通常都需要将屏幕进行清理,以便绘图,这就要使用函数cleardevice()。该函数的使用格式如下:
cleardevice();
cleardevice()函数的功能是清除整个屏幕上的内容。
4.关闭图形模式
当进入图形模式并完成图形处理以后,必须要退出图形状态,返回文本模式(默认方式),并释放用于保存图形驱动程序和字体的系统内存。TurboC中提供了closegraph()函数来完成这一功能。该函数的使用格式如下:
closegraph();11.3.2绘图函数
1.屏幕颜色的设置
屏幕颜色可分为背景色和前景色。在设置屏幕颜色时,可以使用下面两个函数:
setcolor(intcolor);/*用于设置前景色,即画笔颜色*/
setbkcolor(intcolor);/*用于设置背景色*/
其中:color为颜色的规定数值,可取的颜色值见表11.4。
表11.4绘图颜色表注意:
(1)系统默认背景色为黑色(color值为0),前景色为白色(color值为15),即黑底白字。
(2)背景色和前景色不要采用相同或相近的颜色。
2.画点
点的绘制由putpixel()函数完成。该函数的使用格式如下:
putpixel(intx,inty,intcolor);
putpixel()函数的功能是:在坐标(x,y)处用color指定的颜色绘制一个点。color的取值见表11.4。
如果要想取得某一点的颜色,可使用函数getpixel()来完成,该函数的使用格式如下:
intgetpixel(intx,inty);
该函数用于获取并返回(x,y)这一点的颜色值。
3.画直线
画直线的函数有多个,分别如下:
line(intx0,inty0,intx1,inty1); /*从点(x0,y0)到点(x1,y1) 绘制一条直线*/
lineto(intx,inty); /*从当前位置(CP)到点 (x,y)绘制一条直线*/
linerel(intdx,intdy); /*从当前位置(CP)按相对 增量dx、dy绘制一条直线*/在绘图时,有一支看不见的“画笔”,该画笔所指的位置称为当前位置(CP)。图形系统初始化时,画笔总是指向左上角的坐标原点(0,0),但随着图形的绘制,当前位置会不断变动。上面三个函数在绘图时,line()函数不改变CP的位置,即CP仍在原位置;而lineto()和linerel()函数会将CP移到线条的尾部。在画直线时,线条的颜色由setcolor()函数指定,还可以用setlinestyle()函数设定线条的线型,该函数的使用格式如下:
setlinestyle(intlinestyle,unsignedupattern,intthickness);
其中:参数linestyle的取值如表11.5所示,默认为实线。但该参数不影响圆、圆弧、椭圆和扇形的线型。
表11.5linestyle的线型代码表参数thickness是指线的宽度,默认线宽为一个像素宽,还可以取三个像素宽,见表11.6。但该参数影响圆、圆弧、椭圆和扇形的线型。表11.6线宽代码表参数upattern仅在用户定义线型时才有意义(其他情况下upattern取值为0)。该参数是一个16位的二进制码,用于决定16位像素中的某一位是否被显示。若某一位为1,则该位像素显示,为0则不显示。例如:101010101010则表示间隔像素显示,即画一条点线。
4.坐标的检测与定位
在TurboC系统中可以使用getx()函数和gety()函数来获取当前CP的位置,还可以使用moveto()和moverel()函数来重新定位CP。这几个函数的使用格式如下:
intgetx(); /*返回画笔在x轴的位置*/
intgety(); /*返回画笔在y轴的位置*/
moveto(intx,inty); /*将CP位置移到(x,y)*/
moverel(intdx,intdy); /*将CP位置移到(x+dx,y+dy)位置 */
intgetmaxx();/*返回当前图形驱动程序和模式下的屏幕 最大x值*/
intgetmaxy();/*返回当前图形驱动程序和模式下的屏幕最大y值*/
5.画其他图形
1)画矩形
(1)
rectangle()函数可以画矩形框,使用格式如下:
rectangle(intx1,inty1,intx2,inty2);
rectangle()函数将在以(x1,y1)为左上角、(x2,y2)为右下角的矩形区域内画一个空心的矩形框。
(2)
bar()函数可以画实心矩形,使用格式如下:
bar(intx1,inty1,intx2,inty2);
bar()函数将在以(x1,y1)为左上角、(x2,y2)为右下角的矩形区域内画一个实心的矩形框。矩形内部的填充模式和颜色可以使用后面要讲到的填充函数。
(3)
bar3d()函数可以画三维立体图,使用格式如下:
bar3d(intx1,inty1,intx2,inty2,intdepth,inttopflag);
该函数以(x1,y1)为左上角,(x2,y2)为右下角,深度为depth,画一正面填充的三维立体图。当topflag
=
0时,三维图形不封顶。其中,第三维的方向始终为45°。
2)画圆、椭圆、圆弧与扇形
(1)
circle()函数可以画圆,使用格式如下:
circle(intx,inty,intradius);
该函数以(x,y)为圆心,以radius为半径画一个圆形。
(2)
ellipse()函数可以画椭圆,使用格式如下:
ellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);
该函数在(x,y)为中心,以xradius和yradius为x轴和y轴半径,从起始角stangle到endangle角结束,画一椭圆弧线。
当设置stangle为0、endangle为360时,绘制的是一个完整椭圆,否则绘出的是椭圆弧。
(3)
arc()函数可以画圆弧,使用格式如下:
arc(intx,inty,intstangle,intendangle,intradius);
该函数以(x,y)为中心,以radius为半径,从起始角stangle到endangle角结束,绘制圆弧。
(4)
pieslice()函数可以画扇形,使用格式如下:
pieslice(intx,inty,intstangle,intendangle,intradius);
该函数以(x,y)为圆心,radius为半径,stangle为起始角度,endangle为终止角度,画一被填充过的扇形。当stangle=0、endangle=360时,画出一个实心圆,并在圆内从圆点沿x轴正向画一条半径。
(5)
fillellipse()函数可画封闭椭圆,使用格式如下:
fillellipse(intx,inty,intxradius,intyradius);
该函数将以(x,y)为中心,以xradius和yradius为x轴和y轴半径,绘制封闭的椭圆。图形内部的填充模式和颜色可以使用相关函数进行设置,如没有设置,则使用缺省模式。
(6)
sector()函数可画椭圆扇形,使用格式如下:
sector(intx,inty,intstangle,intendangle,intxradius,intyradius);
该函数将以(x,y)为中心,以xradius和yradius为x轴和y轴半径,从起始角stangle到endangle角结束,绘制椭圆扇形。
(7)
drawpoly()函数可画多边形,使用格式如下:
drawpoly(intnumpoint,intfar*polypoints);
该函数用于画一个顶点数为numpoint的多边折线,参数polypoints是存放numpoint个顶点坐标的整形数组。在数组中,各顶点坐标按x1,y1,x2,y2,…存放。如果绘制的是封闭图形,则第一个顶点与最后一个顶点的坐标相同。
(8)
fillpoly()函数可画填充多边形,使用格式如下:
fillpoly(intnumpoint,intfar*polypoints);
该函数将绘制一顶点数为numpoint、各顶点坐标由polypoints给出的多边形。所绘出的多边形的边数为numpoint-1,如果绘制的是封闭图形,则第一个顶点与最后一个顶点的坐标相同。
6.图形填充
在默认情况下,绘制出的封闭图形都是单白色实填充,如果需要设置填充样式和填充色,则可以使用setfillstyle()函数来实现,该函数格式如下:
setfillstyle(intpattern,intcolor);
其中:参数pattern为填充样式,可以选择的样式如表11.7所示;参数color为填充色,见表11.5。
表11.7填充样式如果选择了USER_FILL参数,则用户可以自定义填充样式进行填充,用户自定义样式由setfillpattern()函数设定,格式如下:
setfillpattern(char*upattern,intcolor);
该函数用于设置用户自定义填充样式,以颜色color进行填充。参数upattern是一个指向8个字节存储区的指针,这8个字节存储了8
×
8像素构成的填充图模,其中每个字节代表一行,每个字节的一个二进制位表示该位上是否有像素点,如果为1,显示由color指定的颜色像素;如果为0,则不显示。设定填充样式后,可用floodfill()函数对任意封闭的图形进行填充,其格式如下:
floodfill(intx,inty,intborder);
其中:(x,y)为封闭图形内的任意一点,该点称为填充种子;Border为封闭边界的颜色,该值必须与图形轮廓的颜色值一致,否则会使填充超出轮廓。图形内部的填充颜色和样式由setfillstyle()函数设定。
7.图形模式下的文本输出
在图形模式下,可以用printf()、putchar()等标准输出函数向屏幕输出。但它们只能以前景色为白色,输出80列25行的文本,无法与多种图形模式有效地配合。
TurboC提供了一些用在图形模式下的专业文本输出函数,它们可以用来选择输出位置,输出的字型、大小、输出方式等。
为了在图形方式下输出文本,TurboC提供了一个8
×
8点阵的字库,字库中包含英文字母和一些常用符号的字模,它们是用8
×
8点阵表示的字形库。该字库嵌入在图形系统中,当TurboC对系统进行图形系统初始化(即使用initgraph()函数时)后,该字库即被调入内存。这种字库也是在缺省情况下,图形模式下输出文本时采用的字形。另外,TurboC的图形接口软件(BGI)还提供了4种向量字库。在该字库中字符用一组向量表示,这些向量表示如何画字符。4个向量字库都是以扩展名为
.chr的文件名存放。它们是itrip.chr(3倍笔画字库)、litt.chr(无衬笔画字库)、goth.chr(黑体笔画字库)和sans.chr(小号笔画字库)。当文本输出选择这些字库中的一个时,如用settextstyle()函数,则相应的笔画字库就被调入内存。这些字形常被用来显示放大的字,因此向量字库(矢量字库)在放大时很平滑。
1)文本字型设置
文本字型设置函数的使用格式如下:
settextstyle(intfont,intdirection,intchar_size);
该函数用来设置输出文本的字体、大小和输出方向。输出的文本颜色由setcolor()函数决定。其中,font表示字体,可使用的字体如表11.8所示。
表11.8参数font取值(字体表)参数direction决定文本输出方向,有两种选择,如表11.9所示。
表11.9参数direction取值参数char_size表示输出文本的字体大小,可用的取值如表11.10所示。
表11.10参数char_size取值2)设置文本的输出位置
文本输出位置函数的格式如下:
settextjustify(inthoriz,intvert);
该函数用于设置文本在水平或垂直方向上的对齐方式,其参数如表11.11取值所示。
表11.11参数horiz和vert取值表3)输出文本
输出文本字符串有以下两个函数:
outtext(char*textstring); /*当前位置输出文本*/
outtextxy(intx,inty,char*textstring); /*在(x,y)坐标位置 输出文本*/
outtext()函数在当前位置,按照settextstyle()函数中direction所指定的方向输出由指针textstring所指向的字符串。
outtextxy()函数是在规定的(x,y)的像素坐标位置,按照settextjustify()函数指定的对齐方式输出由指针textstring所指向的字符串。
例如:
outtextxy(100,100,"ABC");
该语句执行时,TurboC将采用缺省方式显示,设置字符“A”的左上角位置为(100,100),字形为8
×
8点阵,比例尺寸为1∶1,即和字库中的字一样大。
4)格式输出
图形模式下,格式输出字符串函数的使用格式如下:
sprintf(char*str,char*format[,argument,…]);
该函数的使用方法类似于printf(),只不过它是将参数argument的内容按format所指定的格式输出到指针str所指的字符串中,而不是输出到屏幕。
sprintf()函数补充了outtext()和outtextxy()函数的不足。因为outtext()和outtextxy()函数只能输出字符串,而无法输出变量、表达式结果等内容,可以先将输出的变量内容通过sprintf()函数转换成字符串str,再通过outtext()或outtextxy()函数输出。例如:
charstr[80];
floatf;
…
f=10*10*3.14159;
sprintf(str,"半径为10的圆面积为:%f",f);
outtextxy(100,100,str);
上面的程序段运行后,将在屏幕上从(100,100)坐标开始输出字符串“半径为10的圆面积为:314.159”。11.3.3动画设计
1.图形窗口的设置
图形窗口函数的使用格式如下:
setviewport(intx1,inty1,intx2,inty2,intclipflag);
该函数用于在屏幕上建立一个左上角坐标为(x1,y1)、右下角为(x2,y2)的新的显示窗口。其中,参数clipflag用于指定画线是否在当前窗口边界被截断。当clipflag!=0时,窗口边界被截断;如果clipflag==0,则超出部分仍将绘制出来。新窗口建立后,CP位置移到新窗口的(0,0)坐标处。
clearviewport()函数可用于清除图形窗口的内容,格式如下:
clearviewport();
getviewsettings()函数用于获取当前窗口的信息,格式如下:
getviewsettings(structviewporttypefar*viewport);
该函数将取得的窗口信息存储到结构viewporttype中,该结构定义如下:
structviewporttype
{intleft,top,right,bottom;/*窗口的左、上,右、下对应的 坐标值*/
intclipflag; /*超出窗口部分的处理方式*/
}
2.用putimage函数实现动画的技巧
计算机图形动画显示的是由一系列静止图像在不同位置上的重现。计算机图形动画技术一般分为画擦法和覆盖刷新法两大类。画擦法是先画T时刻的图形,然后在T+△T时刻把它擦掉,改画新时刻的图形由点、线、圆等基本图元组成。这种一画一擦的方法对于实现简单图形的动态显示是比较有效的。而当需要显示比较复杂的图形时,由于画擦图形时间相对较长,致使画面在移动时出现局部闪烁现象,使得动画视觉效果变差。所以,为提高图形的动态显示效果,在显示比较复杂的图形时多采用覆盖刷新的方法。在TurboC的图形函数中,以下函数可完成动画的显示:
getimage()函数把屏幕图形部分拷贝到由buf所指向的内存区域。其使用格式如下:
getimage(intleft,inttop,intright,intbottom,voidfar*buf)
imagesize()函数用来确定存储图形所需的字节数,所定义的字节数根据实际需要可以定义得多一些。其使用格式如下:
intimagesize(intx1,inty1,intx2,inty2);
putimage()函数可以把getimage()存储的图形重写在屏幕上。其使用格式如下:
putimage(intx1,inty1,voidfar*bitmap,intop);利用putimage()函数的参数op中的COPY_PUT项,在下一个要显示的位置上于屏幕中重写图像,如此重复、交替地显示下去,即可达到覆盖刷新的目的,从而实现动画显示。由于图形是一次性覆盖到显示区的,并在瞬间完成,其动态特性十分平滑,动画效果较好。
参数op的取值如表11.12所示。
表11.12参数op取值例11.5的程序就是根据上述思路而实现的。程序运行时,将在屏幕上出现一个跳动的红色小球。
例11.5
动画显示程序。
#include<stdio.h>
#include<graphics.h>
#include<alloc.h>
#include<conio.h>
voidmain(void)
{
intdriver=DETECT,mode;
intk=0,i,m,m1;
intmaXX,mayy,size;
char*buf;
initgraph(&driver,&mode,"");
maXX=getmaxx();/*获取当前屏幕最大x坐标*/
mayy=getmaxy();/*获取当前屏幕最大y坐标*/
setfillstyle(SOLID_FILL,LIGHTGRAY); /*设置填充 样式*/
bar(1,1,maXX,mayy);
setcolor(RED);
for(i=0;i<=10;i++)
circle(150,150,i); /*画圆*/
size=imagesize(100,100,250,200); /*存储区域到缓冲 区*/
if(size!=-1)
buf=malloc(size); /*缓冲区大小(字节数)*/
if(buf)
{
getimage(100,100,250,200,buf); /*读缓冲区数据*/
m=120;m1=m;
do{
k=k+1;
if((m1+100)>mayy)
{for(m=m+30;m<maXX;m=m+30)
{m1=m1-20;
putimage(m,m1,buf,COPY_PUT); /*将缓冲内容复制 到指定坐标处*/
}
}
if((m+100)>maXX)
{m=m-100;
for(m1=m1+100;m1>=1;m1=m1-10)
{m1=m1-19;
putimage(m,m1,buf,COPY_PUT);
}
for(m=m;m>1;m=m-30)
{m1=m1-17;
putimage(m,m1,buf,COPY_PUT);
}
}
m1=m1+20;
m=m+20;
putimage(m,m1,buf,COPY_PUT);
delay(10000); /*延时*/
}while(k!=1000);
getch();
}
restorecrtmode(); /*恢复显示模式*/
}11.3.4使图形软件脱离BGI的方法
大家知道,用Turbo编译的图形软件,在运行时,当前目录下必须要有相应的BGI文件,如CGA.BGI、EGAVGA.BGI等,这对于应用程序是不太方便的。为了解决这个问题,可使用以下方法。
(1)用TurboC提供的BGIOBJ.EXE把*.BGI编译成目标文件*.OBJ。例如:
C>BGIOBJCGA
这样就产生了一个CGA.OBJ。同样,将EGAVGA.BGI进行编译,再把这些*.OBJ拷入TC目录下的LIB子目录中。
使用时,先编译一个project文件,把需要的OBJ文件列入project文件中。例如对BGIDEMO.C,相应BGIDEMO.PRJ可写为:
BGIDEMO.C
EGAVGA.OBJ
这样在集成环境下调试BGIDEMO.C时,当前目录下不需要有EGAVGA.BGI,最后生成的EXE文件,运行时也不需要EGAVA.BGI。
(2)使用命令行编译程序TCC.EXE,只要在编译时列入相应的EGAVGA.BGI,最后生成的EXE文件运行时也不需要EGAVGA.BGI的EXE件。
(3)对于经常使用TCC.EXE的用户,可用TurboC提供的TLIB.EXE将上述*.obj扩充进图形库GRAPHICS.LIB,方法如下:
C>TLIBGRAPHICS.LIB+EGAVGA.OBJ
这样,以后在编译时,只要连接新的GRAPHICS.LIB就可编译出不需要BGI的图形软件。
(4)在程序中initgraph()函数调用之前加上一句:registerbgidriver(EGAVGA_driver):该函数告诉连接程序在连接时把EGAVGA的驱动程序装入到用户的执行程序中。11.3.5菜单设计技术
菜单在用户编写的程序中占据相当一部分内容。设计一个高质量的菜单,不仅能使系统美观,更主要的是能够使操作者使用方便,避免一些误操作带来的严重后果。
1.选择式菜单的设计
所谓选择式菜单,就是在屏幕上出现一个菜单,操作者可根据菜单上所提供的数字或字母按相应的键去执行特定的程序,当程序执行完后又回到主菜单上。
这种菜单编制简单,操作方便,使用灵活,尤其适用于大型管理程序。如果在自动批处理文件上加入这种菜单后,操作者可根据菜单上的提示,进行相应的操作,这样可以简化许多步骤,对一般微机用户来说是比较适合的。
例11.6
选择式菜单程序。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
main()
{charch;
inti;
do{ /*system()函数是调用相应模块的函数*/
system("cls");
printf("\n\t1.IntoTurboC");
printf("\n\t2.Intoucdos");
printf("\n\t3.Intowps");
printf("\n\t4.Intohelp");
printf("\n\t0.Quit\n\n");
printf("\tPleaseselect:");
ch=getchar();
switch(ch)
{case'1':system("tc");break; /*调用tc.exe,可根据实际 调用情况修改*/
case'2':system("ucdos");break; /*调用*/
case'3':system("wps");break; /*调用wps.exe*/
case'4':system("help");break; /*调用help.exe*/
case'0':system("cls");exit(1); /*执行清屏命令后退出*/
default:printf("\n\t***您没有选择!!!***\n");
delay(100000); /*延时*/
}
}while(1);
}
本例中,当选择某一项时,会对应执行一个程序模块,在这里没有具体对应的模块,如果读者在使用过程中,可以将自己的程序编译成相应的可执行文件来调用,或直接使用函数调用(将本例中的system()位置用其他函数调用来替换即可)。
2.下拉式菜单的设计
下拉式菜单是一个窗口菜单,它具有一个主菜单,其中包括几个选择项,主菜单的每一项又可以分为下一级菜单,这样逐级下分,用一个个窗口的形式弹出在屏幕上,一旦操作完毕又可以从屏幕上消失,并恢复原来的屏幕状态,因此,在下拉式菜单的设计中更多地用到getimage()、putimage()函数。设计下拉式菜单的关键就是在下级菜单窗口弹出之前,要将被该窗口占用的屏幕区域保存起来,然后产生这一级菜单窗口,并可用光标键选择菜单中各项,用回车键来确认。如果某选择项还有下级菜单,则按同样的方法再产生下一级菜单窗口。有兴趣的读者可以自己试着编写下拉式菜单,此处不再赘述。11.3.6程序举例
例11.7
简单的时钟程序举例。
下面是一个简单的时钟程序,在屏幕上显示出一个时钟表盘和时、分、秒钟,能随着时间变化,并在表盘的下部显示出一个文字的记时器。
#include<graphics.h>
#include<math.h>
#include<dos.h>
#definePI3.1415926
#definex0320 /*定义钟表中心坐标*/
#definey0240
inttable1[8]={-5,-160,5,-160,5,-130,-5,-130};/*定义时钟刻 度形状1*/
inttable2[8]={-5,-160,5,-160,2,-130,-2,-130};/*定义时钟刻 度形状2*/
voidbeep() /*实现发声的函数*/
{sound(1000);
delay(500);
nosound();
}
voidwritetext() /*写三维立体字函数*/
{inti;
char*s="MADEINCHINA!"; /*要显示的立体字母*/
settextstyle(0,0,2); /*设置文本属性:字号和字体*/
setcolor(14); /*定义字体为黄色*/
for(i=0;i<5;i++)outtextxy(210+i,430+i,s);/*在不同位置输出 同一字符串,产生黄色立体效果*/
setcolor(RED); /*字义为红色*/
outtextxy(210+i,430+i,s); /*输出红色字体*/
}
voiddrawpoint(int*data,intangle,intcolor)
/*画多边形的通 用函数*/
{intusedata[8]; /*存放多边形4个顶点坐标,usedata[0]和 usedata[1]为第1个顶点的坐标……usedata
[6]和usedata[7]为4个顶点*/
floatsinang,cosang;
inti;
sinang=sin((float)angle/180*PI); /*计算多边形的坐标弧度 变换*/
cosang=cos((float)angle/180*PI);
for(i=0;i<8;i+=2)/*计算多边形各顶点的位置*/
{usedata[i]=x0+cosang*data[i]-sinang*data[i+1]+0.5;
usedata[i+1]=y0+s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五电影制作保密合同范本6篇
- 二零二五版木材行业碳排放权交易合同范本8篇
- 2025年个人住宅房产抵押担保合同范本
- 课题申报参考:内感受干预促进青少年情绪能力的神经基础
- 课题申报参考:民事诉讼法的基础理论和基本制度研究
- 2025年度住宅小区停车位共有产权转让合同范本
- 2025年个人房产继承权转让合同范本2篇
- 2025版农机具租赁与智能灌溉系统合同4篇
- 二零二五版美容美发院加盟店会员管理与服务合同4篇
- 2025年度高端建筑用热镀锌钢管采购合同3篇
- DB43-T 3022-2024黄柏栽培技术规程
- 成人失禁相关性皮炎的预防与护理
- 九宫数独200题(附答案全)
- 人员密集场所消防安全管理培训
- 《聚焦客户创造价值》课件
- PTW-UNIDOS-E-放射剂量仪中文说明书
- JCT587-2012 玻璃纤维缠绕增强热固性树脂耐腐蚀立式贮罐
- 保险学(第五版)课件全套 魏华林 第0-18章 绪论、风险与保险- 保险市场监管、附章:社会保险
- 典范英语2b课文电子书
- 员工信息登记表(标准版)
- 春节工地停工复工计划安排( 共10篇)
评论
0/150
提交评论