《基于MFC多媒体播放器(共31页).doc》由会员分享,可在线阅读,更多相关《基于MFC多媒体播放器(共31页).doc(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上C/C课程设计项目报告目 录 1.3 开发人员及职责.12 需求分析.12.1 功能需求.12.2 性能需求.23 系统设计.33.1 代码设计.33.2 流程图.134 系统实现及测试.175 项目总结.205.1 总体总结.205.2 个人总结.21专心-专注-专业1 项目简介1.1 项目名称多媒体播放器1.2 功能概述此款媒体播放器项目具有以下功能:(1)本地设定目录中包含音频文件的浏览和播放(支持mp3格式)。(2)本地设定目录中包含图片文件的浏览(支持bmp格式)。(3)本地设定目录中包含视频文件的浏览和播放(支持mp4格式)。(4)最近播放列表功能,保存最
2、近播放的10个文件,保存最近追加的10个文件。视频,音频,图片是分开的,都有最近播放列表和最近追加列表。1.3 开发人员及职责负责视频模块,以及最后的模块整合,报告的编写负责音频模块,报告的编写负责图片模块,报告的编写2 需求分析 2.1. 功能需求本设计将要实现的是一个单机多媒体播放器,可以对音频、视频、图片进行查看。从其目标功能及特点分析,将本软件功能划分如下:(1) 视频播放器: 可以打开MP4格式的视频文件。在本地文件夹中将MP4格式的视频文件添加至播放列表,点击播放,或双击列表里的所选项目,就可跳转至视频播放窗口。 在播放窗口里,查看视频时,有“播放”,“暂停”,“停止”功能。播放中
3、,还有“前进”,“后退”功能,即快进快退功能,以4秒为一个单位,这个单位也可以在代码中进行修改。在观看视频时,还有“上一曲,下一曲”功能,即查看之前添加在播放列表里的视频项。同时,也可以选择播放模式“循环,顺序,随机”,该功能也是基于播放列表实现的。在右边功能键里,还有音量调节,静音功能。除此以外,还可以进行全屏浏览,按“ESC”退出全屏。在主页面,还有两个数据框“最近追加项目”和“最近播放项目”,可以直观地看到最近播放项目,且可以手动清空所有项目。这两个列表只按照时间,保存最近的项目,且最多保存10个。(2) 音频播放器可以打开MP3格式的音频。在本地文件夹中将MP3格式的视频文件添加至播放
4、列表,点击播放,或双击列表里的所选项目,就可跳转至音频播放窗口。并且,在主窗口,还有两个数据框“最近追加项目”和“最近播放项目”,可以直观地看到最近播放项目,且可以手动清空所有项目。这两个列表只按照时间,保存最近的项目,且最多保存10个。(此处为该多媒体公共窗口,功能相同,下面的图片浏览器也是一样的。)在播放窗口里,听取音频时,有“播放”,“暂停”,“停止”功能。同样也会有“前进,后退”功能,“上一曲,下一曲”功能,播放模式中的“循环,顺序,随机”,这些功能与上面所述的视频播放器相同。(3) 图片浏览器 可以打开BMP格式的图片。主窗口同视频、音频播放器一样,在此不多赘述。在浏览图片窗口中,会
5、有“上一张,下一张”功能键,可以在“播放列表,最近播放项目,最近追加项目”任何一个列表中循环,可以自由选择。当图片浏览到所选列表的最后一张时,会自动循环至列表第一张。(4)在主窗口的中,在列表中已添加文件后,有两种方式可以打开文件。一是选中想要打开的文件,点击“播放文件”按钮,二是直接双击列表中的文件,便可进入到相应子窗口进行查看。(5)当单独拿出exe文件运行时,会自动在exe所在文件里创建9个文本文档,分别存放三个模块(视频,音频,图片)的三个列表(播放列表,最近播放项目,最近追加项目)信息。 2.2. 性能需求 (1)硬件平台要求由于本软件为单机软件,不需进行大量的数据读写和数据交换,故
6、对系统硬件配置的要求并不高,只要能够平稳运行Windows操作系统的硬件平台,都能够使用本软件。(2)软件开发环境1.OS:Microsoft Windows XP SP22.Complier:Visual C+ 6.0 , Visual Studio 2005 Team System或更高版本 3. MSDN Library3 系统设计3.1.代码设计(1)音频、视频模块 1.创建播放器对话框 右击Dialog,点击插入,在弹出的对话框中点击Dialog,再点击新建。 双击新建的得对话框的ID,弹出新建的对话框,删除里面所有的控件。 右击,建立类向导,此时弹出Adding a class对话
7、框,点击ok,输入name为player, 点击确定后退出。 再在对话框中右击,选择插入ActiveX控件,选择WindowsMedia Player,之后在对话框中可以看到一个视频控件。右击,选择属性,在控制中将选择模式改为None,在视频控件中也就看不到一开就有的按键了。再次右击视频控件,选择建立类向导。点击Member Variables,选择视频控件的ID(默认为ID_OCX1),点击Add Variables。此时会弹出一个对话框。 点击确定后,弹出Comfirm Class对话框后,点击OK。此时可以看到建立了很多个类。之后为添加成员变量。Name为m_play,Category为
8、Control,Variable Type为CWMPPlayer4.点击确定之后可以看到下面的效果。2.控件与函数 声明全局变量CString playname,用于记录播放地址;int ntype用于记录播放的类型;int num1,num2,num1用于记录播放的地址在播放列表中的位置,num2用于记录播放列表中总的播放地址。构建成员函数void player:Onplay(CString pname,int n,int m,int t)playname=pname; num1=n;num2=m;ntype=t; 将前台所选择播放的信息通过函数传递给播放器对话框中在对话框中放上以下几个控件
9、。控件ID标题控件ID标题Push ButtonID_bofang播放Push ButtonID_zanting暂停Push ButtonID_tingzhi停止Push ButtonID_qianjing前进Push ButtonID_houtui后退Push ButtonID_shangyiqu上一曲Push ButtonID_xiayiqu下一曲Push ButtonID_yinjia+Push ButtonID_yinjiang-Push ButtonID_jingyin静音Push ButtonID_quanping全屏Group BoxIDC_static播放模式Group Box
10、IDC_yinliangkongzhi音量控制RadioButtonIDC_XUNHUAN循环RadioButtonIDC_shunxu顺序RadioButtonIDC_suiji随机TextIDC_static时间进度TextID_timeStaticTextIDC_volumeStatic滑块IDC_SLIDER1控件排列如下并建立如下三个变量 添加全局变量int hour, minute, second; 右击对话框,建立类向导,在Messages中选择WM_INITDIALOG,点击ADD Function,再点击Edit Code在BOOL player:OnInitDialog()
11、函数中写入 hour=0;minute=0;second=0;UpdateData(true);m_time.Format(%d:%d:%d,hour,minute,second);UpdateData(false); 让时间进度一开始为0; 同样的方法添加成员函数void player:OnTimer(UINT nIDEvent) 让时间进度能随着播放的音视频的进度而走。 添加成员函数void player:OnDestroy() KillTimer(0);CDialog:OnDestroy();/ TODO: Add your message handler code here在退出播放器
12、对话框时,让计数器停止。添加全局变量BOOL qian=false;若qian为true时,表示点击了前进或后退,此时点击播放时,继续播放。双击播放,点击确定,添加以下成员函数void player:Onbofang() if(!qian) m_play.SetUrl(playname); KillTimer(0);hour=minute=second=0;UpdateData(true);m_time.Format(%d:%d:%d,hour,minute,second);UpdateData(false); SetTimer(0,500,NULL);elsem_play.GetContro
13、ls().play();qian=false;点击播放时,也开始启动计时器同理,前进的成员函数void player:Onqianjing() 后退的成员函数void player:Onhoutui() 停止得成员函数void player:Ontingzhi() 停止时,时间进度变为0,同时计数器停止。暂停的成员函数void player:Onzanting() CString strtemp; GetDlgItemText(ID_zanting,strtemp);if (strtemp.Compare(暂停)=0)m_play.GetControls().pause();SetDlgIte
14、mText(ID_zanting,继续); KillTimer(0);if (strtemp.Compare(继续)=0)m_play.GetControls().play(); SetDlgItemText(ID_zanting,暂停);SetTimer(0,500,NULL); 点击暂停时,显示继续,此时计数器停止。当点击继续时,计数器又开始运行,同时显示出暂停。 定义成员变量int shape=2;默认值为2,表示默认顺序播放。在循环,顺序,随机播放函数中,分别将shape赋值为1,2,3;创建成员函数void player:shunxubofang() CStdioFile *fsp;
15、if(ntype=3)fsp=new CStdioFile(.list.txt,CFile:modeRead);else if(ntype=1)fsp=new CStdioFile(.list1.txt,CFile:modeRead);else if(ntype=4)fsp=new CStdioFile(.list21.txt,CFile:modeRead);else if(ntype=5)fsp=new CStdioFile(.list22.txt,CFile:modeRead); else if(ntype=6)fsp=new CStdioFile(.list31.txt,CFile:mo
16、deRead); else if(ntype=7)fsp=new CStdioFile(.list32.txt,CFile:modeRead);CString str;if(num1=0)num1=num2;for(int i=0;iReadString(str); playname=str;fsp-Close();delete fsp;m_play.SetUrl(playname);num1-; 此函数用于上一曲的顺序播放。根据媒体类型与播放列表的不同,而选择打开的文件不同。若选择的是第一曲,上一曲为最后一曲。下一曲的顺序播放函数与上面类似,不过若选中为最后一曲时,则下一曲为第一曲。与上面的
17、函数不同在于if(num1=num2-1)num1=0;elsenum1+;for(int i=0;iReadString(str); playname=str;fsp-Close();delete fsp; m_play.SetUrl(playname); 随机播放为在0到总地址数之间随机生成一个数,然后播放次数字所对应的音视屏。与上面的函数不同在于 srand(time(0); int temp=rand()%num2;上一曲的函数oid player:Onxiayiqu() / TODO: Add your control notification handler code here i
18、f(shape=1) m_play.SetUrl(playname); else if(shape=2) shunxubofang(); else if(shape=3) suijibofang();SetTimer(0,500,NULL); 根据shape的不同,所选择的函数也就不同。 在下一曲的函数中,与上面不同的是,当shape为2时,所调用的函数为shunxubofang2();构建成员函数void player:nowvolume() UpdateData(true);m_volume.Format(%d,m_silder.GetPos(); UpdateData(false);使声
19、音滑块所对应的数字呈现在静态文本框中。同时在OnInitDialog()中加入m_silder.SetRange(0,100); m_silder.SetPos(50);nowvolume();定义滑块的长度为100,刚开始时是50。音减的函数中void player:Onyinjiang() / TODO: Add your control notification handler code herelong volume=m_play.GetSettings().GetVolume()-10;m_play.GetSettings().SetVolume(volume);m_silder.S
20、etPos(volume);nowvolume();每次点击-,就将声音减10。音加只要将减10改为加10即可。同时在音加函数中加入SetDlgItemText(IDC_jingyin,静音);当处于静音时,点击+,可将“有声”改为“静音”。同时为音量滑块建立类向导,添加如下函数void player:OnReleasedcaptureSlider1(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code here m_play.GetSettings().SetVolume(m_s
21、ilder.GetPos(); nowvolume();*pResult = 0;使其能够拖动滑块来改变音量大小。双击静音后,添加函数void player:Onjingyin() / TODO: Add your control notification handler code hereCString strtemp; GetDlgItemText(IDC_jingyin,strtemp);if (strtemp.Compare(静音)=0)m_play.GetSettings().SetVolume(0); m_silder.SetPos(0);SetDlgItemText(IDC_ji
22、ngyin,有声); if (strtemp.Compare(有声)=0)m_play.GetSettings().SetVolume(30); m_silder.SetPos(50);SetDlgItemText(IDC_jingyin,静音); nowvolume();当点击静音时,声音变为0,此时文字变为“有声”,当点击“有声”时,声音变为50,此时文字为“静音”。添加全局变量 bool quan=false;当其为true时,为全屏显示,默认为false。双击全屏,添加成员函数void player:Onquanping() m_play.SetFullScreen(TRUE);qua
23、n=true;此时全屏显示,quan值为true;右击视频控件,建立类向导,Messages中选择DoubleClick,编辑函数,写入if(!quan)m_play.SetFullScreen(TRUE);quan=true;elsem_play.SetFullScreen(FALSE);quan=false;根据quan的值,双击之后,来决定是全屏还是退出全屏。(2) 图片模块新建对话框,建发与视频播放器的相同。在对话框中引入三个控件,一个图像的,ID设为ID_showing,类型为位图,在样式中选择凹陷,图像居中,真实图像大小。两个Button,一个为上一张,一个为下一张。建立类向导,方
24、法与播放器相同,类名为photo.构建函数void photo:getname(CString pn,int num1,int num2,int nt) m_path=pn; now=num1; sum=num2;type=nt;将前台数据传给后台全局变量m_path为播放地址,now为播放地址序列,sum为总播放数量,type为播放列表的类型。创建函数void photo:showpic()hwnd = GetDlgItem(IDC_showing);hDesDC = hwnd-GetDC()-m_hDC;hSrcDC = CreateCompatibleDC(hDesDC);hBitmap
25、=(HBITMAP)LoadImage(AfxGetInstanceHandle(),m_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);GetObject(hBitmap, sizeof(BITMAP), &bm);SelectObject(hSrcDC, hBitmap);hwnd-GetClientRect(&rect);:SetStretchBltMode(hDesDC,COLORONCOLOR); :StretchBlt(hDesDC, rect.left, rect.top, rect.right, rect.b
26、ottom, hSrcDC,0, 0, bm.bmWidth, bm.bmHeight,+SRCCOPY);UpdateData(false);此函数为将图像在图像控件中显示。接下来进行在OnPaint()函数中画图。由于此类中没有该函数,可通过建立类向导(3)主窗口模块打开VC6+,新建工程。选择MFC AppWizard(exe),在工程名字中填入media1,如图所示点击确定。选择创建类型为基本对话框。一直点击确定。最后打开对话框,删除里面所有的控件。右击media1 resources,点击插入,选择新建Meun,打开Meun菜单,新建三个主菜单:应用程序,媒体类型,目录设定。建立次菜
27、单如下图所示主菜单次菜单ID次菜单标明应用程序ID_tuichu退出媒体类型ID_yinyue音乐媒体类型ID_tupian图片媒体类型ID_shipin视频目录设定ID_mulu设定监视目录在media1Dlg.cpp中头文件下加入CMenu m_Menu;并在BOOL CMedia1Dlg:OnInitDialog()函数中加入m_Menu.LoadMenu(IDR_MENU1);SetMenu(&m_Menu);这样就可以菜单嵌入该对话框中。建立全局函数int type=1,默认值为1。打开新建的菜单,右击应用程序下的退出,建立类向导,在Messages中选择COMMAND,再点击Add
28、 Function。再点击Edit Code,打开函数Ontuichu(),里面写入CDialog:OnCancel();运行程序后,点击推出时,可退出次对话框。同样的方法为音乐,图片和视频建立类向导,打开函数,分别将type复制为1,2,3;为了选中不同类型后,能够在选项前面打勾。则需要建立类向导,选择UPDATA_COMMAND_UI点击确定之后,在音乐函数中写入pCmdUI-SetCheck(type=1|type=4|type=5);,当type为1或4或5时音乐前面打勾.同理图片所对应的type为2或8或9,视频的type为3或6或7.担当运行时,还不能出现上述现象。因为此函数是菜单
29、所有的,基本对话框中不包含函数,这是就需要借助菜单中的函数。在Cmedia1aDlg类中声明成员函数OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu),接着直接将函数copy给此类中。将函数加入后,运行后,点击不同类型的媒体后,会看到前面打勾。在对话框的函数中建立全局变量bool mulu=true;默认值为true,表示显示播放列表。接下来在设定监视目录中,与前面同样的方法,建立类向导,选择两个函数,此函数与音乐的函数一样,如下void CMedia1Dlg:Onmulu() if(mulu)m_list.ShowWin
30、dow(SW_HIDE);mulu=false;elsem_list.ShowWindow(SW_SHOW);mulu=true;void CMedia1Dlg:OnUpdatemulu(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herepCmdUI-SetCheck(mulu);默认时,此菜单前面打勾,播放列表显示。当打击后,true为false,前面不打勾,播放列表不显示。再次点击时,mulu有变为true.(m_list为播放列表的变量,之后会声明)。菜单建好后,接下来就时对话框的界面了。在主菜单中选入
31、三个Button4,Button5,Button6, ,ID分别要与菜单中音乐,图片,视频的ID要一样。为了点击时与点击所对应的菜单一样。并将这三个Button属性中的样式中点击所有者绘图。在右边的资源框中右击Bitmap,在此文件夹中插入三张图片,图片的格式必须为bmp,接下来就是将图片嵌入这三个button中。对话框的函数中头文件下声明三个CBitmapButton变量,为 m_btnX1,m_btnX2,m_btnX3;在BOOL CMedia1Dlg:OnInitDialog()函数中写入m_btnX1.LoadBitmaps(IDB_BITMAP2);m_btnX1.Subclass
32、DlgItem(ID_yinyue,this); m_btnX1.SizeToContent();m_btnX2.LoadBitmaps(IDB_BITMAP1);m_btnX2.SubclassDlgItem(ID_tupian,this); m_btnX2.SizeToContent();m_btnX3.LoadBitmaps(IDB_BITMAP3);m_btnX3.SubclassDlgItem(ID_shipin,this); m_btnX3.SizeToContent();每一个CBitmapButton变量与button所对应起来。SizeToContent();是为了将Butt
33、on的大小与图片的大小想适应。运行后,结果如图。在对画框中引入四个组合框,标题分别为播放列表,最进播放列表,最近追加项目,最近播放项目。分别在播放列表,最近追加项目,最近播放项目中加入一个列表框。排列如下图ID从左往右依次为ID_list2,ID_bofang,ID_zuijia,并在属性中选择水平滚动及垂直滚动。右击ID_list2,点击建议类向导,选择添加成员变量,类型为CListBox,名字为m_list。同理,也为其他两个列表框建立两个成员变量,依次为m_zuibo,m_zuija,类型相同。接下来在CMedia1Dlg:OnInitDialog()函数中写入m_list.SetHor
34、izontalExtent(1000);m_zuijia.SetHorizontalExtent(1000);m_zuibo.SetHorizontalExtent(1000)这是由于水平滑条不灵敏,以此当运行时可以看到水平滑条。垂直滑条得数量到达列表的容量时可以看到。构架成员函数void CMedia1Dlg:dakaiwenjian()此函数是为了将九个文件中的数据根据媒体类型的不同,读入所对应的列表框中。如果这九个文件不存在,则自动创建。文件与所对应的列表如图所示文件列表文件列表lixt.txt视频播放列表List22.txt最近播放音频Lixt31.txt最近添加视频List41.tx
35、t图片播放列表Lixt32.txt最近播放视频List42.txt最近添加图片List1.txt音频播放列表List43.txt最近播放图片List21.txt最近添加音频在CMedia1Dlg:OnInitDialog()函数中调用此函数,当开始运行此函数时,开始读取文件,默认是音频。在对话框中双击Button4,打开函数,写入m_list.ResetContent(); m_zuijia.ResetContent(); m_zuibo.ResetContent();dakaiwenjian();首先是清除三个列表框中的内容,然后又打开文件,从新读取新的内容。Button5与Button6与
36、之相同。接下来开始为三个列表添加内容了。添加一个Button,名字为添加文件。双击,打开函数,if(type=3|type=6|type=7) char szFileFilter= Medal File(*.avi,*.wmv,*.asf)|*.avi;*.wmv;*.asf| RMVB File(*.rmvb)|*.rmvb| MP4 File(*.mp4)|*.mp4| Mkv File(*.mkv)|*.mkv| All File(*.*)|*.*|;CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_A
37、LLOWMULTISELECT,szFileFilter);POSITION pos=dlg.GetStartPosition(); if(dlg.DoModal()=IDOK) while(pos!=NULL) m_pathname=dlg.GetNextPathName(pos); for(int i=0;im_list.GetCount();i+) CString strtemp; m_list.GetText(i,strtemp); if(m_pathname=strtemp) MessageBox(该文件已存在); break; if(m_zuijia.GetCount()=10)
38、m_zuijia.DeleteString(0); if(i=m_list.GetCount() m_list.AddString(m_pathname); m_zuijia.AddString(m_pathname); 此函数是打开视频文件,并将其加入播放列表中,同时还有一个判断是否已存在的if语句,若存在,则不添加。添加的地址也会导入最近添加的项目中,若超过十个,则将第一个删掉。列表框中的排列为时间先后顺序。3,6,7代表视频文件,只是所对应的列表不同。音频与图片与之类似,1,4,5代表音频,2,8,9代表图片。函数的随后还要调用保存函数。视频的保存函数为else if(type=3|ty
39、pe=6|type=7) ofstream file,file1; file.open(.list.txt); file1.open(.list31.txt);for(int i=0;im_list.GetCount();i+)CString strtemp; m_list.GetText(i,strtemp);strtemp+=n;filestrtemp;for( i=0;im_zuijia.GetCount();i+)CString strtemp; m_zuijia.GetText(i,strtemp);strtemp+=n;file1strtemp;file1.close();file.close();用此文件函数,还需要添加头文件#include “fstream.h”.音乐与图片与之相同,只是所保存的文件不同。接下来是保存最近播列表。创建成员函数void CMedia1Dlg:zuibobaocun()ofstream file2;if(type=1|type=4|type=5)file2.open(.list22.txt);else if(type=3|typ
限制150内