实例编程之C语言图形处理.docx
- 文档编号:30279167
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:16
- 大小:31.33KB
实例编程之C语言图形处理.docx
《实例编程之C语言图形处理.docx》由会员分享,可在线阅读,更多相关《实例编程之C语言图形处理.docx(16页珍藏版)》请在冰豆网上搜索。
实例编程之C语言图形处理
实例编程之C语言图形处理
育龙网 WWW.CHINA-B.C0M 2009年06月12日 来源:
互联网
育龙网核心提示:
再谈main()主函数每一C程序都必须有一main()函数,可以根据自己的爱好把它放在程序的某个地方。
有些程序员把它放在最前面,而另
再谈main()主函数每一C程序都必须有一main()函数,可以根据自己的爱好把它放在程序的某个地方。
有些程序员把它放在最前面,而另一些程序员把它放在最后面,无论放在哪个地方,以下几点说明都是适合的。
1.main()参数在TurboC2.0启动过程中,传递main()函数三个参数:
argc,argv和env。
*argc:
整数,为传给main()的命令行参数个数。
*argv:
字符串数组。
在DOS3.X版本中,argv[0]为程序运行的全路径名;对DOS3.0以下的版本,argv[0]为空串("")。
argv为在DOS命令行中执行程序名后的第一个字符串;argv为执行程序名后的第二个字符串;...argv[argc]为NULL。
*env:
安符串数组。
env[]的每一个元素都包含ENVVAR=value形式的字符串。
其中ENVVAR为环境变量如PATH或87。
value为ENVVAR的对应值如C:
\DOS,C:
\TURBOC(对于PATH)或YES(对于87)。
TurboC2.0启动时总是把这三个参数传递给main()函数,可以在用户程序中说明(或不说明)它们,如果说明了部分(或全部)参数,它们就成为main()子程序的局部变量。
请注意:
一旦想说明这些参数,则必须按argc,argv,env的顺序,如以下的例子:
main()main(intargc)main(intargc,char*argv[])main(intargc,char*argv[],char*env[])
其中第二种情况是合法的,但不常见,因为在程序中很少有只用argc,而不用argv[]的情况。
以下提供一样例程序EXAMPLE.EXE,演示如何在main()函数中使用三个参数:
/*programnameEXAMPLE.EXE*/#include#includemain(intargc,char*argv[],char*env[]){inti;printf("Thesearethe%dcommand-lineargumentspassedto\main:
\n\n",argc);for(i=0;i=argc;i++)printf("argv[%d]:
%s\n",i,argv[i]);printf("\nTheenvironmentstring(s)onthissystemare:
\\n\n");for(i=0;env[i]!
=NULL;i++)printf("env[%d]:
%s\n",i,env[i]);}如果在DOS提示符下,按以下方式运行EXAMPLE.EXE:
C:
\examplefirst_argument"argumentwithblanks"34"lastbutone"stop!
注意:
可以用双引号括起内含空格的参数,如本例中的:
"argumentwithblanks"和"Lastbutone")。
应该提醒的是:
传送main()函数的命令行参数的最大长度为128个字符(包括参数间的空格),这是由DOS限制的。
文本窗口的定义TurboC2.0的字符屏幕函数主要包括文本窗口大小的设定、窗口颜色的设置、窗口文本的清除和输入输出等函数。
TurboC2.0默认定义的文本窗口为整个屏幕,共有80列(或40列)25行的文本单元,每个单元包括一个字符和一个属性,字符即ASCII码字符,属性规定该字符的颜色和强度。
TurboC2.0可以定义屏幕上的一个矩形域作为窗口,使用window()函数定义。
窗口定义之后,用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口的边界。
window()函数的调用格式为:
voidwindow(intleft,inttop,intright,intbottom);该函数的原型在conio.h中(关于文本窗口的所有函数其头文件均为conio.h,后面不再说明)。
函数中形式参数(intleft,inttop)是窗口左上角的坐标,(intright,intbottom)是窗口的右下角坐标,其中(left,top)和(right,bottom)是相对于整个屏幕而言的。
TurboC2.0规定整个屏幕的左上角坐标为(1,1),右下角坐标为(80,25)。
并规定沿水平方向为X轴,方向朝右;沿垂直方向为Y轴,方向朝下。
若window()函数中的坐标超过了屏幕坐标的界限,则窗口的定义就失去了意义,也就是说定义将不起作用,但程序编译链接时并不出错。
另外,一个屏幕可以定义多个窗口,但现行窗口只能有一个(因为DOS为单任务操作系统),当需要用另一窗口时,可将定义该窗口的window()函数再调用一次,此时该窗口便成为现行窗口了。
如要定义一个窗口左上角在屏幕(20,5)处,大小为30列15行的窗口可写成:
window(20,5,50,25);文本窗口颜色的设置文本窗口颜色的设置包括背景颜色的设置和字符颜色的设置,使用的函数及其调用格式为:
设置背景颜色:
voidtextbackground(intcolor);设置字符颜色:
voidtextcolor(intcolor);有关颜色的定义见下表:
━━━━━━━━━━━━━━━━━━━━━━━━━━符号常数数值含义字符或背景──────────────────────────BLACK0黑两者均可BLUE1兰两者均可GREEN2绿两者均可CYAN3青两者均可RED4红两者均可MAGENTA5洋红两者均可BROWN6棕两者均可LIGHTGRAY7淡灰两者均可DARKGRAY8深灰只用于字符LIGHTBLUE9淡兰只用于字符LIGHTGREEN10淡绿只用于字符LIGHTCYAN11淡青只用于字符LIGHTRED12淡红只用于字符LIGHTMAGENTA13淡洋红只用于字符YELLOW14黄只用于字符WHITE15白只用于字符BLINK128闪烁只用于字符━━━━━━━━━━━━━━━━━━━━━━━━━━━上表中的符号常数与相应的数值等价,二者可以互换。
例如设定兰色背景可以使用textbackground
(1),也可以使用textbackground(BLUE),两者没有任何区别,只不过后者比较容易记忆,一看就知道是兰色。
TurboC另外还提供了一个函数,可以同时设置文本的字符和背景颜色,这个函数的调用格式为:
voidtextattr(intattr);其中:
attr的值表示颜色形式编码的信息,每一位代表的含义如下:
位76543210Bbbbcccc↓┕━━━┙┖─────┘闪烁背景颜色字符颜色字节低四位cccc设置字符颜色(0到15),4 ̄6三位bbb设置背景颜色(0到7),第7位B设置字符是否闪烁。
假如要设置一个兰底黄字,定义方法如下:
textattr(YELLOW+(BLUE4));若再要求字符闪烁,则定义变为:
textattr(128+YELLOW+(BLUE4);注意:
(1)对于背景只有0到7共八种颜色,若取大于7小于15的数,则代表的颜色与减7后的值对应的颜色相同。
(2)用textbackground()和textcolor()函数设置了窗口的背景与字符颜色后,在没有用clrscr()函数清除窗口之前,颜色不会改变,直到使用了函数clrscr(),整个窗口和随后输出到窗口中的文本字符才会变成新颜色。
(3)用textattr()函数时背景颜色应左移4位,才能使3位背景颜色移到正确位置下面这个程序使用了关于窗口大小的定义、颜色的设置等函数,在一个屏幕上不同位置定义了7个窗口,其背景色分别使用了7种不同的颜色。
#include#includemain(){inti;textbackground(0);/*设置屏幕背景色*/clrscr();/*清除文本屏幕*/for(i=1;i8;i++){window(10+i*5,5+i,30+i*5,15+i);/*定义文本窗口*/textbackground(i);/*定义窗口背景色*/clrscr();/*清除窗口*/}getch();}
窗口内文本的输入输出函数一、窗口内文本的输出函数intcprintf("格式化字符串",变量表);intcputs(char*string);intputch(intch);cprintf()函数输出一个格式化的字符串或数值到窗口中。
它与printf()函数的用法完全一样,区别在于cprintf()函数的输出受窗口限制,而printf()函数的输出为整个屏幕。
cputs()函数输出一个字符串到屏幕上,它与puts()函数用法完全一样,只是受窗口大小的限制。
putch()函数输出一个字符到窗口内。
注意:
①使用以上几种函数,当输出超出窗口的右边界时会自动转到下一行的开始处继续输出。
②当窗口内填满内容仍没有结束输出时,窗口屏幕将会自动逐行上卷直到输出结束为止。
二、窗口内文本的输入函数intgetche(void);该函数在前面已经讲过,需要说明的是,getche()函数从键盘上获得一个字符,在屏幕上显示的时候,如果字符超过了窗口右边界,则会被自动转移到下一行的开始位置。
下面这个程序给上例中加入了一些文本的输出函数。
#include#includeintmain(){inti;char*c[]={"BLACK","BLUE","GREEN","CYAN","RED","MAGENTA","BROWN","LIGHTGRAY"};textbackground(0);/*设置屏幕背景色*/clrscr();/*清除文本屏幕*/for(i=1;i8;i++){window(10+i*5,5+i,30+i*5,15+i);/*定义文本窗口*/textbackground(i);/*定义窗口背景色*/clrscr();/*清除窗口*/}getch();return0;}有关屏幕操作的函数voidclrscr(void);清除当前窗口中的文本内容,并把光标定位在窗口的左上角(1,1)处。
voidclreol(void);清除当前窗口中从光标位置到行尾的所有字符,光标位置不变。
voidgotoxy(x,y);该函数很有用,它用来定位光标在当前窗口中的位置。
这里x,y是指光标要定位处的坐标(相对于窗口而言),当x,y超出了窗口的大小时,该函数就不起作用了。
intgettext(intxl,intyl,intx2,inty2,void*buffer);intputtext(intx1,inty1,intx2,inty2,void*buffer);gettext()函数是将屏幕上指定的矩形区域内文本内容存入buffer指针指向的一个内存空间。
内存的大小用下式计算:
所用字节大小=行数*列数*2。
其中:
行数=y2-y1+1列数=x2-x1+1puttext()函数则是将gettext()函数存入内存buffer中的文字内容拷贝到屏幕上指定的位置。
intmovetext(intx1,intx2,inty2,intx3,inty3);movetext()函数将屏幕上左上角为(x1,y1),右下角为(x2,y2)的一矩形窗口内的文本内容拷贝到左上角为(x3,y3)的新的位置。
该函数的坐标也是相对于整个屏幕而言的。
注意:
1.gettext()函数和puttext()函数中的坐标是对整个屏幕而言的,即是屏幕的绝对坐标,而不是相对窗口的坐标。
2.movetext()函数是拷贝而不是移动窗口区域内容,即使用该函数后,原位置区域的文本内容仍然存在。
#includemain(){inti;char*f[]={"LoadF3","PickAlt-F3","New","SaveF2","Writeto","Directory","Changedir","Osshell","QuitAlt-X"};charbuf[11*16*2];clrscr();textcolor(YELLOW);textbackground(BLUE);clrscr();gettext(10,2,24,11,buf);window(10,2,24,11);textbackground(RED);textcolor(YELLOW);clrscr();for(i=0;i9;i++){gotoxy(1,i+1);cprintf("%s",f[i]);}getch();movetext(10,2,24,11,40,10);puttext(10,2,24,11,buf);getch();}
下面再介绍一些函数:
voidhighvideo(void);设置显示器高亮度显示字符voidlowvideo(void);设置显示器低亮度显示字符voidnormvideo(void);使显示器返回到程序运行前的显示方式intwherex(void);这两个函数返回当前窗口下光标的x,y坐标intwherey(void);TurboC提供了非常丰富的图形函数,所有图形函数的原型均在graphics.h中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。
另外,使用图形函数时要确保有显示器图形驱动程序*BGI,同时将集成开发环境Options/Linker中的Graphicslib选为on,只有这样才能保证正确使用图形函数。
图形模式的初始化不同的显示器适配器有不同的图形分辨率。
即是同一显示器适配器,在不同模式下也有不同分辨率。
因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。
设置屏幕为图形模式,可用下列图形初始化函数:
voidfarinitgraph(intfar*gdriver,intfar*gmode,char*path);其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。
有关图形驱动器、图形模式的符号常数及对应的分辨率见下表。
图形驱动程序由TurboC出版商提供,文件扩展名为.BGI。
根据不同的图形适配器有不同的图形驱动程序。
例如对于EGA、VGA图形适配器就调用驱动程序EGAVGA.BGI。
图形驱动器、模式的符号常数及数值━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━图形驱动器(gdriver)图形模式(gmode)─────────────────────色调分辨率符号常数数值符号常数数值━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━CGA1CGAC00C0320*200CGAC11C1320*200CGAC22C2320*200CGAC33C3320*200CGAHI42色640*200──────────────────────────────MCGA2MCGAC00C0320*200MCGAC11C1320*200MCGAC22C2320*200MCGAC33C3320*200MCGAMED42色640*200MCGAHI52色640*480──────────────────────────────EGA3EGALO016色640*200EGAHI116色640*350──────────────────────────────EGA644EGA64LO016色640*200EGA64HI14色640*350──────────────────────────────EGAMON5EGAMONHI02色640*350──────────────────────────────IBM85146IBM8514LO0256色640*480IBM8514HI1256色1024*768──────────────────────────────HERC7HERCMONOHI02色720*348──────────────────────────────ATT4008ATT400C00C0320*200ATT400C11C1320*200ATT400C22C2320*200ATT400C33C3320*200ATT400MED42色320*200ATT400HI52色320*200──────────────────────────────VGA9VGALO016色640*200VGAMED116色640*350VGAHI216色640*480──────────────────────────────PC327010PC3270HI02色720*350──────────────────────────────DETECT0用于硬件测试━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
使用图形初始化函数设置VGA高分辨率图形模式#includeintmain(){intgdriver,gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver,&gmode,"c:
\\caic\\bgi");bar3d(100,100,300,250,50,1);/*画一长方体*/getch();closegraph();return0;}有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,TurboC提供了一个自动检测显示器硬件的函数,其调用格式为:
voidfardetectgraph(int*gdriver,*gmode);其中gdriver和gmode的意义与上面相同。
自动进行硬件测试后进行图形初始化#includeintmain(){intgdriver,gmode;detectgraph(&gdriver,&gmode);/*自动测试硬件*/printf("thegraphicsdriveris%d,modeis%d\n",gdriver,gmode);/*输出测试结果*/getch();initgraph(&gdriver,&gmode,"c:
\\caic\\bgi");/*根据测试结果初始化图形*/bar3d(10,10,130,250,20,1);getch();closegraph();return0;}上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但TurboC提供了一种更简单的方法,即用driver=DETECT语句后再跟initgraph()函数就行了。
采用这种方法后,上例可改为:
#includeintmain(){intgdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"c:
\\caic\\bgi");bar3d(50,50,150,30,50,1);getch();closegraph();return0;}另外,TurboC提供了退出图形状态的函数closegraph(),其调用格式为:
voidfarclosegraph(void);调用该函数后可退出图形状态而进入文本方式(TurboC默认方式),并释放用于保存图形驱动程序和字体的系统内存。
独立图形运行程序的建立TurboC对于用initgraph()函数直接进行的图形初始化程序,在编译和链接时并没有将相应的驱动程序(*.BGI)装入到执行程序,当程序进行到intitgraph()语句时,再从该函数中第三个形式参数char*path中所规定的路径中去找相应的驱动程序。
若没有驱动程序,则在C:
\TC中去找,如C:
\TC中仍没有或TC不存在,将会出现错误:
BGIError:
Graphicsnotinitialized(use‘initgraph‘)因此,为了使用方便,应该建立一个不需要驱动程序就能独立运行的可执行图形程序,TurboC中规定用下述步骤(这里以EGA、VGA显示器为例):
1.在C:
\TC子目录下输入命令:
BGIOBJEGAVGA此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ的目标文件。
2.在C:
\TC子目录下输入命令:
TLIBLIB\GRAPHICS.LIB+EGAVGA此命令的意思是将EGAVGA.OBJ的目标模块装到GRAPHICS.LIB库文件中。
3.在程序中initgraph()函数调用之前加上一句:
registerbgidriver(EGAVGA_driver):
该函数告诉连接程序在连接时把EGAVGA的驱动程序装入到用户的执行程序中。
经过上面处理,编译链接后的执行程序可在任何目录或其它兼容机上运行。
假设已作了前两个步骤,若再向例6中加registerbgidriver()函数则变成:
#include#includeintmain(){intgdriver=DETECT,gmode;registerbgidriver(EGAVGA_driver);/*建立独立图形运行程序*/initgraph(gdriver,gmode,"c:
\\caic\\bgi");bar3d(50,50,250,150,20,1);getch();closegraph();return0;}
上例编译链接后产生的执行程序可独立运行。
如不初始化成EGA或CGA分辨率,而想初始化为CGA分辨率,则只需要将上述步骤中有EGAVGA的地方用CGA代替即可。
屏幕颜色的设置和清屏函数对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。
在TurboC中分别用下面两个函数。
设置背景色:
voidfarsetbkcolor(intcolor);设置作图色:
voidfarsetcolor(intcolor);其中color为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见下表所示。
有关屏幕颜色的符号常数表:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━符号常数数值含义符号常数数值含义──────────────────────────────BLACK0黑色DARKGRAY8深灰BLUE1兰色LIGHTBLUE9深兰GREEN2绿色LIGHTGREEN10淡绿CYAN3青色LIGHTCYAN11淡青RED4红色LIGHTRED12淡红MAGENTA5洋红LIGHTMAGENTA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实例 编程 语言 图形 处理
![提示](https://static.bdocx.com/images/bang_tan.gif)