可换肤透明皮肤MP3播放器.doc_第1页
可换肤透明皮肤MP3播放器.doc_第2页
可换肤透明皮肤MP3播放器.doc_第3页
可换肤透明皮肤MP3播放器.doc_第4页
可换肤透明皮肤MP3播放器.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

目录目录1概述31.1课程设计目的31.2设计任务及要求41.3开发环境41.4可行性分析52 系统设计的基本概念与原理62.1基本概念与知识62.1.1 MFC简介62.1.2 MCI简介72.2系统设计实现的基本原理与过程72.2.1基本原理72.2.1过程概要83系统的总体设计与分析83.1播放器需求分析与功能设计83.2子系统与模块设计设计94 系统详细设计与实现114.1新工程的创建与对话框构架的搭建114.2外部类CButtonST的添加124.2.1 CButtonST类简介124.2.2添加步骤124.3动态连接库124.4添加位图格式图片134.5添加成员变量144.5.1控件变量的添加144.5.2位图变量的添加154.5.3其他类型全局变量的添加164.6具体功能函数的实现174.6.1 打开播放文件174.6.2 处理删除歌曲文件按钮184.6.3 处理播放按钮184.6.4 处理暂停/播放按钮194.6.5处理停止按钮204.6.6 处理上一曲按钮214.5.7处理下一曲按钮224.6.8处理双击歌曲列表中的歌曲名字244.6.9处理进度条244.6.10处理音量控制条254.6.11处理下一曲按钮264.6.11处理下一曲按钮264.6.12初始化播放对话框284.6.13处理背景的更换324.6.14处理背景色相统一355 系统调试与运行375.1 测试方法375.2 系统的运行于测试375.2.1 主界面375.2.2 打开,删除文件385.2.3 播放,暂停/继续播放文件395.2.4 停止播放,进度,音量测试测试395.2.5 换肤405.3 测试结果分析416 课程设计总结427 参考文献431概述摘要 多媒体技术的概念和应用出现于20世纪80年代初期,经过十多年的发展,随着计算机科学网络的普及和多媒体技术的发展,已成为计算机领域发展的热点技术,针对目前各种媒体格式,如何简单方便的播放各类媒体已成为人们普遍关注的问题,而媒体播放器的开发也变得十分重要。本课程设计就是基于面向对象的, 利用vc+6.0开发出适合AVI的多媒体播放器。该播放器是基于MFC集成开发环境,利用系统的MCI(media controller interface)命令接口来编程,具有体积小,支持的播放格式多、系统资源占用少、支持播放列表编辑等功能优势。关键词 程序设计;MCI;C+;音乐播放器;1.1课程设计目的本课程设计通过对Windows API的多媒体和资源文件的高层控制MCI进行封装,建立了一个MP3播放器的类CMP3Dlg,使得我们不必研究MCI的内部函数,轻松调用CMP3Dlg类的函数,就能实现播放WAV、MID、MP3等Windows音频格式的文件,可以管理本地音乐库的MP3播放器,并且可以实现换肤功能。1、通过本次课程设计,熟练掌握一种开发语言(Java或C+、C#)和开发环境Eclipse或.NET。开发语言的熟练需要通过编写一定长度的代码(10002000行代码)才能达到,开发环境的熟练需要反复的程序调试训练。2、加深对软件工程的理解,训练编写程序的良好习惯。包括:认真编写需求分析文档、做好系统功能设计、学会自己进行程序的算法、数据结构设计、3、培养良好的程序设计风格(模块划分、接口设计、函数和变量命名规则)和习惯(程序备份、版本更新与控制),提高软件测试、调试的能力与技巧。通过本次课程设计,应该达到具有独立完成小型应用设计的能力,具备编写较为规范的软件设计文档的能力。1.2设计任务及要求本设计实现一个基于MFC(exe)的windows应用程序。在MFC之中通过添加类向导添加对话框类实现程序的框架,并添加对播放起到辅助作用的类实现整个程序结构。本主要利用设计MCI(Media Control Interface)媒体控制接口实现播放器的播放,暂停/继续播放,停止等功能。在此基础上用户还可以对歌曲列表进行管理,包括添加和删除等功能。还实现了皮肤更换的功能。1.3开发环境列出开发工具、程序运行的支持环境(操作系统、数据库等)。操作系统:Windows 7简体中文版开发平台:Visual studio 6.0简体中文版开发平台介绍:Visual C+6.0。它是微软公司推出的开发Win32应用程序(Windows 95/98/2000/XP/NT),面向对象的可视化集成工具。它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C+类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。MFC (Microsoft Foundation Class ) 是用来编写Windows 应用程序的C+类集,其中封装了分之所以Windows API 函数和Windows 控件,使用MFC 类库和Visual C+提供的高度可视的应用程序开发工具,可使应用程序开发变得简单,提高代码的可靠性和可重用性。随着多媒体性能的极大提升,程序中经常要播放一段视频或者一段音频,如果能够简单地插入音频和视频,将极大缩短程序的开发时间。本文基于MFC 在Visual C+环境下利用Windows Media Player 控件实现了音频视频文件的播放。Visual C+作为开发工具,不仅仅因为曾经有过使用它的经验,看中的更是它的功能强大和使用方便。它本身不仅具有极其强大的编程能力,它允许选择和管理外接程序,并内含多种实用控件,这些对Visual C+的扩充又进一步增强了它的开发环境的能力。1.4可行性分析1 经济,人员可行性:本次课程设计设计属于个人开发,无需过大的资金投入,所以经济上是可行的。本次课程设计要求单独完成,人员方面的因素早已考虑好,也不存在什么问题。2 技术可行性:VC+6.0中文版作为一个关系型数据库系统,它提供了面向对象的编程技术,可简化数据库管理,使开发应用程序这艰辛的工作就象堆木那样简单方便.另外, VC+6.0中文版开发的应用程序可以独立运行于WINDOWS平台. VC+6.0中文版,它是运行于W indows95/98和Window XP平台32位数据库系统,充分发挥了32位微处理器强大的32位数据处理性能.它功能强大,直观易用,支持客户/服务器结构和面向对象编程,提供多种可视化编程工具,支持最新Internet技术,WWW数据库的设计,最新流行的ActiveX 等。 VC+6.0中文版完全支持OOP(面向对象)的应用程序设计方法,VC+6.0使用了真正的类,包括继承性,封装性和多态性,用可视方式创建类,查看类及类代码;利用表单向导进行专业级界面设计;对表关系进行可视化查看;可利用OLE自动化来包含其他软件(如Excel, word)中的对象并使用这些软件。通过VC+6.0对象和事件模型,用户可以快速创建和实现无模式(Modeless)的应用程序;利用生成器和工具栏,开发人员可以快速开发应用程序,而省去编写大量的代码、定义繁多的属性。总之,VC+6.0中文版是一种适用于专业人员的开发工具经过以上的分析,对于我要实现的功能,MFC完全可以胜任,所以设计基本可以完成。2 系统设计的基本概念与原理2.1基本概念与知识MP3播放器的设计是利用MFC应用程序、媒体控制接口MIC的基本知识而设计的。2.1.1 MFC简介MFC是Visual C+是核心。MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFC AppWizard向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。每个MFC类都包括了一些函数,函数放到类中,符合C+编程方法。这些函数,必须通过类定义对象才能使用。因为 MFC 是对 API 的封装,微软做了大量的工作,隐藏了好多程序开发人员在 Windows 下用 C+ & MFC 编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价,因此就造成了 MFC 对类封装中的一定程度的的冗余和迂回,但这是可以接受的。2.1.2 MCI简介MCI(Media Control Interface)媒体控制接口,为各种多媒体设备,包括音频视频交错(AVI)重放、动画播放机、VCD、CD播放器以及声卡上的波形音频和合成器系统,提供了一个公共的接口。它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。它所支持的媒体格式包括AVI、WAV、MPEG、CD、VCD、MID等全部Windows音频格式的文件。用MCI函数可以给上述的任何一种设备发出命令,告诉它们开始、结束、暂停、倒退、快进等就像按动MP3播放器面板上的按钮一样。每一个设备的特殊命令依赖于设备本身的功能。实际上MCI是一个高级的函数调用接口,可以把它看作一个解释器,通过它,就可以直接和外部音频或视频设备打交道了。必须注意的是,在MCI工作过程中,需要在指令中调用API函数,这样才能实现应用设备与多媒体设备连接。与MCI有关的API,即mciSendString()、mciExecute()和mciGetErrorString()。mciSendString函数的功能是传送指令字符串给MCI;mciExecute的功能和mciSendString一样,不同的是当发生错误时mciExecute会弹出对话框显示错误信息;mciGetErrorString的功能是将MCI错误代码转换为字符串。在本设计中,将会说明如何用MCI和API函数编程实现播放Windows支持的各种音频文件。2.2系统设计实现的基本原理与过程2.2.1基本原理本课程设计中,将会说明如何用MCI和API函数编程实现播放Windows支持的各种音频文件。MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。它所支持的媒体格式包括avi、wav、mpeg等等。音频技术发展较早,几年前一些技术已经成熟并产品化,音频技术主要包括四个方面:音频数字化、语音处理、语音合成及语音识别。音频文件包括多种格式的文件,MP3就是其中的一种。MP3的全称是Moving Picture Experts Group,Audio Layer ,它所使用的技术是在VCD(MPEG-1)的音频压缩技术上发展出的第三代,而不是MPEG-3。MP3是一种音频压缩的国际技术标准,它一般需要MP3播放器来读取。2.2.1过程概要1基本知识的补充,弄清楚如何使用MCI,掌握各个MCI函数的名称命令功能等,了解各种换肤实现原理,并掌握其中一到两种。 2分析媒体播放的具体过程,在打开媒体设备的过程中应用程序需要做哪些事情,以便在应用程序中加入对这些过程支持的代码;在对应用程序的流程有了大致的轮廓以后,再开始考虑程序框架和应用程序外观的设计.3 也是最关键的就是编写实现播放器的代码将播放器的基本功能实现,拓展功能的实现,界面的美化。4程序的调试和完善。3系统的总体设计与分析3.1播放器需求分析与功能设计本章主要讨论了系统的需求分析,从用户角度分析系统整体要实现的功能及要完成的任务,并细化所有功能点。本MP3系统实现了以下基本功能:实现基本的播放、暂停/继续播放、停止,上一曲,下一曲功能;对于本设计,还实现了用户自定义列表的功能,能够进行增删操作,实现了换肤功能,用户可以自由选择系统提供的皮肤进行更改。播放状态显示:(1)用户界面能显示正在被播放歌曲的进度,显示歌曲的播放时间。(2)显示被播放歌曲的歌名。播放控制:(1)用户能够通过进度条控制正在被播放歌曲的进度,能够控制歌曲停止、暂停与播放。(2)用户能够查看播放列表内的歌曲。(3)用户能够切换上一首和下一首歌曲。列表中歌曲管理:(1)在歌曲列表中能够添加用户所需要的歌曲文件的文件名,并长期保存在该列表中直到用户删除该列表中的歌曲名。音量控制:(1)用户可以通过音量滑块进行音量的调节。皮肤管理:(1)用户可以根据界面上提供的皮肤名称选择想替换的皮肤,而且实现空间皮肤透明效果。3.2子系统与模块设计设计通过对该设计系统的分析,把该设计分成3个模块进行设计,它们分别是:输入模块、处理模块和输出模块。其中输入模块里面主要负责打开文件的功能,供用户选择文件,处理模块负责对播放文件的播放, 暂停,上/下首歌曲的切换,停止,音量控制,换肤等功能,输出模块主要负责在显示屏上显示音频文件的播放进度,播放时间,以及播放歌曲名等功能。功能模块图如下所示:图3.2 系统总体设计模块MP3播放系统选择文件输出模块处理模块输入模块打开文件播放列表进度显示播放暂停/继续上一首下一首停止音量控制换肤4 系统详细设计与实现4.1新工程的创建与对话框构架的搭建(1) 用MFC AppWizard(exe)创建一个基于对话框类的工程,命名为IDD_MP3_DIALOG,该对话框隶属于类CMPDlg。(2) 向对话框中添加List Box控件、Button控件以及COMBO控件,SLIDER控件,STATIC控件。(3) 设置所添加的控件的属性,调整各控件的大小和相对位置。如下图4-1所示,各个控件属性如表4-1所示。图4-1 各控件的大小和相对位置表4-1 对话框IDD_PLAYER_DIALOG的控件资源标识类型相关属性及功能说明IDC_BUTTON_PLAYPush Button播放歌曲IDC_BUTTON_STOPPush Button停止播放歌曲IDC_BUTTON_OPENPush Button打开文件对话框并添加歌曲IDC_BUTTON_PreviousPush Button播放上一首歌曲IDC_BUTTON_NEXTPush Button播放下一首歌曲IDC_BUTTON_DELETPush Button删除指定歌曲IDC_BUTTON_PAUSEPush Button暂停/继续播放歌曲IDC_BUTTON_VOLUMEPush Button标志声音控件IDC_SLIDER1Slider控制与显示进度IDC_SLIDER2ProgressCtrl控制声音IDC_LIST_INFOList Box显示播放歌曲信息IDC_LIST1List Box歌曲列表IDC_COMBO1Combo 选择皮肤4.2外部类CButtonST的添加4.2.1 CButtonST类简介CButtonST是功能强大,全面的CButton派生类,利用CButtonS类可以制作出各种类型且漂亮的按钮,而且实现方法简单,可以节省各种资源。CButtonST类主要包括BtnST.h、BtnST.cpp、BCMenu.h和BCMenu.cpp四个文件。4.2.2添加步骤(1) 将BtnST.h、BtnST.cpp、BCMenu.h和BCMenu.cpp四个文件。先将上述4个文件复制到自己的工程,然后在VC+开发环境中打开该工程,选择【ProjectAdd to ProjectFiles】,会弹出向工程插入文件的对话框,然后在工程所在目录选择上述4个文件,点击【OK】按钮,添加4个文件到当前工程。(2) 将头文件BtnST.h添加到MP3Dlg.h文件中。4.3动态连接库(1)单击工程菜单中的设置命令,打开Project Setting对话框,单击连接选项卡,在对象/库模块中加入winmm.lib。如图4-3所示。 图4-3 加入多媒体处理的动态链接库 (2)在头文件MP3.h与MP3Dlg.h中加入头文件mmsystem.h4.4添加位图格式图片 添加主对话框和各个控件的图片,以及换肤所需位图。本课程设计使界面美观大方。界面位图按钮的实现是通过CButtonST类编程将不同的Bitmap图片覆盖到对应的按钮控件上,背景换肤的实现通过paint()函数实现。因此,需要在Resouce资源中添加Bitmap图片。在工具栏中单击插入-资源Bitmap引入,在本地文件中选择准备好的位图资源,向工程中添加对应位图。各位图如表43所示。表4-4 添加位图说明位图ID描述IDB_BITMAP_VOLUME声音滑块调节位图标志IDB_BITMAP_STOP停止按钮位图IDB_BITMAP_Previous前一首按钮位图IDB_BITMAP_PLAY播放按钮位图IDB_BITMAP_PAUSE暂停/继续播放按钮位图IDB_BITMAP_OPEN添加按钮位图IDB_BITMAP_NEXT下一首按钮位图IDB_BITMAP_DELETE删除指定列表歌曲按钮位图IDB_BITMAP_CLOSE退出按钮位图IDB_BITMAP_DBK1初始化对话框背景位图IDB_BITMAP_BK2皮肤位图1IDB_BITMAP_BK3皮肤位图2IDB_BITMAP_BK4皮肤位图3IDB_BITMAP_BK5皮肤位图4IDB_BITMAP_BK6皮肤位图54.5添加成员变量4.5.1控件变量的添加 按钮控件用CButtonST类添加图片,所以不用向导类添加,直接在MP3Dlg类中添加,所有按钮控件的变量类型都属于CButtonST类,目的在于往上添加位图。其它控件利用类向导添加所需变量。各个空间变量如表4-5-1所示。表4-5-1 各个控件成员变量说明控件ID类型成员变量名IDC_COMBO1CComboBoxm_BKIDC_LIST_INFOCListBoxm_ListINFOIDC_SLIDER1CSliderCtrlm_PositionIDC_SLIDER2CSliderCtrlm_volumeIDC_LIST1CListboxm_ListIDC_BUTTON_PLAYCButtonSTbk_playIDC_BUTTON_PreviousCButtonSTbk_previousIDC_BUTTON_PAUSECButtonSTbk_pauseIDC_BUTTON_NEXTCButtonSTbk_nextIDC_BUTTON_STOPCButtonSTbk_stopIDC_BUTTON_DELETCButtonSTbk_deletIDC_BUTTON_OPENCButtonSTbk_openIDOKCButtonSTbk_closeIDC_BUTTON_VOLUMECButtonSTbk_volume4.5.2位图变量的添加 本设计中对话框的背景总共用到了六个位图资源,其中一个是初始化时替换替换的原本对话框的灰色背景,其他都用于换肤时候使用。由于本设计采用透明控件设计,为配合换肤时对话框中控件背景的统一,为每个位图创建一个刷子类型变量,再为每个皮肤位图创建一个位图类型变量。具体变量说明如表4-5-2所示。表4-5-2 位图资源的变量说明位图ID变量类型变量名IDB_BITMAP_DBK1CBrushm_brBKIDB_BITMAP_BK2CBrushm_brBK1IDB_BITMAP_BK3CBrushm_brBK2IDB_BITMAP_BK4CBrushm_brBK3IDB_BITMAP_BK5CBrushm_brBK4IDB_BITMAP_BK6CBrushm_brBK6IDB_BITMAP_BK2CBitmapbitMap2IDB_BITMAP_BK3CBitmapbitMap3IDB_BITMAP_BK4CBitmapbitMap4IDB_BITMAP_BK5CBitmapbitMap5IDB_BITMAP_BK6CBitmapbitMap64.5.3其他类型全局变量的添加 除了上述两种特殊全局变量,为了程序添加的其他全局变量的类型和说明如表4-4-3所示。表4-4-3 其他全局变量的类型和说明变量类型变量名说明bool stopflag判断是否按下停止状态按钮int bkflag判断选择哪一个皮肤 int second秒钟 int minute分钟 CString strFileName打开文件的名字 int hour小时 bool isPause是否处于暂停状态 unsigned long m_dLength正在播放的文件的长度 WORD m_wDeviceIDMCI打开的设备 DWORD dCurrentPosition当前播放歌曲的当前播放播放位置MIXERCONTROLDETAILS_SIGNED volStruct通过滑块调节音量MIXERCONTROLDETAILS mxcd音量控制结构 MIXERLINECONTROLS mxlc控制线信息 MIXERLINE mxl音频设备的信息 MIXERCONTROL mxc控制类型 HMIXER m_hmx当前混合器的句柄4.6具体功能函数的实现4.6.1 打开播放文件 (1)利用向导类,在类CMP3Dlg中为添加文件按钮IDC_BUTTON_OPEN添加响应消息BN_CLICKED。命名为函数OnButtonOpen。 (2)向函数OnButtonOpen添加如下代码:void CMP3Dlg:OnButtonOpen() char szFileFilter=Mp3 File(.*mp3)|*.mp3|/mp3格式Wma File(.*wma)|*.wma|/wma格式Video File(.*dat)|*.dat|/dat格式Wave File(.*wav)|*.wav)|/wav格式All File(*.*)|*.*|;/文件类型过滤 CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);if(dlg.DoModal()=IDOK)/点击打开 CString FileName=dlg.GetFileName();/得到打开文件名字FileName.MakeUpper();/名字大写显示m_List.InsertString(-1,FileName);/插入播放列表末端 (3)代码说明:该函数实现了从本地文件夹中添加歌曲的功能,当单击确认按钮后,得到选择的文件名字,并利用m_List调用InsertString()函数将文件名添加到播放列表中。4.6.2 处理删除歌曲文件按钮(1)利用向导类,在类CMP3Dlg中为删除文件按钮IDC_BUTTON_DELET添加响应消息BN_CLICKED。命名为函数OnButtonDelet。(2)向函数OnButtonDelet添加如下代码:void CMP3Dlg:OnButtonDelet() m_ListINFO.DeleteString(0);/删除选择播放歌曲信息int nIndex=m_List.GetCurSel();/得到选择想要删除的歌曲的索引号/删除选择的歌曲信息if(nIndex!=CB_ERR) m_List.DeleteString(nIndex);/删除选中的歌曲 (3)代码函数说明:因为选择相应的歌曲后,会把歌曲信息展示在信息列表中,所以删除歌曲列表中的歌曲后,信息列表中的也要清除,删除歌曲文件后,如果正在播放该歌曲,则要关闭该歌曲,故发送关闭命令给相应设备。4.6.3 处理播放按钮(1)利用向导类,在类CMP3Dlg中为播放文件按钮IDC_BUTTON_PLAY添加响应消息BN_CLICKED。命名为函数OnButtonPlay。(2)向函数OnButtonPlay添加如下代码:void CMP3Dlg:OnButtonPlay() stopflag=0;isPause=TRUE;SetTimer(1,33,NULL);/设定时间mciSendCommand(m_wDeviceID,MCI_CLOSE,0,NULL);/关闭当前正在播放歌曲MCI_OPEN_PARMS mciOpen; MCI_PLAY_PARMS mciPlay;mciOpen.lpstrElementName=strFileName.GetBuffer(strFileName.GetLength();/得到播放文件名字mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpen);/打开设备m_wDeviceID=mciOpen.wDeviceID;/得到设备IDMCI_STATUS_PARMS mciStatusParms;mciStatusParms.dwItem=MCI_STATUS_LENGTH;/得到文件长度mciSendCommand(m_wDeviceID,MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);/获取文件信息m_dLength=mciStatusParms.dwReturn;/得到文件长度mciSendCommand(m_wDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&mciPlay);/播放文件 m_Position.SetRange(0,m_dLength);/设置进度条范围m_Position.SetPos(0);/设置起始位置为0 (3)函数代码说明:该函数利用MCI的MCI_OPEN_PARMS,MCI_PLAY_PARMSMCI_STATUS_PARMS三个结构体,将播放文件的相应信息填入该结构体中。并且利用MCI函数mciSendCommand函数,先打开设备,再利用该函数播放文件,然后设置进度条的范围与起始位置。进度条的具体实现会在后面说明。4.6.4 处理暂停/播放按钮(1)利用向导类,在类CMP3Dlg中为暂停/播放文件按钮IDC_BUTTON_PAUSE添加响应消息BN_CLICKED。命名为函数OnButtonPause。(2)向函数OnButtonOpen添加如下代码:void CMP3Dlg:OnButtonPause() if(isPause=TRUE)/如果是暂停命令,怎发送暂停命令 isPause=FALSE; MCI_GENERIC_PARMS mciPause; mciSendCommand(m_wDeviceID,MCI_PAUSE,0,(DWORD)(LPVOID)&mciPause);/暂停播放文件 else/如果处于暂停状态,则发送继续播放的命令 isPause=TRUE; MCI_STATUS_PARMS mciStatusParms; MCI_PLAY_PARMS mciPlayParms; mciStatusParms.dwItem=MCI_STATUS_POSITION;/设置得到当前播放文件播放位置 mciSendCommand(m_wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);/获的当前播放位置 dCurrentPosition=mciStatusParms.dwReturn; mciPlayParms.dwFrom=dCurrentPosition;/文件继续播放位置 mciSendCommand(m_wDeviceID,MCI_PLAY,MCI_FROM,(DWORD)(LPVOID)&mciPlayParms);/从暂停位置继续播放 (3)函数代码说明:该按钮实现暂停后,可以继续播放的功能。所以设定一个布尔判断值isPause若该值为真则表示用户发送暂停命令,否则表示继续播放,处理暂停时直接用mciSendCommand函数发送暂停命令,处理继续播放时候用MCI函数得到当前暂停歌曲的位置,使得播放时候继续从该位置往下播放。4.6.5处理停止按钮(1)利用向导类,在类CMP3Dlg中为停止播放文件按钮IDC_BUTTON_STOP添加响应消息BN_CLICKED。命名为函数OnButtonStope。(2)向函数OnButtonStope添加如下代码:void CMP3Dlg:OnButtonStop() mciSendCommand(m_wDeviceID,MCI_STOP,0,NULL);/发送停止播放命令stopflag=1;/使得停止标志为真,表示处于停止状态 (3)函数代码说明:直接用MCI发送命令,使得设备停止播放文件,停止标志的使用主要是为了时间与进度条的设置,后面将会有说明。4.6.6 处理上一曲按钮(1)利用向导类,在类CMP3Dlg中为停止播放文件按钮IDC_BUTTON_Previous添加响应消息BN_CLICKED。命名为函数OnButtonPrevious。(2)向函数OnButtonPrevious添加如下代码:void CMP3Dlg:OnBUTTONPrevious() stopflag=0;isPause=TRUE;int Index;Index=m_List.GetCurSel();/得到当前播放歌曲在歌曲列表中的索引号 MCI_OPEN_PARMS mciOpenParms;MCI_PLAY_PARMS mciPlayParms;if(Index=0)/如果这是歌曲列表中的第一首歌则重行播放该歌曲mciSendCommand(m_wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL);/开始位置mciSendCommand(m_wDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&mciPlayParms);/从开始位置播放else Index-;/索引号减一 mciSendCommand(m_wDeviceID,MCI_CLOSE,0,NULL); m_List.SetCurSel(Index);/定位到上一首歌曲 strFileName=; m_List.GetText(Index,strFileName);/使得歌曲文件名为该定位歌曲 m_ListINFO.DeleteString(0);/删除播放信息列表中的信息 m_ListINFO.AddString(strFileName);/加入新的信息 /打开设备,播放文件 mciOpenParms.lpstrElementName=strFileName.GetBuffer(strFileName.GetLength();/文件名字 mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms); m_wDeviceID=mciOpenParms.wDeviceID;/设备ID mciSendCommand(m_wDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&mciPlayParms);/播放打开文件 /得到歌曲文件的长度,并设置进度条范围 MCI_STATUS_PARMS mciStatusParms;mciStatusParms.dwItem=MCI_STATUS_LENGTH;/文件长度mciSendCommand(m_wDeviceID,MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);/发送得到长度命令m_dLength=mciStatusParms.dwReturn;/得到文件长度 m_Position.SetRange(0,m_dLength);/设定进度条位置m_Position.SetPos(0);/进度条初始位置为0(3)函数代码说明:该函数实现了单击上一首按钮后,定位到上一首并自动播放,同时更改歌曲显示列表中的信息,并重新设定进度条的长度。首先使用GetCurSel函数的到当前的播放个歌曲索引号,并进行判断,如果是第一首歌曲则重行播放该歌曲。若不是则得到上一首索引号,利用该索引号得到播放文件名字,利用MCI打开相应的设备播放上一首,并且使用播放信息列表成员m_ListINFO调用相应的函数删除原来的信息同时把这一首的歌曲名字添加到相应的列表显示框中。在这里就利用MCI得到该歌曲的长度,直接重新设置进度条的范围。4.5.7处理下一曲按钮(1)利用向导类,在类CMP3Dlg中为停止播放文件按钮IDC_BUTTON_NEXT添加响应消息BN_CLICKED。命名为函数OnButtonNext。(2)向函数OnButtonNext添加如下代码:void CMP3Dlg:OnButtonNext() stopflag=0;isPause=TRUE;int Index;Index=m_List.GetCurSel();/获得当前的歌曲搜引号 MCI_OPEN_PARMS mciOpenParms;MCI_PLAY_PARMS mciPlayParms;Index+;/下一首索引号 /若下一首是最后一首则继续播放该歌曲if(m_List.SetCurSel(Index)=LB_ERR) mciSendCommand(m_wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL);mciSendCommand(m_wDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&mciPlayParms);/开始播放/如果不是最后一首则往下播放else mciSendCommand(m_wDeviceID,MCI_CLOSE,0,NULL);/关闭当前播放文件 m_List.SetCurSel(Index);/使得选中文件高亮显示 strFileName=; m_List.GetText(Index,strFileName);/得到歌曲的名字 m_ListINFO.DeleteString(0);/删除原来的播放信息 m_ListINFO.AddString(strFileName);/加入新的信息 /利用MCI打开设备并播放歌曲播放 mciOpenParms.lpstrElementName=strFileName.GetBuffer(strFileName.GetLength();/设定播放文件名字 mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);/播放文件 m_wDeviceID=mciOpenParms.wDeviceID; mciSendCommand(m_wDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&mciPlayParms);/开始播放 /得到歌曲的长度,并重新设置进度条 MCI_STATUS_PARMS mciStatusParms;mciStatusParms.dwItem=MCI_STATUS_LENGTH;/歌曲长度mciSendCommand(m_wDeviceID,MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);/发送得到长度命令m_dLength=mciStatusParms.dwReturn; m_Position.SetRange(0,m_dLength);设定进度条范围m_Position.SetPos(0);/初始化为0(3)函数代码说明:该下一曲的功能与上一曲的功能大同小异,同样先得到当前播放歌曲的索引号,判断,如果是最后一曲则继续播放该歌曲,如果不是则索引号加一,并利用函数GetTxt得到文件名字,利用MCI打开相应的设备,并播放该歌曲文件。同时要修改播放信息中的歌曲文件名字,修改进度条的长度,这里前面说的比较详细,就不再赘述。4.6.8处理双击歌曲列表中的歌曲名字(1)利用向导类,在类CMP3Dlg中为IDC_LIST1 T添加响应消息BN_DBLCLK。命名为函数OnDblclkList1。(2)向函数OnDblclkList1添加如下代码:void CMP3Dlg:OnDblclkList1() OnButtonPlay();/直接调用播放函数 (3)函数代码说明:当双击歌曲列表中的函数名字时候,直接调用播放函数播放相应的歌曲。4.6.9处理进度条(1)利用向导类,在类CMP3Dlg中为进度条添加响应消息OnHScroll。命名为函数OnHScroll。使得用户可以通过进度条执行快进,后退等功能。(2)向函数OnHScroll添加如下代码:void CMP3Dlg:OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) MCI_PLAY_PARMS mciPlayParms; dCurrentPosition=m_Position.GetPos();/得到滑块的位置 mciPlayParms.dwFrom=dCurrentPosition; /从当前滑块位置开始播放mciSendCommand(m_wDeviceID,MCI_PLAY,MCI_FROM,(DWORD)(LPVOID)&mciPlayParms); /进度条与时间紧密相连,所以更新显示时间 int ws = m_Position.GetPos() / 1000;/进度条位置除以1000hour = ws / 3600, /小时minute = (ws % 3600) / 60, /分钟second = (ws % 3600) % 60);/秒钟CDialog:OnHScroll(nSBCode, nPos, pScrollBar); (3)函数代码说明:该函数可以使用户通过点击进度条上相应的位置,后拖动滑块进行前进和快退等功能,通过GetPos得到用户设定播放的位置,利用该位置与歌曲的相应位置相联系,利用MCI函数实现从该处开始

温馨提示

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

评论

0/150

提交评论