C程序设计案例教程 教学课件 王明福 源代码习题答案 第10章_第1页
C程序设计案例教程 教学课件 王明福 源代码习题答案 第10章_第2页
C程序设计案例教程 教学课件 王明福 源代码习题答案 第10章_第3页
C程序设计案例教程 教学课件 王明福 源代码习题答案 第10章_第4页
C程序设计案例教程 教学课件 王明福 源代码习题答案 第10章_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在线教务辅导网:://教材其余课件及动画素材请查阅在线教务辅导网QQ:349134187

或者直接输入下面地址:第10章图形与多媒体

本章要点本章将带着读者尝试“时钟〞仿真程序〞和“媒体播放器〞的开发,从而使读者:了解GDI+图形编程中的根本概念,掌握图形开发的根本技术了解多媒体程序的开发方法掌握MCI〔MediaControlInterface〕编程技术掌握进程条〔Progress〕、单项选择(Radio)控件的编程技术掌握将自定义类作为基类,进行应用程序的开发技术在C#中,掌握如何调用WindowsAPI函数10.1媒体程序介绍

1.时钟仿真程序图10-1是MyClock程序的运行结果,是一个时钟仿真程序。

10.1媒体程序介绍(续)

2.媒体播放器

图10-2所示是一个正在播放媒体的播放器,可以播放波形音频(WAVE)、MIDI音频和视频(AVI)三种媒体,其中进程条显示播放的进度。

10.1媒体程序介绍(续)首先介绍有关GDI+绘图根底:Graphics类、Pen类、Brush类、Font类和Bitmao类,然后用自定义类作为基类,完成时钟程序的仿真开发。对媒体的MCI控制方式,构造一个MCI控制类:MCIClass。(2)将MCIClass类作为基类,编写一个基于对话框的播放器。(3)添加进程条,修改、完善播放器。完成系统开发的3步10.2GDI+绘图根底DGI+的功能包含在和等名称空间的各个类中。Graphics类:封装了GDI+绘图画板,是GDI+绘图中最核心的类;Brush类:用指定颜色、样式、纹理等来填充封闭的图形;Pen类:用来画线、多边形、矩形、弧等外围的轮廓局部;Font类:用来描绘字体的样式;Color类:用来描绘颜色,可以是透明或半透明的;位图Bitmap类:用于位图的显示和存储。GDI+中最重要的类10.2.1Graphics类

Graphics类封装一个GDI+绘图图面。Graphics对象表示GDI+的绘图外表,是用来创立图形图像的对象。绘制图形包括两个步骤:〔1〕创立Graphics对象;〔2〕使用Graphics对象绘制线条和形状、呈现文本或显示与操作图像。Graphics类的主要方法

Graphics类的方法说明DrawArc画一段弧DrawClosedCurve用给定一些坐标点(Point)的数据作为参数画一条封闭的曲线DrawCurve用给定一些坐标点(Point)的数据作为参数画一条直线DrawEllipse画一个椭圆DrawImage画一个图像(gif文件、jpg文件等)DrawLine画一条直线段DrawPath画GraphicsPath对象定义的一段路经DrawPie画装饼图的轮廓…………10.2.2画笔Pen类

用Pen类创立画笔对象。画笔通常具有宽度、样式和颜色三种属性。例如:〔1〕创立一个默认宽度为1的黑笔PenmyPen=newPen(Color.Black);〔2〕创立一个宽度为6的黑笔PenmyPen=newPen(Color.Black,6);【例10-1】用Pen类画一条直线

(1)创立Windows窗体应用程序工程MyDraw,修改默认窗体的Text属性值为“绘图〞,Name属性采用默认值。(2)在Form1窗体中,添加button控件,将其Text属性修改为“画直线〞。(3)为“画直线〞按钮的Click事件添加处理代码。privatevoidbutton1_Click(objectsender,EventArgse){PenmyPen=newPen(System.Drawing.Color.Blue);Graphicsg;g=this.CreateGraphics();g.DrawLine(myPen,10,10,50,100);myPen.Dispose();g.Dispose();}10.2.3画刷Brush类

GDI+提供了几种画刷类来填充内部区域:SolidBrush类:单色画刷,在命名空间System.Drawing中定义,其构造函数只有一个,定义如下: SolidBrushbrush1=newSolidBrush(Colorcolor);可使用属性Color来修改画刷颜色,例如:brush1.Color=Color.Green;TextureBrush类:纹理〔图像〕画刷使用图像填充封闭曲线的内部。HatchBrush类:阴影画刷是用指定样式、填充线条颜色和背景颜色的画刷。LinearGradientBrush类:颜色渐变画刷。【例10-3】画一个添充矩形。

类似例10-2,翻开MyDraw工程,在窗体中添加“添充矩形〞Button控件,并为该按钮添加Click事件处理方法,编写填充矩形代码。privatevoidbuttonFill_Click(objectsender,EventArgse){SolidBrushmybrush=newSolidBrush(System.Drawing.Color.Blue);Graphicsg;g=this.CreateGraphics();RectanglefillRect=newRectangle(150,10,100,100);g.FillRectangle(mybrush,fillRect);mybrush.Dispose();g.Dispose();}10.2.4字体Font类

【例10-4】在MyDraw工程中,使用Graphics类中的DrawString方法绘制文本。

privatevoidbutton3_Click(objectsender,EventArgse){Graphicsg;//定义一个Graphics对象g=this.CreateGraphics();stringdrawString="使用DrawString方法";//定义字体和画刷FontmyFont=newFont("TimesNewRoman",18,System.Drawing.FontStyle.Bold);Brushb=newSolidBrush(System.Drawing.Color.Blue);//定义字体格式

StringFormatmyFormat=newStringFormat();//绘制文本g.DrawString(drawString,myFont,b,0,110,myFormat);myFormat.Dispose();g.Dispose();}10.2.5位图Bitmap类

1.图像的显示编程要点:(1)创立Bitmap对象。(2)创立Graphics对象,并调用其DrawImage方法画图。【例10-5】翻开一个BMP位图,并显示。(1)翻开MyDraw工程,在窗体中添加“图像显示〞Button按钮,如图10-7所示。(2)为“图像显示〞按钮的Click事件添加处理代码:1.图像的显示(续)privatevoidbutton13_Click(objectsender,EventArgse){OpenFileDialogofdlg=newOpenFileDialog();ofdlg.Filter="BmpFileBmp.*|*.bmp|All*.*|*.*";if(ofdlg.ShowDialog()==DialogResult.OK){//创立位图对象Bitmapimage1=newBitmap(ofdlg.FileName); //创立Graphics对象,并调用其DrawImage方法画图Graphicsg=this.CreateGraphics();g.DrawImage(image1,10,150);}}10.3时钟程序的开发

10.3.1创立时钟程序工程(1)创立一个工程名为MyClock的Windows应用程序(2)修改主窗体Form1的Text属性值为“时钟〞,MaximizeBox的属性值为false。(3)向窗体添加一个Timer组件,并设置其属性值:Interval属性值设为1000,其它取默认值。设计好的窗体如图10-10所示。完成工程创立的3步10.3.2声明时针基类Hand

时针(HourHand)、分针(MinuteHand)和秒针(SecondHand)包含相似的属性和方法,在名字空间MyClock中构建一个针〔Hand〕类作为它们的共同基类,提供共有的成员publicclassHand{protectedGraphicsPathgp=newGraphicsPath();protectedGraphicsPathgpBase=null;protectedintmidX=150;protectedintmidY=150;publicHand(Form1theForm){}publicvirtualvoidTransform(DateTimed){}publicvirtualvoidDraw(Graphicsg){}publicvoidRotate(doubleangle){}}

10.3.3声明Hand的派生类:秒针、分针和时针类

1.分针类〔MinuteHand〕在名字空间MyClock中,以Hand为基类,派生出MinuteHand类publicclassMinuteHand:Hand{publicMinuteHand(Form1myForm):base(myForm){}

publicoverridevoidTransform(DateTimed){}}10.3.3声明Hand的派生类:秒针、分针和时针类

2.秒针类〔SecondHand〕在名字空间MyClock中,以Hand为基类,派生出

SecondHand类:publicclassSecondHand:Hand{publicSecondHand(Form1myForm):base(myForm){}publicoverridevoidTransform(DateTimed){}}10.3.3声明Hand的派生类:秒针、分针和时针类

3.时针类〔HourHand〕 在名字空间MyClock中,以Hand为基类,派生出HourHand类publicclassHourHand:Hand{publicHourHand(Form1myForm):base(myForm){}publicoverridevoidTransform(DateTimed){}}10.3.4声明时钟外表时钟外表用ClockFace类来实现。画一个圆代表时钟,画上米老鼠的图案,最后在相应的位置画上数字1-12。在名字空间MyClock中新建ClockFace类:publicclassClockFace{publicClockFace(Form1theForm){} privatevoidDrawClockFace(Graphicsg)//画钟的外表{} privatevoidDrawImage(Graphicsg)//画出米老鼠的图片{} privatevoidDrawNumbers(Graphicsg)//画数字{}publicvoidDraw(Graphicsg){DrawClockFace(g);DrawImage(g);DrawNumbers(g);}}10.3.5时钟初始化

在窗体Form1类中定义时针(HourHand)、分针(MinuteHand)和秒针(SecondHand)类对象,并在其构造函数中实例化publicpartialclassForm1:Form{privateSecondHandMySecondHand;privateMinuteHandMyMinuteHand;privateHourHandMyHourHand;privateClockFaceTheClockFace;privateboolFirstTick=false;publicForm1(){InitializeComponent();this.Width=300;this.Height=300;MyMinuteHand=newMinuteHand(this);MySecondHand=newSecondHand(this);MyHourHand=newHourHand(this);TheClockFace=newClockFace(this);}…//省略}10.3.6时钟启动

(1)为Timer1控件的Tick事件,添加事件处理方法,在Tick事件方法中,计算当前时钟的仿真代码,然后调用Invalidate()方法激活Paint事件

privatevoidtimer1_Tick(objectsender,EventArgse){MySecondHand.Transform(DateTime.Now);MyMinuteHand.Transform(DateTime.Now);MyHourHand.Transform(DateTime.Now);FirstTick=true;Invalidate();}10.3.6时钟启动(续)(2)为窗体Form1添加Paint事件处理方法,并编写时钟显示代码privatevoidForm1_Paint(objectsender,PaintEventArgse){if(FirstTick==false)return;Graphicsg=e.Graphics;TheClockFace.Draw(g);MySecondHand.Draw(g);MyMinuteHand.Draw(g);MyHourHand.Draw(g);}10.3.6时钟启动(续)(3)为窗体Form1添加Resize事件处理方法,在方法中,调用Invalidate()方法激活Paint事件,再现时钟的仿真privatevoidForm1_Resize(objectsender,EventArgse){Invalidate();}

10.5MCI的媒体播放技术

可以播放波形音频(WAVE)、MIDI音频和视频(AVI)三种媒体,其中进程条显示播放的进度.

对媒体的MCI控制方式,构造一个MCI控制类:MCIClass。(2)将MCIClass类作为基类,编写一个基于对话框的播放器。(3)添加进程条,修改、完善播放器。完成系统开发的3步10.5.1预备知识:调用WindowsAPI

在VisualC#2005中调用WindowsAPI的做法必须使用DllImport语句。DllImport语句用来声明动态链接库〔DLL〕中外部程序的引用。例如,如何调用winmm.DLL中的mciSendString函数。(1)请在窗体的声明区域中编写以下程序代码,以便声明动态链接库winmm.DLL中外部程序的引用:[DllImport("winmm.dll",EntryPoint="mciSendStringA")]publicstaticexternboolmciSendString(stringa,sbyte[]b,uintc,uintd);(2)添加新的名字空间 usingSystem.Runtime.InteropServices;10.5.2MCI设备类型

使用MCI的应用程序通过指定MCI的设备类型来区分MCI设备.MCI设备可分为两类

(1)

简单设备─—描述简单MCI设备只需指定MCI设备名,如描述CD音频指定cdaudio。(2)

复合设备─—描述复合MCI设备不仅要说明设备类型,而且还要指定一个设备元素或媒体元素。10.5.3MCI命令字符串接口控制

应用程序通过向MCI设备发送命令来控制MCI设备。MCI命令可分为4类,向MCI发送命令的方法有两种:〔1〕调用MCI函数mciSendString〔〕,向MCI发送命令字符串。〔2〕调用MCI函数mciSendCommand〔〕,向MCI发送命令消息。MCIERRORmciSendString( LPCTSTRlpszCommand,//MCI命令字符串 LPTSTRlpszReturnString,//返回字符串 UINTcchReturn,//返回字符串的大小 HANDLEhwndCallback//回调窗口句柄 〕;函数原型

1.翻开媒体mciSendString("openDancing.avitypeavivideoaliasavivideo_ALIAS",szReturn,sizeof(szReturn),NULL);2.播放媒体mciSendString("playavivideo_ALIAS",szReturn,sizeof(szReturn),NULL);3.暂停播放charszReturn[30];mciSendString("pauseavivideo_ALIAS",szReturn,sizeof(szReturn),NULL);5.恢复播放mciSendString("resumeavivideo_ALIAS",szReturn,sizeof(szReturn),NULL);6.停止播放mciSendString("stopavivideo_ALIAS",szReturn,sizeof(szReturn),NULL);7.关闭mciSendString("closeavivideo_ALIAS",szReturn,sizeof(szReturn),NULL);10.5.4MCI应用例如(1)准备一个视频文件(比方Dancing.avi);(2)新建一个Windows应用程序工程,取名为MyMciPlay;(3)界面的可视化设计,即在窗体找添加“翻开〞、“播放〞和“关闭〞3个Button按钮;(4)声明动态链接库winmm.DLL中外部程序的引用:[DllImport("winmm.dll",EntryPoint="mciSendStringA")]publicstaticexternboolmciSendString(stringa,sbyte[]b,uintc,uintd);(5)添加对System.Runtime.InteropServices命名空间的引用;usingSystem.Runtime.InteropServices;(6)分别为“翻开〞、“播放〞和“关闭〞3个Button按钮,添加Click事件处理方法:10.5.4MCI应用例如(续)privatevoidbutton1_Click(objectsender,EventArgse){OpenFileDialogmyFileDlg=newOpenFileDialog();myFileDlg.Filter="Files*.avi|*.avi";if(myFileDlg.ShowDialog()==DialogResult.OK){sbyte[]szReturn=newsbyte[30];stringstrCmd="open";strCmd+=myFileDlg.FileName;strCmd+="typeavivideoaliasavivideo_ALIAS";mciSendString(strCmd,szReturn,30,0);}}10.5.4MCI应用例如(续)privatevoidbutton2_Click(objectsender,EventArgse){sbyte[]szReturn=newsbyte[30];stringstrCmd="playavivideo_ALIAS";mciSendString(strCmd,szReturn,30,0);}

privatevoidbutton4_Click(objectsender,EventArgse){sbyte[]szReturn=newsbyte[30];stringstrCmd="closeavivideo_ALIAS";mciSendString(strCmd,szReturn,30,0);}10.5.4MCI应用例如(续)编译、连接成功后,你就可以运行播放媒体了。首先单击“翻开〞按钮,再单击“播放〞按钮,程序就开始播放,如图10-14所示。你会发现:真奇妙!太棒了!10.6封装一个MCI控制类:CMCIClass

10.6.1CMCIClass类的设计1.数据成员用于描述类的内部性质,为了在其派生类中可见,设计为protected类型:①设备别名:CString m_strMediumAlias;②回调窗口句柄:HWND m_hWndCallback;③媒体翻开标记:BOOL mbMediumOpen;2.成员函数主要提供MCI操作接口:① 翻开媒体文件② 播放③ 暂停④ 关闭10.7媒体播放器10.7.1创立工程,设计用户界面(1)启动VisualStdio2005。从“文件〞菜单中选择“新建〞下的“工程〞,此时,VisualStdio2005将显示一个“新建工程〞对话框。(2)在“新建工程〞对话框中,选择工程位置和工程名称,工程名称为MyPlayer。单击“确定〞按钮就创立了一个Windows窗体应用程序。(3)参照图10-2用户界面,按表10-5在主窗体Form1添加控件并进行设置,设计好的窗体如图10-15所示。10.7.1创立工程,设计用户界面(续)对象属性属性值FormName,TextForm1,媒体播放器ButtonName,Text,EnabledButton_open,打开,TrueButtonName,Text,EnabledButton_play,播放,falseButtonName,Text,EnabledButton_play,关闭,falseRadioButtonName,TextRadioButtonAvi,AVIRadioButtonName,TextRadioButtoMid,MIDIRadioButtonName,TextRadioButtonWave,WAVEGroupBoxName,TextGroupBox1,媒体播放操作GroupBoxName,TextgroupBox2,选择媒体类型表10-5窗体Form1及其中各控件属性值

10.7.2实现播放功能

1.编程要点

(1)添加名字空间。(2)将CMCIClass类引入名字空间MyPlayer,并在Form1类创立CMCIClass实例。(3)添加“翻开〞、“播放〞和“关闭〞功能按钮控件的Click事件处理方法,并编写代码实现其相应的功能。将CMCIClass类引入名字空间MyPlayer,并在Form1类创立CMCIClass实例namespaceMyPlayer{ publicpartialclassForm1:Form {stringfileName;

CMCIClassmyMci=newCMCIClass();publicForm1(){ InitializeComponent();}…//省略其它成员方法 }

publicclassCMCIClass {privatestringm_strMediumAlias="";privateboolm_bMediumOpen=false; [DllImport("winmm.dll",EntryPoint="mciSendStringA")]publicstaticexternboolmciSendString(stringa,sbyte[]b,uintc,uintd);…//省略其它成员方法 }}

privatevoidbutton_open_Click(objectsender,EventArgse){OpenFileDialogFileDlg=newOpenFileDialog();if(radioButtonAvi.Checked==true)FileDlg.Filter="AviFiles(*.avi)|*.avi|AllFiles(*.*)|*.*";elseif(radioButtonMid.Checked==true)FileDlg.Filter="MdiFiles(*.mdi|*.mdi|AllFiles(*.*)|*.*";elseif(radioButtonWave.Checked==true)FileDlg.Filter="WaveFiles(*.wav)|*.wav|AllFiles(*.*)|*.*";if(FileDlg.ShowDialog()!=DialogResult.OK)return;fileName=FileDlg.FileName;char[]para={'.'};string[]FileExt=fileName.Split(para);if(FileExt[1]=="avi")myMci.Open(fileName,"avivideo","overlapped");elseif(FileExt[1]=="mdi")myMci.Open(fileName,"sequencer","");elseif(FileExt[1]=="wav")myMci.Open(fileName,"waveaudio","");

}

privatevoidbutton_play_Click(objectsender,EventArgse){myMci.Play("","");this.Text="正在播放"+fileName;}

privatevoidbutton_close_Click(objectsender,EventArgse){myMci.Close();this.Text="媒体播放器";}10.7.3为Mplayer添加进程条

1.进度条及相关控件的可视化设计

(1)在窗体Form1中,添加ProgressBar控件,并将Visible属性设为False,Enabled属性设为True,其它属性取默认值。(2)在窗体Form1中,添加Lable控件,用于显示进程的百分数值,属性取默认值。(3)在窗体Form1中,添加Timer控件,并将Text属性设为timer1,Interval设为100,Enabled属性设为false。2.操作进程条

设置数据格式和添加定时器(Timer控件)的Tick事件,并在Tick事件处理方法中,编写代码显示媒体播放的进度。

privatevoidbutton_open_Click(objectsender,EventArgse){…//省略myMci.SetTimeFormat("ms");//设置数据格式

progressBar1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论