用MFC写简单的音乐播放器.docx

上传人:b****3 文档编号:12631298 上传时间:2023-04-21 格式:DOCX 页数:21 大小:651.11KB
下载 相关 举报
用MFC写简单的音乐播放器.docx_第1页
第1页 / 共21页
用MFC写简单的音乐播放器.docx_第2页
第2页 / 共21页
用MFC写简单的音乐播放器.docx_第3页
第3页 / 共21页
用MFC写简单的音乐播放器.docx_第4页
第4页 / 共21页
用MFC写简单的音乐播放器.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

用MFC写简单的音乐播放器.docx

《用MFC写简单的音乐播放器.docx》由会员分享,可在线阅读,更多相关《用MFC写简单的音乐播放器.docx(21页珍藏版)》请在冰豆网上搜索。

用MFC写简单的音乐播放器.docx

用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_player.newMedia(strFilePath));

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(pNMHDR);

//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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1