基于MFC的MP3播放器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

研究生堂下考试答卷2011-2012学年第一学期考试科目面向对象方法(VC++)姓名于芳年级2011级专业电子与通信工程2010年12月18日1基于MFC的MP3播放器姓名:于芳学号:30125847569专业:通信工程摘要:多媒体技术的概念和应用出现于20世纪80年代初期,经过十余年的发展,随着计算机科学网络的普及和多媒体技术的发展,已成为计算机领域发展的热点技术,针对目前各种媒体格式,如何简单方便的播放各类媒体已成为人们普遍关注的问题。本设计就是基于面向对象技术,利用VC++6.0开发出适合多种格式的的多媒体MP3播放器。该播放器是基于MFC集成开发环境,利用系统的媒体控制接口MCI命令来编程,建立了一个MP3播放器的类CPLAYERDlg,通过调用这个类的函数来实现各种Windows音频格式文件的播放。它外观简洁,操作简便,支持的播放格式多、系统资源占用少、支持播放列表编辑等功能。关键词:MP3MFC面向对象设计VC++MCI一系统设计的基本原理与思路本设计的基本原理就是利用MFC应用程序以及媒体控制接口MCI的基本知识而设计的。Windows已经提供了一个关于多媒体处理的动态链接库WINMM.DLL,通过调用它所提供的API函数,就可以使用MCI指令进行多媒体方面的操作了。1.1MFC简介MFC是VisualC++是核心。MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFCAppWizard向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。这些函数,必须通过类定义对象才能使用。因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C++&MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价,因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的。1.2MCI简介MCI(MediaControlInterface)媒体控制接口,为各种多媒体设备,包括音频视频交错(AVI)重放、动画播放机、VCD、CD播放器以及声卡上的波形音频和合成器系统,提供了一个公共的接口。它的好处是可以方便地控制绝大多数2多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。它所支持的媒体格式包括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支持的各种音频文件。1.3设计的基本思路该设计的目的是制作一个简易的MP3播放器,使其具有以下基本功能:播放/暂停歌曲,加载/删除歌曲,上一首/下一首,停止歌曲,实现歌曲进度的实时数字和进度条显示。功能模块图如下:图1.1系统功能模块图MP3播放器主控制模块加载指定文件播放/暂停歌曲上一首下一首停止播放删除指定文件3知道了要做什么后,接下来就要部署改做些什么了:首先要解决的问题是弄清楚MCI函数与命令消息的名称类型和功能;其次是通过分析媒体播放的具体过程,在打开媒体设备的过程中应用程序需要做哪些事情,以便在应用程序中加入对这些过程支持的代码;在对应用程序的流程有了大致的轮廓以后,再开始考虑程序框架和应用程序外观的设计.最后,也是最关键的就是编写实现播放器的代码将播放器的基本功能实现,紧接着就是程序的调试和完善。二系统的总体设计与分析上面给出了本设计的总体设计目标,现在从用户角度分析系统整体要实现的功能及要完成的任务,并细化所有功能点,为每一功能但定义“需求描述”、“输入输出”。同时为方便后期设计、编码和测试。播放状态显示:1、用户界面能显示正在被播放歌曲的进度,显示歌曲的播放状态;2、用户能够显示播放与暂停的标志;3、显示被播放歌曲的歌名。播放控制:1、用户能够控制正在被播放歌曲的进度,能够控制歌曲停止、暂停与播放;2、用户能够查看播放列表内的歌曲;3、用户能够切换上一首和下一首歌曲。列表中歌曲管理:在歌曲列表中能够添加用户所需要的歌曲文件的文件名,并长期保存在该列表中直到用户删除该列表中的歌曲名。核心播放控制:完成歌曲播放最核心的部分,能够打开音频文件,并将其解码,然后启动音频硬件播放歌曲。通过对该设计系统的分析,把该设计分成3个模块进行设计,它们分别是:输入模块、处理模块和输出模块。其中输入模块里面主要负责打开文件的功能,供用户选择文件,处理模块负责对播放文件的播放,暂停,上/下首歌曲的切换,停止等必备功能,输出模块主要负责在显示屏上显示音频文件的播放进度以及播放歌曲名等功能。其总体设计流程图如下图所示:4图2.1系统总体设计流程图三程序设计框架与代码分析3.1界面布局设计(1)用MFCAppWizard(exe)创建一个基于对话框类的工程,命名为IDD_PLAYER_DIALOG,该对话框隶属于类CPlayerDlg。(2)向对话框中添加ListBox控件、Button控件以及Progress控件。(3)设置所添加的控件的属性。各控件属性如表3-1所示:MP3播放器主控模块输入模块处理模块输出模块选择文件打开文件播放暂停上一首下一首停止显示进度播放列表5表3-1对话框IDD_PLAYER_DIALOG的控件资源标识类型相关属性及功能说明IDC_PLAYPushButton播放/暂停歌曲IDC_STOPPushButton停止播放歌曲IDC_OPENPushButton打开文件对话框IDC_PERPushButton播放上一首歌曲IDC_NEXTPushButton播放下一首歌曲IDC_POPPushButton弹出/关闭播放文件的列表IDC_SDELPushButton删除指定歌曲IDC_BEXITPushButton退出程序IDC_BHELPPushButton帮助文件IDC_BMIMPushButton托盘管理IDC_PROGRESSProgressCtrl音频文件播放进度IDC_LISTListBox存放待播放歌曲的列表系统界面的运行结果图如图3.1所示:图3.1系统初始界面效果图3.2消息函数的映射及初始化3.2.1消息函数的建立首先利用ClassWizard为各控件添加系统消息响应函数。各控件的消息响应函数将实现播放器的各种功能,如打开音频文件、播放、暂停、停止等。添加的6各控件对应的消息响应函数如下表3-2所示:表3-2对话框IDD_PLAYER_DIALOG上控件对应的消息响应函数名称对应的控件对应的播放器功能OnPlay()IDC_PLAY开始/暂停播放歌曲OnStop()IDC_STOP停止播放歌曲OnOpen()IDC_OPEN打开文件对话框OnPer()IDC_PER跳到前一首歌曲OnNext()IDC_NEXT跳到下一首歌曲OnPop()IDC_POP弹出/关闭歌曲列表OnSdel()IDC_SDEL删除某首歌曲OnBexit()IDC_BEXIT退出程序OnBhelp()IDC_BHELP帮助对话框OnBmim()IDC_BMIM最小化窗口OnDblclkList()IDC_LIST双击List控件中的某项OnTimer(0计时触发器由于程序条用了MCI指令,因此在PLAYERDlg.h和PLAYERDlg.CPP的头文件中加入如下声明:#include“mmsystem.h”再在PLAYERDlg.h中加入消息函数所涉及的变量和函数:public:intm_max;//进度条的最大位置变量DWORDgetinfo(DWORDitem);//获取歌曲信息函数voidforfor1();//临时数组中的数据转移到源路径中voidforfor();//原数组中的数据转移到临时数组中inthour,minute,second;//时间变量:小时、分钟、秒钟DWORDcdlen;//某个音频文件的总时间长度DWORDm_count;//设备型号CStringaa;//当前播放文件的路径CStringfile[255];//存放所有待播放文件路径名的字符串数组CStringfile1[255];//存放所有待播放文件路径名的字符串数组1intfi,fr;//歌曲文件列表中,当前歌曲所在位置及最后一首歌曲所在位置DWORDcdfrom,cdto;//歌曲的起点和终点BOOLm_flag,m_flag3;//播放和弹出控件的状态标志3.2.2播放器程序主界面的初始化SetWindowText(MP3播放器);MoveWindow(320,160,540,350);//程序主界面在屏幕中的位置及大小m_flag=true;//为真则允许播放歌曲7m_flag3=true;//为真则允许弹出LIST控件m_progress.SetRange32(0,1000);//设置进度条的初始变化范围为0-1000m_progress.SetStep(2);//设置进度条每次向前移2个单位m_progress.SetPos(0);//设置进度条处于0位,这是进度条的初始状态m_max=0;//进度条的最大位置初始值为03.3各功能模块的设计3.3.1处理“播放/暂停”按钮当首次按下播放按钮时,将自动打开加载窗口,为列表中加入歌曲并播放,且此时播放按钮的显示切变为“暂停”,用变量aa来存放当前播放文件的路径,用m_flag变量来标识“播放”和“暂停”:if(m_flag&&aa!=)//判断是否按下播放键m_flag=false;//播放的标志GetDlgItem(IDC_PLAY)-SetWindowText(暂停);//播放按钮的显示变为暂停当按下“播放”按钮时,在OnPlay()函数中,通过调用MCI接口对象的open和play命令来获取播放路径以及文件类型:MCI_OPEN_PARMSmciopenparms;//打开MCI_PLAY_PARMSmciplayparms;//播放mciopenparms.lpstrElementName=aa;//播放路径mciopenparms.lpstrDeviceType=NULL;//文件类型向MCI设备发送命令消息,包括歌曲文件的类型和路径:mciSendCommand(0,MCI_OPEN,MCI_DEVTYPE_WAVEFORM_AUDIO,(DWORD)(LPVOID)&mciopenparms);m_count=mciopenparms.wDeviceID;//多媒体设备类型编号启动计数器,使歌曲时间得到同步显示:SetTimer(0,1000,NULL);当再次按下“播放”时,软件处理为“暂停”事件并保存当前音乐播放进度:KillTimer(0);//取消计数器DWORDdwsf=getinfo(MCI_STATUS_POSITION);//暂停播

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功