用MFC写简单的音乐播放器.docx
- 文档编号:12631298
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:21
- 大小:651.11KB
用MFC写简单的音乐播放器.docx
《用MFC写简单的音乐播放器.docx》由会员分享,可在线阅读,更多相关《用MFC写简单的音乐播放器.docx(21页珍藏版)》请在冰豆网上搜索。
用MFC写简单的音乐播放器
多媒体技术论文
题目名称:
基于MFC的多媒体播放器的设计与实现
学院:
计算机学院
专业班级:
计算机科学与技术四班
学号:
姓名:
指导教师:
完成日期:
2016年6月29日
1.摘要........................................................................................3
2.关键字....................................................................................3
3.开发工具的介绍.....................................................................3
4.基本功能的实现.....................................................................3
5.设计思路.................................................................................4
6.软件设计.................................................................................5
7.结果展示................................................................................15
8.心得体会................................................................................16
基于MFC的多媒体播放器的设计与实现
计科四班罗前
指导老师王勇智
摘要:
多媒体技术是现在信息技术领域发展的很迅速的一个技术,它的发展方向也很广泛,我们的生活几乎离不开多媒体,所以我设计了一个小程序,基于MFC的多媒体播放器的设计与实现,我认为这个小程序比较实用而且并不是很复杂,而且可以通过它来进入多媒体的这道大门,进行更加深入的学习。
关键字:
MFC多媒体MediaplayerActiveX
开发工具的介绍:
VisualC++是Microsoft公司在1998年推出的基于Windows9X和WindowNT的优秀集成开发环境。
该环境为用户提供了良好的可视化编程环境,程序员可以利用该开发环境轻松地访问C++源代码的编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件。
VisualC++不仅包括编译器,而且它还包括许多的有用的组件,通过这些组建的协同工作,可以在VisualC++6.0集成环境中完成创建源文件,编辑资源,以及对源程序的编译,连接和调试等各项工作。
MFC(MicrosoftFoundationClass)是用来编写Windows应用程序的c++类集,其中封装了大部分WindowsAPI函数和Windows控件,使用MFC类库和VisualC++提供的高度可视的应用程序开发工具,可使应用程序开发变得简单,提高代码的可靠性和可重用性。
随着播放器性能的极大提高,程序中经常要播放一些音频,如果能够简单的插入一些音频并播放,将极大的缩短程序开发时间。
本文就是基于MFC在VisualC++环境中利用windowsmediaplayer控件实现音频文件的播放。
ActiveX控件是基于COM的可重用组件,主要用于插入ActiveX控件包容器或Web页,ActiveX在外观上和使用上和普通控件一样,还提供属性页以支持在包容器的设计阶段对ActiveX控件的属性进行可视化设计。
基本功能的实现:
这个播放器具有打开文件,播放,暂停,停止,全屏,退出,音量控制,上一曲,下一曲,快进,快退,静音等基本播放功能,并可以播放MP3,avi,等格式的多媒体文件。
同时还具有播放列表,并且可以在播放模式中选择顺序播放,循环播放,单曲播放三种方式。
设计思路:
该播放器分为十个模块,根据ActiveMovie控件实现他们各自相应的功能。
打开模块:
打开目标文件。
进度模块:
显示目标状态。
快进退模块:
调节播放的快进和快退。
播放模块:
播放音频文件。
暂停模块:
暂停正在播放的音频文件。
停止模块:
结束当前正在播放的文件,但是播放器并不退出。
全屏模块:
实现文件的全屏播放。
退出模块:
关闭该播放器。
循环模块:
实现播放列表中的全部文件的单曲、随机或顺序循环播放。
音量模块:
调节文件播放的音量大小和静音。
使用VC++6.0的AppWizard、ClassWizard和其中的各种控件可以方便地建立各种应用程序。
但是想要实现更高级更复杂的功能,就要借助丰富的ActiveX控件资源。
本实验计划使用VC++6.0自带的一个ActiveX控件——ActiveMovieControlObject,来设计多媒体播放器。
此多媒体具有一般的播放功能,能播放:
*.mp3,*.wma,*.mdi,*.wav,*.avi,*.dat等文件,还有Repeat功能。
软件设计:
设计步骤:
1、首先我们要注册控件:
在windows“运行”里写入:
regsvr32msdxm.ocx然后单击确定。
只有注册了控件,后面的实验才能顺利的做下去。
2、然后打开VisualC++6.0,在Projects下选择MFCAppWizard(exe),并取名MediaPlayer,然后建立基于对话框的应用程序。
图3
图4
图5
图6
图7MFCAppWizard生成的对话框
3、打开ResourceView,选择其中的对话框,打开其中的主对话框,去掉对话框上的“确定”按钮,保留“取消”,将Caption改为“退出”。
然后再在上面加上几个按钮,ID和Caption分别为
IDC_OPEN,打开;
IDC_PLAY,播放;
IDC_PAUSE,暂停;
IDC_STOP,停止;
IDC_CLOSE,退出;
IDC_LOWER,-;
IDC_UPPER,+;
IDC_FULLSCREEN,全屏;
IDC_ABOUT,关于;
IDC_LAST,上一曲;
IDC_NEXT,下一曲;
IDC_FORWARD,快进;
IDC_REVERSE,快退;
最终如图8所示。
图8播放器功能界面
4、加入ActiveMovieControl控件。
打开工程>增加到工程->ComponentsandControls->RegisteredActiveXControls对话框,选择其中的ActiveMovieControlObject,Insert,OK之后,会发现控件面板上多了一项ActiveMovieControlObject,将它选中,直接放在对话框上,并拖成合适大小。
最终效果如图10所示。
图9
图10
图10最终界面效果
5、为ActiveMovieControl控件设置变量m_ActiveMovie。
点中它,按Ctrl+W打开ClassWizard为它添加变量m_ActiveMovie。
图12为ActiveMovieControl控件设置变量m_ActiveMovie
6、为程序添加消息处理函数。
打开ClassWizard,为各个按钮加入消息处理函数。
在MediaPlayerDlg.cpp文件里为各消息处理函数添加代码,部分代码如下:
打开文件:
voidCMediaPlayerDlg:
:
OnOpen()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_listCtrl.SetFocus();CStringstr;
TCHARszFilter[]=_T("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(*.*)|*.*||");
CFileDialogfileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,this);
CStringstrFilePath;
if(IDOK==fileDlg.DoModal())
{
strFilePath=fileDlg.GetPathName();
strFilePath.MakeUpper();
m_player.SetUrl(strFilePath);
m_media=static_cast
m_list.appendItem(m_media);
m_listCtrl.InsertItem(count,m_media.GetName());
m_listCtrl.SetItemText(count,1,_T(m_media.getItemInfo("FileType")));
m_listCtrl.SetItemText(count,2,_T(m_media.GetDurationString()));
m_listCtrl.SetItemText(count,3,_T(strFilePath));
m_listCtrl.SetItemText(count++,4,_T(m_media.getItemInfo("Duration")));
POSITIONpos;
pos=m_listCtrl.GetFirstSelectedItemPosition();
IndexInFieldList=m_listCtrl.GetNextSelectedItem(pos);
m_listCtrl.SetItemState(IndexInFieldList,~LVIS_SELECTED,LVIS_SELECTED);
m_player.SetUrl(m_listCtrl.GetItemText(0,3));
m_listCtrl.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED);
}
}
播放:
voidCMediaPlayerDlg:
:
OnPlay()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(m_list.GetCount()<=0)MessageBox("列表无文件!
","Warning",MB_OK);
KillTimer(0);
m_control.play();
if(m_control.GetCurrentPosition()==0)
m_control.SetCurrentPosition(0.01);
SetTimer(0,20,NULL);
}
暂停:
voidCMediaPlayerDlg:
:
OnPause()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_control.pause();
}
停止:
voidCMediaPlayerDlg:
:
OnStop()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
KillTimer(0);
m_control.stop();
}
全屏:
voidCMediaPlayerDlg:
:
OnFullscreen()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(!
m_player.GetFullScreen())
{
m_control.pause();
AfxMessageBox("请双击退出全屏模式!
!
");
m_player.SetFullScreen(true);
m_control.play();
}
}
退出:
voidCMediaPlayerDlg:
:
OnExit()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
SendMessage(WM_CLOSE);
}
上一曲:
voidCMediaPlayerDlg:
:
OnLast()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_listCtrl.SetFocus();
POSITIONpos;CStringstrName;
UINTflag1=LVIS_SELECTED|LVIS_FOCUSED;
pos=m_listCtrl.GetFirstSelectedItemPosition();
IndexInFieldList=m_listCtrl.GetNextSelectedItem(pos);
if(IndexInFieldList==-1)
{
AfxMessageBox("列表内没有被选中项!
");
return;
}
if(IndexInFieldList==0)
{
AfxMessageBox("已经到了列表头部!
");
m_listCtrl.SetItemState(IndexInFieldList,flag1,flag1);
return;
}
m_listCtrl.SetItemState(IndexInFieldList,~LVIS_SELECTED,LVIS_SELECTED);
m_listCtrl.SetItemState(IndexInFieldList-1,flag1,flag1);
strName=m_listCtrl.GetItemText(IndexInFieldList-1,3);KillTimer(0);
m_control.stop();
m_player.SetUrl(strName);
m_control.SetCurrentPosition(0.01);
m_control.play();
SetTimer(0,20,NULL);
}
下一曲:
voidCMediaPlayerDlg:
:
OnNext()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_listCtrl.SetFocus();
POSITIONpos;CStringstrName;
UINTflag1=LVIS_SELECTED|LVIS_FOCUSED;
pos=m_listCtrl.GetFirstSelectedItemPosition();
IndexInFieldList=m_listCtrl.GetNextSelectedItem(pos);
if(IndexInFieldList==-1)
{
AfxMessageBox("列表内没有被选中项!
");
return;
}
if(IndexInFieldList==m_listCtrl.GetItemCount()-1)
{
AfxMessageBox("已经到了列表末尾!
");
m_listCtrl.SetItemState(IndexInFieldList,flag1,flag1);
return;
}
m_listCtrl.SetItemState(IndexInFieldList,~LVIS_SELECTED,LVIS_SELECTED);
m_listCtrl.SetItemState(IndexInFieldList+1,flag1,flag1);
strName=m_listCtrl.GetItemText(IndexInFieldList+1,3);KillTimer(0);
m_control.stop();
m_player.SetUrl(strName);
m_control.SetCurrentPosition(0.01);
m_control.play();
SetTimer(0,20,NULL);
}
快进:
voidCMediaPlayerDlg:
:
OnForward()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
doublet=m_control.GetCurrentPosition();
m_control.SetCurrentPosition(t=t+10);
}
快退:
voidCMediaPlayerDlg:
:
OnReverse()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
doublet=m_control.GetCurrentPosition();
m_control.SetCurrentPosition(t=t-10);
}
静音:
voidCMediaPlayerDlg:
:
OnSilence()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(!
m_setting.GetMute())
m_setting.SetMute(true);
else
m_setting.SetMute(false);
}
音量加减:
voidCMediaPlayerDlg:
:
OnAdd()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
m_setting.SetVolume(m_setting.GetVolume()+10);
m_VOLUME.SetPos(m_setting.GetVolume());
}
voidCMediaPlayerDlg:
:
OnSub()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intVolume=m_setting.GetVolume();
m_setting.SetVolume(Volume=Volume-10);
m_VOLUME.SetPos(m_setting.GetVolume());
}
列表:
voidCMediaPlayerDlg:
:
OnClickList1(NMHDR*pNMHDR,LRESULT*pResult)
{
//TODO:
Addyourcontrolnotificationhandlercodehere
LPNMITEMACTIVATEpNMItemActivate=reinterpret_cast
//TODO:
Addyourcontrolnotificationhandlercodehere
NMLISTVIEW*pNMListView=(NMLISTVIEW*)pNMHDR;
*pResult=0;
CStringstrName;
if(-1!
=pNMListView->iItem)
{
strName=m_listCtrl.GetItemText(pNMListView->iItem,3);
KillTimer(0);
m_control.stop();
m_player.SetUrl(strName);
m_control.SetCurrentPosition(0.01);
m_control.play();
SetTimer(0,20,NULL);
}
}
另外函数OnTimer()是通过ClassWizard(Ctrl+W)来添加的:
图13
voidCVedioPlayerDlg:
:
OnTimer(UINTnIDEvent)
{
doubleCurrentPos=m_ActiveMovie.GetCurrentPosition();
if(CurrentPos==0&&isRepeat)//如果当前是文件的起始位置而且为重复播放状态
m_ActiveMovie.Run();
CDialog:
:
OnTimer(nIDEvent);
}
实验展示:
心得体会:
通过这次多媒体播放器的设计,让我切身的感受到了计算机技术在多媒体中的应用是多么的广泛。
同时,这也是理论知识的第一次实现,学习了两年的计算机知识,第一次真正的实现了一个小程序。
虽然这个播放器可用性实在不佳,尽管能实现一些基本功能,但是在程序结构上还有很大方面的优化空间,但这次利用VisualC++编写出的多媒体播放器让我很有成就感,虽然很多都是老师一步步教我们怎么去做的,三十当真正的把程序编写出来的时候就别提有多兴奋了。
在工作和生活中多媒体技术和我们息息相关,在计算机技术不断普及的今天,对于我们来说,掌握多媒体技术是非常重要的,这也是我们以后要学习的重点。
这次课程设计论文试一次理论和实际相结合的过程,让我们明白理论知识往往是不够的,只有把所学的理论和实际相结合,才会提高自己的综合实际能力,在设计的过程中,我们常常会遇到很多问题,但是我们不能丧气,虽然有时候解决一个很小的问题也需要花费我们几个小时的时间,但是,编程往往是一个苦中有乐的过程,等到程序完成的那一刻,我们会很开心,我希望在以后的学习中,自己独立思考的能力会越来越强,这样,知识就会学的越来越多,我也会得到更多的锻炼。
参考文献:
[1]多媒体技术教程机械工业出版社.2014
[2]C程序设计(第三版)清华大学出版社.2013
[3]C++语言程序设计教程(第二版)清华大学出版社.2014
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 简单 音乐 播放