《C语言实例教程 第2版 普通高等教育“十一五”国级级规划教材 教学课件 ppt 作者 赵克林 第10章 图形与音乐简介》由会员分享,可在线阅读,更多相关《C语言实例教程 第2版 普通高等教育“十一五”国级级规划教材 教学课件 ppt 作者 赵克林 第10章 图形与音乐简介(61页珍藏版)》请在金锄头文库上搜索。
1、第10章 图形与音乐简介,【主要内容】,简介常用绘图函数、动画实现方法、音乐程序编制及鼠标驱动技术。,【学习重点】,本章主要是一些函数的使用方法,学习时主要是上机练习。,第10章 图形与音乐简介,第一节 图形模式,第二节 图形屏幕,第三节 绘图函数,第四节 简单动画设计,第五节 音乐程序设计,第六节 驱动鼠标,第一节 图形模式,Turbo C提供了非常丰富的图形函数,这些函数主要有:,所有图形函数的原型均包括在graphics.h中,第二节 图形屏幕,显示器的工作方式有两种:,文本(或字符)方式,图形方式,通过存放字符的字模在屏幕上加以显示,以像素为基本单位,直接显示所绘制的图形,第二节 图形
2、屏幕,在图形方式下,显示器的坐标以屏幕左上角为原点(0,0),向右为正x轴方向,向下为正y轴方向。屏幕坐标如图10-1所示。,一、图形模式的初始化,第二节 图形屏幕,在屏幕作图之前,必须根据显示器适配器的种类将显示器设置成某种图形模式。,在未设置图形模式之前,计算机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。,设置屏幕为图形模式,图形初始化函数为:,void far initgraph(int far *driver, int far *mode, char *path);,driver和mode分别为图形驱动器和模式,path为图形驱动程序所在的目录路径,第
3、二节 图形屏幕,常用的图形驱动器、图形模式的符号常数及对应的分辨率:,第二节 图形屏幕,【例10-1】 使用图形初始化函数设置VGA高分辨率图形模式。,参考源代码: /* 例10-1,10-1.c */ #include void main() int gdriver, gmode; gdriver = VGA; gmode = VGAHI; initgraph( /* 退出图形状态 */ ,运行输出:,有时,编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同的图形驱动器,使程序可移植。Turbo C提供了一个自动检测显示器硬件的函数,其调用格式为:,void far de
4、tectgraph(int *gdriver, *gmode);,其中,gdriver和gmode的意义与上面相同。,第二节 图形屏幕,【例10-2】 自动进行硬件测试后进行图形初始化。,源代码:,运行输出:,第二节 图形屏幕,对于用initgraph()函数直接进行图形初始化的程序,Turbo C在编译和链接时并没有将相应的驱动程序(*.BGI)装入执行程序,当程序进行到initgraph()语句时,再从该函数中第3个形式参数char *path中所规定的路径中去寻找相应的驱动程序。若没有驱动程序,则在C:TC中去找,例如C:TC中仍然没有或不存在TC,将会出现错误信息:,BGI Error
5、: Graphics not initialized (use initgraph),怎么办?,第二节 图形屏幕,为了使用方便,应该建立一个不需要驱动程序就能独立运行的可执行图形程序。Turbo C中规定用下述步骤(这里以EGA和VGA显示器为例): 在C:TC子目录下输入命令: BGIOBJ EGAVGA 此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ的目标文件。 在C:TC子目录下输入命令: TLIB LIBGRAPHICS.LIB+EGAVGA 此命令的意思是将EGAVGA.OBJ的目标模块装入GRAPHICS.LIB库文件中。 在程序中initgraph()函数调用之前
6、加上语句: registerbgidriver(EGAVGA_driver); 该函数告诉连接程序,在连接时把EGAVGA的驱动程序装入用户的执行程序中。 经过上面处理,编译连接后的执行程序可在任何目录或其他兼容机上运行,增强了程序的通用性。,第二节 图形屏幕,【例10-3】 独立图形运行程序(假设已完成了前两个步骤)。,/* 例10-3,10-3.c */ #include void main() int driver = DETECT, mode; registerbgidriver(EGAVGA_driver); /*建立独立图形运行程序 */ initgraph( 上例编译链接后产生的
7、执行程序可独立运行。,第二节 图形屏幕,二、设置屏幕颜色和清屏,屏幕颜色可分为背景色和前景色。,setcolor(int color); /* 用于设置前景色,即画笔颜色 */ setbkcolor(int color); /* 用于设置背景色 */,color为颜色的规定数值,可取的颜色值:,第二节 图形屏幕,三、图形模式下的文本输出,1文本字型设置,文本字型设置使用settextstyle()函数,其格式是:,settextstyle(int font, int direction, int char_size);,其中:font,字体名;direction,文本显示方向;char_siz
8、e,文本大小尺寸,该函数用来设置输出文本的字体、输出方向和大小。输出的文本颜色由setcolor()函数决定。,第二节 图形屏幕,2设置文本的输出位置,文本输出位置的确定使用settextjustfy()函数,其格式是:,settextjustify(int horiz, int vert);,该函数用于设置文本在水平(horiz)或垂直(vert)方向上的对齐方式,参数horiz和vert取值表 :,第二节 图形屏幕,3输出文本,输出文本字符串有两个函数,其格式是:,outtext(char *textstring); /*当前位置输出文本*/ outtextxy(int x, int y,
9、 char *textstring); /*在(x,y)坐标位置输出文本*/,前一个函数outtext()在当前位置,按照settextstyle()函数中direction所指定的方向输出由指针textstring所指向的字符串。,后一个函数outtextxy()是在(x,y)的像素坐标位置,按照settextjustify()函数指定的对齐方式输出由指针textstring所指向的字符串。,第二节 图形屏幕,4格式输出,图形模式下,格式输出字符串函数sprintf()的使用格式如下:,sprintf(char *str, char *format , argument, );,该函数的使用
10、方法类似于printf(),只不过它是将参数argument的内容按format所指定的格式输出到指针str所指的字符串中,而不是输出到屏幕。,sprintf()函数补充了outtext()和outtextxy()函数的不足,因为,outtext()和outtextxy()函数只能输出字符串,而无法输出变量、表达式的值,可以先将输出的变量内容通过sprintf()函数转换成字符串str,再通过outtext()或outtextxy()函数输出。,第二节 图形屏幕,【例10-4】文本函数应用。,参考源代码:,运行输出:,第二节 图形屏幕,第三节 绘图函数,一、画点与线,1画点,点的绘制由putp
11、ixel()函数完成,该函数格式如下:,putpixel(int x, int y, int color);,putpixel()函数功能:在坐标(x,y)处用color指定的颜色绘制一个点。,如果要想取得某一点的颜色,可使用函数getpixel()来完成:,int getpixel(int x, int y);,获取并返回(x,y)这一点的颜色值。,2画直线,画直线的函数:,line(int x0, int y0, int x1, int y1); /*从点(x0,y0)到点(x1,y1)绘制一条直线*/ lineto(int x, int y); /*从当前位置到点(x,y)绘制一条直线*
12、/ linerel(int dx, int dy); /*从当前位置按相对增量dx,dy绘制一条直线*/,在画直线时,线条的颜色由函数setcolor()指定,还可以用函数setlinestyle()设定线条的线型,该函数格式如下:,setlinestyle(int linestyle, unsigned upattern, int thickness);,线型样式,线的粗细,第三节 绘图函数,【例10-5】画线函数应用,画一个三角形。,参考源代码:,运行输出:,第三节 绘图函数,二、画矩形,矩形函数:,第三节 绘图函数,【例10-6】画矩形函数应用。,参考源代码:,运行输出:,第三节 绘图函
13、数,三、画圆与弧,画圆、圆弧、椭圆的命令较多。,第三节 绘图函数,【例10-7】圆、弧函数应用。,参考源代码:,运行输出:,第三节 绘图函数,四、封闭图形的填充,在默认情况下,绘制出的封闭图形都是单白色实填充,如果需要设置填充样式和填充色,可以使用函数setfillstyle()实现,该函数格式如下:,setfillstyle(int pattern, int color);,填充样式,第三节 绘图函数,填充样式:,第三节 绘图函数,其中,(x,y)为封闭图形内的任意一点的坐标,该点称为填充种子。Border为封闭边界的颜色,该值必须与图形轮廓的颜色值一致,否则会使填充超出轮廓。图形内部的填充
14、颜色和样式由函数setfillstyle()设定。,设定填充样式后,可用floodfill()函数对任意封闭的图形进行填充,其格式为:,floodfill(int x, int y, int border);,第三节 绘图函数,五、图形窗口,函数setviewport()用于图形窗口的设置,格式如下:,setviewport(int x1, int y1, int x2, int y2, int clipflag);,该函数用于在屏幕上建立一个左上角坐标为(x1,y1)、右下角为(x2,y2)的新显示窗口。其中,参数clipflag用于指定画线是否在当前窗口边界被截断。当clipflag非0时
15、,被截断;如果clipflag为0,则超出部分仍将绘制出来。,函数clearviewport()可用于清除图形窗口的内容,格式如下:,clearviewport();,第三节 绘图函数,第四节 简单动画设计,所谓动画实质上就是利用了电影的原理,本身是静止的图形,当它们以每秒25幅以上的速度变化时,就成为动画了。,产生动画的常用方法有4种:,清除法:在原地画一幅图,延时一定时间将其清除,改变位置后再重画。,动态窗口法:开一图形窗口,在窗口中画一图形,然后使窗口移动。,存储再现法:将屏幕上的图形保存到内存缓冲区内,清除屏幕,在新位置再现图形。,页交替法:将屏幕存储器分为若干页,在每个页面上作不同的
16、画,再按一定顺序显示各页。,第四节 简单动画设计,一、清除法,本方法利用 cleardevice()和 delay()函数相互配合,先画一幅图形,让它延迟一定时间,然后清屏,再画另一幅,如此反复,形成动画效果。,【例10-8】 画一个半径为60像素的圆,并让它从屏幕左边水平移动到屏幕右边。,参考源代码:,【模仿训练】 在屏幕上画一白色圆形轨道,再设计一个黄色小球没此轨道作顺时针方向移动。,【思考验证】 修改本例,使该圆在屏幕上沿垂直方向上下移动三次。,第四节 简单动画设计,二、动态窗口法,本方法利用图形窗口设置技术实现动画效果。主要思想是:在不同图形窗口设置同样的图像,而让窗口沿x轴方向移动,每次新窗口出现前清除上次窗口,从而出现图像沿x轴移动之效果。,【例10-9】设计一个不断变化颜色的立方体,沿屏幕从左往右移动。,函数movebar(int xorig)开一窗口并在该窗口中画一填充的立方体,xorig是窗口左上角的x