MFC视频播放器试过可以成功.docx
《MFC视频播放器试过可以成功.docx》由会员分享,可在线阅读,更多相关《MFC视频播放器试过可以成功.docx(12页珍藏版)》请在冰豆网上搜索。
MFC视频播放器试过可以成功
1需求分析
NBA现役巨星资料库
随着NBA(NationalBasketballAssociation)近二十年来在中国市场的扩张,如今中国积攒的相当一部分NBA的忠实球迷,更随着中国如王治郅,姚明,易建联等中国球员加入NBA,更多的中国人开始了解NBA。
从而NBA得各种信息变得炙手可热,如NBA巨星们的视频,个人资料,周边故事,赛事,等等。
这些信息,现如今不仅仅在网络上被各种人使用使用,在日常生活中也是很值得爱好NBA的人去了解的。
本人也是一位NBA的爱好者,在一次资料的搜集中,我想要查询网络上“现役NBA巨星的资料”时,可并没有发现,只有“50大”(NBA历史上前五十的巨星)诸多资料。
其现役巨星的资料大多都是分散的记录。
在当下,“50大”只能是NBA的周边或历史,而现役巨星才是现在球迷的追求对象,所以一套完整的现役巨星资料可以称得上是一份绝对的值得珍藏的资料。
但是整理一份资料简单,只需在各种网站中搜索巨星的名字,相关资料自然会弹出,可如何去让它具有一个更高的集成性,如何去让它更符合我们拥有如今操作理念,不在是单一的单窗口字面文档。
设计一个基于数据库且可实现多窗口,在形式上多样化,这就是此次MFC程序设计的主导方向。
MFC程序设计
既然程序是基于数据库的,固然数据库是必须建立的,在MFC建立数据库的方式有很多,期中最简单操作的是Access。
数据库的调用可通过ODBC。
而形成形式上的突破方法是很多的,如联入多媒体,插入视图,增加功能等等。
数据流图
2系统设计
概要设计
在需求分析中提到所建立的程序可以实现多窗口调用且具有多功能的。
首先,建立的程序是基于数据库的多文档格式MFC程序,整个程序大至可分为三个模块。
体系结构设计
分析我设计的这个程序,其三个模块并不是互相调用的,而是另两个模块以窗口对接按键的形式,被第一个模块调用的。
这样的结构存在属于“层次结构”,高层的工作建立在低层的工作上面,把复杂的事情转化成多件逐层递进的事件。
模块设计
上面说到,这个程序设计中有三个模块,其中两个以窗口形式存在的模块与另一模块的耦合(Coupling)较强,可是这两个模块却又是完全独立的,他们属于强内聚(Cohesion)。
这样的设计算不上“强内聚,弱耦合”。
可在程序中以窗口运行的两个模块是具有一定的封闭性。
详细设计
2.使用ODBC实现对Access的驱动(WIN7在主控面板右上角输入“ODBC”)
3.建立一个MFC程序,多文档(MDI)格式打开,且在第三部中,选取读取数据库,在数据库中ODBC的下拉栏中选择自己刚才建立驱动的Access文档,完毕后点击完成。
4.在对话框上添加与Access表中对应栏目的动态文本框,再添加相关静态文本,将这部分静态文本更改属性与栏目名对应。
5.在类向导(MFCClassWizard)中添加每个栏目的类(最终的每一步结束后都要点击OK键,VC才会保存设置)。
6.这样就实现了数据的直观表现,接下来是添加“查询功能”。
新建一个对话框(Dialog),加入一个动态文本框且去掉取消按键,这时修改动态文本的ID,且为其添加新类。
接着在主面板上添加一个按键,更改属性名称为“巨星查找”,然后建立类向导,给他一个单击指令(BN_CLICKED),然后对其编辑(EDIT)建立消息映射,输入相应代码(在一章节中会说明)从而实现查询功能。
7.插入播放器控件。
如今MFC的发展已经很先进,不仅自身拥有比较的大的控件库,还能在Windows寻找已注册的软件控件。
这样一来,对控件的调用显得尤为方便。
在Windows常见的影音播放器中有MediaPlayer,暴风影音(StormPlayer)等,我选择插入的空间是MediaPlayer,因为其是Windows自带的,这样便可以增强程序的广泛性。
首先建立一个对话框,然后点击鼠标右键,插入一个控件,在列表中选择WindowsMediaPlayer。
然后对话框中会出现一个传统的MediaPlayer的窗口,在此窗口上点击右键,建立类向导,打开MembleVariables,为此控件添加相关的数据成员,方法同图四。
但要注意会弹出以下对话框
这些都是与WMP(WindowsMediaPlayer)有关的类,其实有部分是多余的,因为在使用控件时并不会去调用,可为了快捷,直接点击OK就行了,此处不做解释。
这时播放器已经有了半条生命了,还要为其添加一项打开项目。
加入一个按键,改其属性名称为Open,然后给它建立一个单击指令(BN_CLICKED),在编辑(EDIT)中为其添加消息映射(代码下一章节可见)。
最后同样要让在主窗口上的按键于此窗口连接,方法同6。
8.最后插入一些图片美化窗口。
选取图片,另存为“256色位图”,然后回到MFC中,工作区中插入(Insert)图片(Bitmap),点击引入(Import),加入欲加入的位图。
加入后,在想加入图片的窗口中加入图片控件(Picture),右击属性,调整为位图,在ID栏中选择刚才所加入位图的ID即可。
但要注意,加入的图片一般会覆盖在某些控件上,应该合理布局。
最终效果
3代码实现
1·为查询系统添加代码
(接Two·6)在点击编辑后,首先在·cpp文件最上方加入头文件
#include"FindDlg.h"
然后在后面voidCKuqiView:
:
OnButton2()函数中加入
{FindDlgmyDlg;
myDlg.DoModal();
m_pSet->MoveFirst();
while(!
m_pSet->IsEOF())
{
if(m_pSet->m_column1==myDlg.m_strName)
{
UpdateData(FALSE);
return;
}
m_pSet->MoveNext();
}
MessageBox("您查询的球员可能不是超级巨星","请注意",MB_OK|MB_ICONWARNING);
return;
}
2·为视频播放器插入Open按键
(接Two·7)打开Open按键的编辑后,加入如下编码:
voidShow:
:
OnButton2()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
charszFileFilter[]=
"Mp3File(*.mp3)|*.mp3|"
"WmaFile(*.wma)|*.wma|"
"VideoFile(*.dat)|*.dat|"
"WaveFile(*.wav)|*.wav|"
"AVIFile(*.avi)|*.avi|"
"MovieFile(*.mov)|*.mov|"
"MediaFile(*.mmm)|*.mmm|"
"MidFile(*.mid;*,rmi)|*.mid;*.rmi|"
"MPEGFile(*.mpeg)|*.mpeg|"
"AllFile(*.*)|*.*||";//文件类型过滤
CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK){
CStringPathName=dlg.GetPathName();
PathName.MakeUpper();
m_ActiveMovie.SetUrl(PathName);
}
}
3·连接“视频展示”与“播放窗”
(接Two·7)进编辑后,将CKuqiView.h文件翻至最上方,然后加入
#include"Show.h"
再在下方按键函数中加
voidCKuqiView:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
Shows;
s.DoModal();
}
4系统测试
功能性测试:
在这一环节中,这个程序完成目的是比较好的。
最终还是基本达到了预期效果,功能实现的也比较全面。
容错性测试:
在这个环节里,有很多是我在编写程序中遇到的,问题如下:
一.MediaPlayer在作为控件后,虽然很多函数都是开放的,而且那些基本按键都是存在的,可是恰恰是关键的按键却无法实现调用。
比如,我想自己插入一个按键去实现对MediaPlayer的“播放操作”,可是我却在CWMPPlayer4(MediaPlayer的一个类)中无法调用,总是会弹出“errorC2039:
'play':
isnotamemberof'CWMPPlayer4”,可是我在CWMPPlayer4中却可以找到它的子类CWMPControls,在这个子类中就存在play()。
最终我尝试着解决,既然,在CWMPControls中不能调用,那我就将play()重新改成一个在CWMPPlayer4下的成员函数,直接将它加入类中,再在”CWMPPlayer4.h”文件中给play()这个函数赋予它原有的功能,最后再删去原来CWMPControls原有的的play()函数。
虽然我知道这更改的源程序的很多代码,可是这样改理论上应该是没错的,并且,最终也没有检测出语法错误,可是在运行的时候就出错了,就是说新的的调用还是有问题,所以,这里我还是有很深的疑问。
二.无法实现的视频拖动。
这个项目,我也研究很长时间,最后总是有问题。
我的目的是在打开视频播放器后可以拖动一个视频放在播放器的窗口里就可以实现视频的自动播放。
我的想法是,因为再拖动视频到窗口里是,最终动作时松开鼠标,所以我加入了“鼠标左键弹起(MouseUp)”的命令,在这个消息里添加消息映射,我尝试了一个m_ActiveMovie.DragAcceptFiles(TRUE);这个函数虽然可以调用,而且它的意义也正是接受文件,后来再添加后紫红播放时还是遇到了不发调用的问题。
三.支持格式太少。
MediaPlayer播放格式支持的太少,这是它本身就存在的弊病,比如现如今网络常用的rm或rmvb的形式,它都无法实现播放。
而我在想问这个控件扩充播放格式时,只在Open里加了一些语句想要实现播放格式的添加,可是这样虽然可以Open里允许打开rm,rmvb形式,但却还是无法播放,看播放也就是所需解码器是另一个模块。
四.不同系统,控件的不同调用。
比如现在我在我的win7系统写好这个程序,其中调用了MediaPlayer,运行也正常。
可为什么在学校的xp系统中会出现很多问题呢?
我自身有一个解,但不应定对。
在win7的系统中MediaPlayer是12代,而Xp中原配的MediaPlayer是10代的。
12代的很多东西都是超越10代的,可因为12代必然向下兼容,所以10代的功能应该都可以在12代中实践,反之,则未必。
虽然从程序的外观看是插入了控件,可是其实每次实现MediaPlayer都还是基于Windows自身的MediaPlayer功能调用,所以系统的改变也会对MediaPlayer的调用存在影响。
五.加入可以随资料变动的图片。
最终这个还是没有研究出来,客观原因是因为这个涉及到了数据库二进制输出等难点,可应该还是主观的原因会多一些。
性能与效率测试:
这方面这个程序还是可以的,除了些多余加载的MediaPlayer类之外,别的语句简洁,清晰,明了。
而且整体操作也比较容易。
易用性测试: