《基于MFC多媒体播放器【实用文档】doc.doc》由会员分享,可在线阅读,更多相关《基于MFC多媒体播放器【实用文档】doc.doc(146页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、基于MFC多媒体播放器【实用文档】doc文档可直接使用可编辑,欢迎下载/C+课程设计项目报告目 录 项目简介11项目名称11。功能概述1 1. 开发人员及职责。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.12 需求分析.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.1. 功能需求。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。1. 性能需求.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.2系统设计。.。.。.
2、。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.331 代码设计.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.3.2 流程图。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。13 系统实现及测试.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.15 项目总结.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。05. 总体总结。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.5。2
3、 个人总结.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。.。2项目简介. 项目名称多媒体播放器12 功能概述此款媒体播放器项目具有以下功能:(1)本地设定目录中包含音频文件的浏览和播放(支持mp3格式)。()本地设定目录中包含图片文件的浏览(支持p格式).(3)本地设定目录中包含视频文件的浏览和播放(支持mp格式)。()最近播放列表功能,保存最近播放的1个文件,保存最近追加的0个文件。视频,音频,图片是分开的,都有最近播放列表和最近追加列表。1。3 开发人员及职责负责视频模块,以及最后的模块整合,报告的编写负责音频模块,报告的编写负责图片模块,报告
4、的编写2 需求分析1. 功能需求本设计将要实现的是一个单机多媒体播放器,可以对音频、视频、图片进行查看。从其目标功能及特点分析,将本软件功能划分如下:(1) 视频播放器: 可以打开MP4格式的视频文件。在本地文件夹中将P4格式的视频文件添加至播放列表,点击播放,或双击列表里的所选项目,就可跳转至视频播放窗口。 在播放窗口里,查看视频时,有“播放,“暂停”,“停止”功能。播放中,还有“前进”,“后退”功能,即快进快退功能,以秒为一个单位,这个单位也可以在代码中进行修改。在观看视频时,还有“上一曲,下一曲”功能,即查看之前添加在播放列表里的视频项。同时,也可以选择播放模式“循环,顺序,随机,该功能
5、也是基于播放列表实现的。在右边功能键里,还有音量调节,静音功能。除此以外,还可以进行全屏浏览,按“SC”退出全屏。在主页面,还有两个数据框“最近追加项目”和“最近播放项目”,可以直观地看到最近播放项目,且可以手动清空所有项目。这两个列表只按照时间,保存最近的项目,且最多保存0个。(2) 音频播放器可以打开M格式的音频.在本地文件夹中将3格式的视频文件添加至播放列表,点击播放,或双击列表里的所选项目,就可跳转至音频播放窗口。并且,在主窗口,还有两个数据框“最近追加项目”和“最近播放项目”,可以直观地看到最近播放项目,且可以手动清空所有项目。这两个列表只按照时间,保存最近的项目,且最多保存10个.
6、(此处为该多媒体公共窗口,功能相同,下面的图片浏览器也是一样的.)在播放窗口里,听取音频时,有“播放,“暂停”,“停止”功能。同样也会有“前进,后退”功能,“上一曲,下一曲”功能,播放模式中的“循环,顺序,随机”,这些功能与上面所述的视频播放器相同。(3) 图片浏览器 可以打开BMP格式的图片。主窗口同视频、音频播放器一样,在此不多赘述.在浏览图片窗口中,会有“上一张,下一张”功能键,可以在“播放列表,最近播放项目,最近追加项目”任何一个列表中循环,可以自由选择。当图片浏览到所选列表的最后一张时,会自动循环至列表第一张。()在主窗口的中,在列表中已添加文件后,有两种方式可以打开文件.一是选中想
7、要打开的文件,点击“播放文件”按钮,二是直接双击列表中的文件,便可进入到相应子窗口进行查看。(5)当单独拿出e文件运行时,会自动在x所在文件里创建个文本文档,分别存放三个模块(视频,音频,图片)的三个列表(播放列表,最近播放项目,最近追加项目)信息.。. 性能需求 (1)硬件平台要求由于本软件为单机软件,不需进行大量的数据读写和数据交换,故对系统硬件配置的要求并不高,只要能够平稳运行Widows操作系统的硬件平台,都能够使用本软件。()软件开发环境1。OS:icrosoft Windows XPS2.oplier:Viual+ , sual tudio 2005 Tea ste或更高版本 。
8、MSDN Librar3 系统设计3。1。代码设计(1)音频、视频模块1。创建播放器对话框 右击Diaog,点击插入,在弹出的对话框中点击Dialog,再点击新建。 双击新建的得对话框的ID,弹出新建的对话框,删除里面所有的控件。 右击,建立类向导,此时弹出Ading a las对话框,点击ok,输入nae为player, 点击确定后退出。 再在对话框中右击,选择插入tiveX控件,选择WindoMediaaer,之后在对话框中可以看到一个视频控件。右击,选择属性,在控制中将选择模式改为None,在视频控件中也就看不到一开就有的按键了。再次右击视频控件,选择建立类向导.点击Mee Variab
9、le,选择视频控件的I(默认为IOX),点击Add Varibles。此时会弹出一个对话框。 点击确定后,弹出Comir Clas对话框后,点击OK。此时可以看到建立了很多个类。之后为添加成员变量。Nam为mpla,Categr为Control,Variablyp为CWMPPayr4点击确定之后可以看到下面的效果.2.控件与函数 声明全局变量CStrng paynae,用于记录播放地址;t nte用于记录播放的类型;itum1,num2,num用于记录播放的地址在播放列表中的位置,u2用于记录播放列表中总的播放地址.构建成员函数idplayer::nply(Cig pna,int n,int
10、,nt t)plyname=name; um=n;nu2m;ntye=; 将前台所选择播放的信息通过函数传递给播放器对话框中在对话框中放上以下几个控件。控件ID标题控件ID标题Push BttoID_bofag播放Push tn_zantin暂停Push ButtonItingzi停止h ButtnIDqiing前进u ButonID_houtui后退ushButonI_shayqu上一曲uh uttoID_xiyiu下一曲Ph BtonID_yinjia+PshBttnI_yinjiang-Push ttnID_jingyin静音sh ButtonD_qanping全屏Group oIDC_
11、static播放模式Grou BxI_yiliangkongzhi音量控制aoButtonDC_XUNHA循环RadiuttonI_shun顺序RdioBtoD_sij随机TextIDC_stati时间进度TexI_tieSaticTetID_olumeStatic滑块ID_SLIDER1控件排列如下并建立如下三个变量 添加全局变量 hour,inute,send; 右击对话框,建立类向导,在Mesaes中选择WMIITDIALOG,点击ADD uctin,再点击Eit Coe在OOL ayer::OnIntialog()函数中写入our=0;mnte=;second=0;UpateDa(tr
12、u);m_tim.Foat(”:d:%,hur,inu,secnd);pdateDat(false); 让时间进度一开始为0; 同样的方法添加成员函数volayer::nimer(UINT IDEven) 让时间进度能随着播放的音视频的进度而走. 添加成员函数vid playr:nDstroy() KillTer();CDialg:OnDetry();/ TODO: dd yor meage d coe ere在退出播放器对话框时,让计数器停止.添加全局变量BOO qianase;若qn为tru时,表示点击了前进或后退,此时点击播放时,继续播放。双击播放,点击确定,添加以下成员函数void p
13、lr::nbofang() if(!ian) m_play。SetU(playname); Kier(0);hourmte=secnd0;UpdaeData(rue);_me。Fmat(d:d:%d”,hur,minute,secn);Updateata(fle); tme(0,50,NUL);emplayGotros()pla();qiafalse;点击播放时,也开始启动计时器同理,前进的成员函数oidpay:Onqiajin()后退的成员函数void plaer:Onutu() 停止得成员函数vid laye:ntizhi() 停止时,时间进度变为0,同时计数器停止。暂停的成员函数vid
14、play::nzanti() CSring stp; GetDlgIemText(ID_anting,tep);(strtmpComr(”暂停)=0)m_pla.etls()。pae();SetgItmxt(I_ating,继续”); KilTimr(0);if (srt。Compare(继续)=)_plGetCntrls()pay(); SDltText(Danin,暂停);SetTimer(0,NULL); 点击暂停时,显示继续,此时计数器停止.当点击继续时,计数器又开始运行,同时显示出暂停。 定义成员变量it hpe=2;默认值为2,表示默认顺序播放。在循环,顺序,随机播放函数中,分别将
15、ape赋值为1,;创建成员函数vid player::huxuang() CStdoFile fp;f(ntype=3)f=ne CStdiile(.lit。t,CFil::meRa);else f(nype=1)sp=w CStil(”。lt1txt,Cile::odRead);els if(ntpe=4)fs=new StdoFile(.ls21t,il::modeRead);else if(ntyp=5)spnw CStdioFile(。lst2.tx,CFile:odeRed); ese f(npe=)fsp=new StdioFil(.it31。xt”,CF:deead); e if
16、(ntype=)s=new CStdiFil(”.ist32x,CFil::modeRead);CSri str;i(um1=0)numnu;for(it =0;=num11;i+)seaSting(st); aymetr;fsplose();dlte s;mpa.SetUrl(layname);um-;此函数用于上一曲的顺序播放.根据媒体类型与播放列表的不同,而选择打开的文件不同。若选择的是第一曲,上一曲为最后一曲。下一曲的顺序播放函数与上面类似,不过若选中为最后一曲时,则下一曲为第一曲。与上面的函数不同在于f(num1=nu2-)nu=0;lsenu+;for(nti=0;i=nm1;i+
17、)fpRedString(str);lynm=tr;fpClos();elt fsp;_ply。SetUr(lyname); 随机播放为在0到总地址数之间随机生成一个数,然后播放次数字所对应的音视屏。与上面的函数不同在于 srand(time(0); n tmrad()num2;上一曲的函数d lar::Onxiq() / TOD:Ad your otol noificaion haler codeher i(shape=)m_lay。SeUrl(ame); elseif(shape=2) shnuon(); ese if(shap=3) suijbofng();SetTimer(0,50,N
18、ULL); 根据sape的不同,所选择的函数也就不同。 在下一曲的函数中,与上面不同的是,当hape为2时,所调用的函数为shunbofang2();构建成员函数vi per::nowvoum() UpdaDaa(re);m_volume.Forat(%d”,msldr。GetPos(); UpdatDaa(f);使声音滑块所对应的数字呈现在静态文本框中。同时在OnInDilo()中加入m_ilerSetRange(0,100); slde.StPo(5);nowvolme();定义滑块的长度为100,刚开始时是50。音减的函数中voidpar::Onyinjang() / TODO:d yr
19、 contoloiiation hadler oe herlong volumem_pay。GeSeting().Getlume()-0;m_paGetSettis()。SeVoume(olme);_sile。SetPos(vlume);nvu();每次点击,就将声音减1。音加只要将减1改为加1即可。同时在音加函数中加入StDlgItemxt(Cjngyi,”静音);当处于静音时,点击,可将“有声”改为“静音”.同时为音量滑块建立类向导,添加如下函数void yr::OnReleadcaturede(NHDR* MR,LRESUT pReslt) / TOO: Add yocontrolnti
20、ficati hander code ere _plaGetSettngs()。etlme(ildrGetos()); nvolume();Result= 0;使其能够拖动滑块来改变音量大小。双击静音后,添加函数void playe::jingyin() /TOD: Add ur onol otiication handlercoe hereCSigstrmp; eDlgItemext(DC_gyin,strte);if (stremp.Compar(”静音”)=0)pay。GeSetins().tVolume(0); _lder.ets(0);StDlgItemTex(Ijingyi,有声)
21、; f (srtmp.mpare(”有声”)=)m_ply.GtSetngs()SetVolme(0); silder.SetPos(0);etDlgIteText(IDC_jingin,静音); nowle();当点击静音时,声音变为0,此时文字变为“有声”,当点击“有声”时,声音变为50,此时文字为“静音”。添加全局变量 oqun=false;当其为tue时,为全屏显示,默认为false.双击全屏,添加成员函数id playr:Onqping()m_ply。SetFullScreen(TE);qua=re;此时全屏显示,qua值为tre;右击视频控件,建立类向导,Messges中选择Dbl
22、Clk,编辑函数,写入if(!ua)m_pla。SFullScreen(TRUE);quan=tre;elem_pleFullSreen(FALS);quan=fle;根据un的值,双击之后,来决定是全屏还是退出全屏。(2) 图片模块新建对话框,建发与视频播放器的相同。在对话框中引入三个控件,一个图像的,ID设为IDsowig,,类型为位图,在样式中选择凹陷,图像居中,真实图像大小。两个utton,一个为上一张,一个为下一张。建立类向导,方法与播放器相同,类名为poo构建函数vid ht:getnme(CStrig pn,intm1,t nu,i n) mpth=pn; o=num1; su=
23、num2;type=nt;将前台数据传给后台全局变量m_ph为播放地址,nw为播放地址序列,sum为总播放数量,ype为播放列表的类型。创建函数voidphto::howi()wnd GeDltm(DC_owi);hC= wnd-etC()m_hD;hSrcDC =ratCompatiblDC(hDesC);itmap(HBITMAP)oadage(AfGetInstaneandle(),_pat,IMAGEIA,0,L_LOADFROFLER_CRATEDIBSCTION);GeObect(hBita,sieo(ITMA), bm);SeectOect(hSDC, hBitm);hwndGt
24、lientec(rect);::SeStretchBtMe(hesDC,CLORONCOL); :Stretlt(heD, ec。lef,t。o, rec。right, rectbottom, hSrcDC,0, , bmWidh, bm.mHeigh,+SRCOY);UpateData(fae);此函数为将图像在图像控件中显示.接下来进行在OnPaint()函数中画图.由于此类中没有该函数,可通过建立类向导()主窗口模块打开VC+,新建工程。选择MFC ppizard(ee),在工程名字中填入meia,如图所示点击确定。选择创建类型为基本对话框。一直点击确定.最后打开对话框,删除里面所有的控
25、件。右击media reoues,点击插入,选择新建Meun,打开Mn菜单,新建三个主菜单:应用程序,媒体类型,目录设定.建立次菜单如下图所示主菜单次菜单D次菜单标明应用程序ID_tiu退出媒体类型ID_yye音乐媒体类型ID_upi图片媒体类型Dsipn视频目录设定IDuu设定监视目录在da1Dg。pp中头文件下加入Mnu m_eu;并在OOL Media1Dg::OntDal()函数中加入m_enu。adMeu(DREN1);SetMeu(m_Menu);这样就可以菜单嵌入该对话框中。建立全局函数in type=1,默认值为1。打开新建的菜单,右击应用程序下的退出,建立类向导,在Messa
26、gs中选择COMMAND,再点击AdFucio。再点击Ed Cde,打开函数Onuichu(),里面写入CDalg:OnCael();运行程序后,点击推出时,可退出次对话框。同样的方法为音乐,图片和视频建立类向导,打开函数,分别将pe复制为1,2,3;为了选中不同类型后,能够在选项前面打勾。则需要建立类向导,选择UPDT_CMMA_UI点击确定之后,在音乐函数中写入pCmdUSetCheck(ype=1tye=|type);,当tye为1或4或5时音乐前面打勾同理图片所对应的te为2或8或9,视频的tpe为或或。担当运行时,还不能出现上述现象。因为此函数是菜单所有的,基本对话框中不包含函数,这
27、是就需要借助菜单中的函数。在medi1aDlg类中声明成员函数nInitMnPpp(Cenu *pPopenu, UNnn,BOOL bSysMen),接着直接将函数oy给此类中.将函数加入后,运行后,点击不同类型的媒体后,会看到前面打勾.在对话框的函数中建立全局变量bo mulu=true;默认值为true,表示显示播放列表。接下来在设定监视目录中,与前面同样的方法,建立类向导,选择两个函数,此函数与音乐的函数一样,如下oid CMedia1lg::Onmu() if(mulu)m_towindow(SW_E);mlu=false;elsemlst。ShowWindow(S_SHW);lu=
28、true;vod CMedia1Dlg::nUpdatelu(CmdUICUI) /TO: ddyour commaduteUI hanlr ode herepCdUStChec(mlu);默认时,此菜单前面打勾,播放列表显示。当打击后,rue为fl,前面不打勾,播放列表不显示。再次点击时,mulu有变为true。(mist为播放列表的变量,之后会声明)。菜单建好后,接下来就时对话框的界面了。在主菜单中选入三个Button4,Buton5,Button6, ,I分别要与菜单中音乐,图片,视频的要一样。为了点击时与点击所对应的菜单一样.并将这三个utto属性中的样式中点击所有者绘图。在右边的资源
29、框中右击Bimap,在此文件夹中插入三张图片,图片的格式必须为b,接下来就是将图片嵌入这三个tn中。对话框的函数中头文件下声明三个taButn变量,为 m_tnX1,mbtnX2,_bnX3;在BOOL CMedi1Dlg:IitDio()函数中写入m_btnX.LoadBitms(IBIP);m_tn1。SubclasDlgItem(I_yinyue,hs); m_bnX1。zeToonte();m_btn2。LaBitap(DBBIMAP1);m_bX2。SubcasDlgtem(Itupia,his);m_nX2izeTCont();mbX。oadBimps(IB_BITMAP3);m_
30、bnSubclssDlgte(IDshipin,th); mbtn3。Sieoontn();每一个CBitmputton变量与buon所对应起来。SzToCotet();是为了将utton的大小与图片的大小想适应。运行后,结果如图。在对画框中引入四个组合框,标题分别为播放列表,最进播放列表,最近追加项目,最近播放项目。分别在播放列表,最近追加项目,最近播放项目中加入一个列表框。排列如下图ID从左往右依次为IDlit2,I_ofang,IDzia,并在属性中选择水平滚动及垂直滚动。右击IDlst2,点击建议类向导,选择添加成员变量,类型为ListBox,名字为m_ls。同理,也为其他两个列表框建
31、立两个成员变量,依次为m_zuibo,m_zuia,类型相同。接下来在Cei1Dl:IntDalg()函数中写入_listtHoiontalEtent(1000);m_zuij。etHorizntaltnt(100);m_zuib.SeHorizoalExtent(100)这是由于水平滑条不灵敏,以此当运行时可以看到水平滑条。垂直滑条得数量到达列表的容量时可以看到。构架成员函数oidMedia1Dlg:aaiwenian()此函数是为了将九个文件中的数据根据媒体类型的不同,读入所对应的列表框中.如果这九个文件不存在,则自动创建。文件与所对应的列表如图所示文件列表文件列表lxt.txt视频播放列
32、表ist22。txt最近播放音频Lixt3。t最近添加视频Lit4。txt图片播放列表Lix3t最近播放视频List2。txt最近添加图片Listxt音频播放列表List3txt最近播放图片List21.tt最近添加音频在Meia1Dl::OnnitDialg()函数中调用此函数,当开始运行此函数时,开始读取文件,默认是音频。在对话框中双击Buton4,打开函数,写入mstReetContet(); m_zuiji.eseCntent(); m_zuib。ResetCotent();kaein();首先是清除三个列表框中的内容,然后又打开文件,从新读取新的内容。Button与ton6与之相同。
33、接下来开始为三个列表添加内容了。添加一个Bton,名字为添加文件。双击,打开函数,(typ=3|type=6ype=) char szFiiler= Meal ile(.vi,*。m,asf)|.avi;。mv;。asf” RMVB File(。rmb)*。mvb P File(。mp4)|*。mp4 Mk ile(*.mkv)。mkv|” l Fil(.*)*;CFiDialo dg(true,NL,NUL,ON_HIDERAOY|OF_NCHNEIROFALOULTIELEC,szilFilter);POIIONos=dl.GeStatston(); i(g。Modl()=DK) whe(
34、pos!=ULL) m_pathname=dl.GetNextPahNae(p); fr(nt =;t.Getount();+) Ctgsttep; m_listGetTet(i,tmp); (pahname=sttem) MessageB(该文件已存在); break; if(mzuiiaGeCont()=0) m_zia.DeteSrig(0); f(=_lstGetCunt() m_it.Addtrin(m_pahnam); m_zuijia.AddString(m_patha); 此函数是打开视频文件,并将其加入播放列表中,同时还有一个判断是否已存在的if语句,若存在,则不添加。添加的
35、地址也会导入最近添加的项目中,若超过十个,则将第一个删掉。列表框中的排列为时间先后顺序。3,代表视频文件,只是所对应的列表不同。音频与图片与之类似,1,,5代表音频,8,代表图片。函数的随后还要调用保存函数。视频的保存函数为ls f(ype=3type6type=7) ofstrem fle,ile1; ile.pn(.ist。xt”); fle1。open(list31xt);or(in 0;im_list。GetCount();+)Cringsrtemp; m_list。Getxt(i,sttmp);srtmpn;fstrmp;fo(i=0;imzuia.GetCou();)CStrn trtmp; m_ziji。Gtext(,stemp);sttemp+=”n;filesrtemp;file1。cose();fe.cloe();用此文件函数,还需要添加头文件inlude “sream。h”.音乐与图片与之相同,只是所保存的文件不同。接下来是保存最近播列表。创建成员函数void Meia1Dlg:zuboaocun()ofsreamfile2;if(tpe=|type=4|typ=5)file2。pen(”lis22。t);else if
限制150内