基于C++的MFC对话框的音乐播放器.docx
- 文档编号:10232723
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:16
- 大小:75.13KB
基于C++的MFC对话框的音乐播放器.docx
《基于C++的MFC对话框的音乐播放器.docx》由会员分享,可在线阅读,更多相关《基于C++的MFC对话框的音乐播放器.docx(16页珍藏版)》请在冰豆网上搜索。
基于C++的MFC对话框的音乐播放器
C++面向对象程序设计
报
告
姓名:
专业:
电子与通信工程
学号:
201622
时间:
2016年12月5日
基于C++的MFC对话框的音乐播放器
1设计内容
设计题目:
基于C++的MFC对话框的音乐播放器
设计内容:
利用MFC应用程序、媒体控制接口MIC的基本知识,设计一个MP3播放器。
要求能够播放常用Windows音频格式的文件;实现播放控制:
播放、暂停、停止等;实现音量控制:
声音放大、减小等功能。
本次作业的意义在于结合C++语言提供的思想和多样的媒体控制方法,结合用户对媒体播放器的要求和使用音乐播放器的习惯,设计了一款界面简单明了,操作简单实用的音乐播放器。
2相关技术
2.1VC技术应用的基本现状
Microsoft公司1998年推出了VisualC++6.0,它是支持Win32平台应用程序(application)、服务(service)和控件(control)开发的可视化编程的集成环境。
与VC++5.0的最大不同之处是它的帮助功能更强大,MSDN(MicrosoftDeveloperNetworking)为包括VC++6.0在内的所有微软的程序产品提供在线帮助;另外,类的对象的可用成员函数、成员变量及函数的参数类型与个数都能动态显示在屏幕上,用户无须记住那些复杂而又枯燥乏味的函数名及复杂的参数,这无疑使得用VC++编程更加容易。
所以VC++6.0可谓是Microsoft公司的王牌产品,编程功能强大而赢得广大程序的偏爱。
2.2MCI命令接口编程
WindowsMCI(mediacontrolinterface)是控制多媒体设备的高层、通用的命令接口。
MCI可控制所有Windows能驱动的多媒体设备,包括CD音频(CD Audio)、数字视频、动画、数字化波形声音、MIDI音序器、录像机及影碟机等。
MCI包含在Windows系统的MMSYSTEM.DLL动态链接库中,有以协调多媒体事件和MCI设备驱动程序之间的通信。
一些MCI设备驱动程序,如影碟机设备驱动程序,可以直接控制目标设备;而另外一些MCI设备驱动程序,如Wave和MIDI设备驱动程序,可通过MMSYSTEM中的函数,间接控制目标设备;还有一些MCI设备驱动程序则提供与其他Windows动态链接库连接的高层接口。
Microsoft提供的MMSYSTEM.H文件中定义了调用了MCI功能的数据类型和函数原型,在使用MCI功能的任何源模块中都应包含该文件。
2.2.1 MCI命令
应用程序能过MCI设备发送命令(命令消息或命令字符串)来控制MCI设备,MCI命令可以分为4类,如下所述:
系统命令:
直接由MCI解释并由系统处理,是不传送到MCI设备的命令。
通用命令:
所有MCI设备都支持的MCI命令。
可选命令:
MCI设备可选择使用的MCI命令。
专用命令:
针对某类MCI设备或集合的专有MCI命令。
MCI定义了两种接口方式,即命令消息方式和命令字符串方式。
相应地,MCI命令可分为命令消息和命令字符串。
主要的MCI命令及分类如表2-1所示,这些命令可能具有其相应的扩展形式。
表2-1MCI命令列表
MCI命令消息
MCI命令字符串
MCI命令说明
MCI_SOUND
SOUND
播放一段Windows指定的系统声音
MCI_CLOSE
CLOSE
关闭一个MCI设备
MCI_OPEN
OPEN
初始化一个MCI设备
MCI_STATUS
STATUS
从一个MCI设备返回有关的状态信息
MCI_LOAD
LOAD
从一个磁盘文件中加载数据
MCI_PAUSE
PAUSE
暂停播放数据
MCI_PLAY
PLAY
开始播放数据
MCI_RESUME
RESUME
重新开始播放或记录
MCI_STOP
STOP
停止播放或记录
2.2.2 MCI命令消息接口方式
所有MCI函数都以mci为前缀。
对应于MCI命令消息和命令字符串接口方式,MCI函数也分为两类,即命令消息函数和命令字符串函数。
在MMSYSTEM.H中定义了这些函数的原型。
MCI函数如表2-2所示。
表2-2 MCI函数
函数名
功能
类型
mciSendCommand
发送命令消息
命令消息接口函数
mciGetDeviceID
获取MCI设备的ID
mciSendString
发送命令字符串
命令字符串接口函数
mciGetErrorString
获取当前MCI错误的字符串描述
公用函数
MCI命令消息接口方式利用消息和数据结构来给多媒体设备发送命令和接收MCI设备传来的信息。
这种方式的接口函数主要有3个,即mciSendCommand, mciGetDeviceID和mciGetErrorString。
它们的函数原型如下:
MCIERRORmciSendCommand(
MCIDEVICEIDIDDevice,//设备ID
UINTuMsg,//命令消息
DWORDfdwCommand,//命令消息标志
DWORDdwParam//命令消息使用的结构参数地址
);
MCIDEVICEIDmciGetDeviceID(
LPCTSTRlpszDevice//设备类型
);
BOOL(
DWORDfdwError,//错误代码
LPTSTRlpszErrorText,//错误描述
UINTcchErrorText//错误描述长度
);
mciGetDeviceID通过传送MCI设备名lpszDevice来获取MCI_OPEN命令消息找开MCI设备的标识号wDeviceID,其值可用于mciSendCommand的参数wDeviceID。
mciSendCommand用于向标识号为wDeviceID的MCI设备发送命令消息uMsg。
当用送MCI_OPEN命令消息打开一个设备时,将自动创建一个设备标识号。
如果设备打开成功,可以从MCI_OPEN_PARMS结构的wDeviceID数据域中取得该设备的标识号,该值将保存以供后续的MCI命令使用。
如果mciSendCommand调用成功,则返回值为0;否则表示设备驱动出错,这时可用mciGetErrorString来取得错误信息的文字描述。
3设计思路
3.1系统结构分析
3.1.1整体结构设计
图3-1整体结构设计图
3.1.2音乐播放流程图设计
图3-2音乐播放流程图
3.2程序界面设计
(1)系统运行结果示意图如下:
图3-3播放器运行界面
(2)对话框控件的属性描述如图3-4所示:
图3-4播放器对话框控件ID属性及关联变量
(3)对话框控件ID及其描述如表3-1所示:
表3-1对话框控件ID及其描述
控件ID
描述
IDC_about
按钮控件,单击它用来打开“关于”对话框
IDC_exitbt
按钮控件,单击它用来退出程序
IDC_filename
编辑框控件,用来显示音乐文件名称
IDC_filechoice
按钮控件,单击它用来浏览选择歌曲
IDC_play
按钮控件,单击它用来播放歌曲
IDC_pause
按钮控件,单击它用来暂停和恢复播放歌曲
IDC_stop
按钮控件,单击它用来停止播放歌曲
IDC_SLIDER1
滑块控件,单击它用来设定音量大小
IDC_vol
编辑框控件,用来显示音量大小
3.3系统模块设计
(1)浏览/添加功能
该功能能够在本地磁盘中寻找音乐文件,并将文件加载到程序中,获取音频文件的参数。
同时获取文件存取的路径并获取音频文件名,将音频文件名赋值给编辑框同时刷新显示。
具体如下:
首先对文件类型进行过滤,调用DoModa()函数打开对话框选择一个媒体文件,通过GetPathName()函数获取文件路径,通过GetFileName()函数获取文件名后,将文件名字符串赋值给编辑框变量同时在控件上刷新显示“音乐名称:
”后的编辑框。
(2)播放功能
本地磁盘音乐文件添加完毕,单击播放按钮开始播放音乐,程序会调用按钮响应函数,递归调用音乐播放函数Onplay()。
而此函数是通过文件参数和音频设备相绑定,从而实现音乐的播放。
具体如下:
在Onfilechoice()函数中,通过调用CMyDlg类的GetPathName()和GetFileName()函数获取刚才选择的文件路径以及文件名,首先调用该类的play()函数播放歌曲,然后利用GetDlgItem()函数设置“暂停”按钮以及“停止”按钮不可用。
(3)暂停/恢复功能
当音乐处于播放状态时,单击暂停按钮调用暂停函数,再次单击此按钮实现恢复音乐播放。
具体如下:
在OnPause()函数中,首先判断按钮状态。
当按钮状态为“暂停”时,通过调CMyDlg类的pause()函数暂停正在播放的歌曲,然后利用SetDlgItemText()函数将暂停按钮的值设置为恢复;当按钮状态为“恢复”时,通过调CMyDlg类的resume()函数恢复播放歌曲,然后利用SetDlgItemText()函数将恢复按钮的值设置为暂停;
(4)停止功能
当歌曲还未播完时,单击停止按钮时,调用音乐停止函数Onstop(),系统回到初始状态。
具体如下:
在Onstop()函数中,首先通过调用MFCDlg类的stop()函数停止正在播放的歌曲,然后利用GetDlgItem()函数设置“播放”、“暂停”按钮以及“停止”按钮不可用。
(5)音量功能
利用滑块控件和编辑框调节音量的大小,编辑框获取当前音量大小并显示,滑块用于调节音量大小。
利用SetRange()函数设置滑块滑动的范围,SetPos()设置初始值,而编辑框变量值为滑块位置值/10,从而实现音量控制可视化。
在此对话框内可以对音量进行增大或减小以及静音的设置。
3.4类与函数层次介绍
图3-5类与函数层次关系图
Pause:
暂态正在播放的音乐
Play:
控制音乐播放
Stop:
停止播放音乐
Load:
加载播放的音乐
RetVolumn:
设置音乐播放音量
4程序设计总结
通过这次面向对象的大作业的编写,我用本学期所学的知识做了一个简单的程序。
虽然功能可能有点简单,但是锻炼我的实际运用能力同时加深了我对这门课程的理解,掌握了用MFC创建基于对话框的应用程序,同时了解了MCI相关知识。
突然间发现学这门课程在实际中的重要性。
但是不能否的是MFC中包含很多很多的东西。
只有花费更多的精力才能在这方面有所突破。
这次课程设计我做了MP3播放器的设计,MP3播放器主要对常用Windows音频格式的文件实现播放控制:
播放歌曲、暂停播放、音量的控制等功能。
即使本次大作业的设计中可以实现播放、暂停以及音量等功能,但仍然存在着很多不足。
例如歌曲播放列表,上一曲和下一曲,歌词的同步播放和播放模式的功能都没有得到实现。
最大的感想就是能够学会知识,但是能够用所学知识解决实际问题才是重中之重。
作为编程人员,能编代码容易,但要灵活调试程序并编译通过才是难点。
VC的学习之路还很漫长,需要锻炼和学习的地方还很多但我会继续努力突破面临的种种困难。
5关键代码附录
//定义三个全局函数
HWNDm_hWnd;;//记录当前窗口的句柄
DWORDDeviceID;;//指定播放音乐的设备ID
MCI_OPEN_PARMSmciOpenParms;//指定打开音乐文件的参数
voidLoad(HWNDhWnd,CStringstrFilePath)//加载设备文件,将文件路径传给MCI_OPEN_PARMS类
{
m_hWnd=hWnd;
mciSendCommand(DeviceID,MCI_CLOSE,0,0);//改变设备文件时先将原来打开的关闭,可以通过msdn查看具体用法
mciOpenParms.lpstrElementName=strFilePath;//将音乐文件路径传给设备
DWORDdwReturn;
if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)(PVOID)&mciOpenParms))
{//调用库函数打开媒体文件;打开文件时第一个参数必须是NULL,且第三个参数必不可少
//如果打开文件失败,则将出错信息储存在buffer,并显示出错警告
charbuffer[256];
mciGetErrorString(dwReturn,buffer,256);
MessageBox(hWnd,buffer,"出错警告!
",MB_ICONHAND|MB_ICONERROR|MB_ICONSTOP);//不能打开的话显示出错信息
}
DeviceID=mciOpenParms.wDeviceID;//打开文件成功就关联文件到设备
//如果读取成功,则将音乐文件关联到设备;如果失败,则返回出错信息
}
voidplay()//媒体播放函数
{
MCI_PLAY_PARMSmciplayparms;
mciplayparms.dwCallback=(DWORD)m_hWnd;
mciplayparms.dwFrom=0;//当点击播放时从0开始播放
mciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms);//发送播放命令
}//dwCallback和MCI_NOTIFY是配对出现的;dwFrom用于设置音乐播放的起始位置
voidresume()//恢复播放
{
mciSendCommand(DeviceID,MCI_RESUME,0,0);
}
voidpause()//暂停播放
{
mciSendCommand(DeviceID,MCI_PAUSE,0,0);
}
voidstop()//停止播放
{
mciSendCommand(DeviceID,MCI_STOP,0,0);
mciSendCommand(DeviceID,MCI_CLOSE,0,0);//当点击停止按钮时,将所有的信息都清除掉
}//点停止按钮时清除设备信息,再点播放按钮就播放不了音乐了
DWORDSetVolumn(DWORDvol)//设置音量vol为要设置的音量
{
MCI_DGV_SETAUDIO_PARMSSetVolumn;//这是设置音量的参数数据结构
SetVolumn.dwCallback=NULL;
SetVolumn.dwItem=MCI_DGV_SETAUDIO_VOLUME;//动作是设置音量
SetVolumn.dwValue=vol;//音量值是vol
mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE|MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&SetVolumn);
return0;
}
……
m_slider.SetRange(0,1000);//滑块的移动范围0~1000
m_slider.SetPos(500);//滑块指针的初始位置设为500代表初始音量为50
GetDlgItem(IDC_play)->EnableWindow(false);//文件没有读取时所有按钮应该是不可选的
GetDlgItem(IDC_pause)->EnableWindow(false);
GetDlgItem(IDC_stop)->EnableWindow(false);
……
voidCMyDlg:
:
Onabout()//与关于按钮关联
{
CAboutDlgdlg;
dlg.DoModal();
}
voidCMyDlg:
:
Onexitbt()//与退出按钮关联
{
CDialog:
:
OnCancel();
}
voidCMyDlg:
:
OnCustomdrawSlider1(NMHDR*pNMHDR,LRESULT*pResult)
{
UpdateData(true);
m_int=m_slider.GetPos()/10;//取滑块的当前值/10,作为显示音量
SetVolumn(m_int);//当前滑块位置
UpdateData(false);//将变量的值读取到控件上
*pResult=0;
}//m_slider.GetPos()获取滑块指针的位置
voidCMyDlg:
:
Onfilechoice()//与控件浏览相关联
{
charszFileFilter[]="mp3文件(*.mp3)|*.mp3|"//选择要过滤的字符串
"wma文件(*.wma)|*.wma|"
"wav文件(*.wav)|*.wav|"
"所有文件(*.*)|*.*|";
CFileDialogdlg(true,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);//创建文档打开类
if(dlg.DoModal()==IDOK)
{
CStringstrFilepath=dlg.GetPathName();//获取路径
CStringstrFilename=dlg.GetFileName();//获取文件名
SetDlgItemText(IDC_filename,strFilename);//将文本框设置为当前的文件名
Load(this->m_hWnd,strFilepath);//将文件路径使得MCI设备和文件关联
GetDlgItem(IDC_play)->EnableWindow(true);//文件读取成功时播放按钮变可选的
}
}
voidCMyDlg:
:
Onplay()//播放按钮
{
play();//调用播放函数
GetDlgItem(IDC_pause)->EnableWindow(true);//让暂停和停止按钮有效
GetDlgItem(IDC_stop)->EnableWindow(true);
}
voidCMyDlg:
:
Onpause()//暂停按钮相关联
{
CStringstrtemp;
GetDlgItemText(IDC_pause,strtemp);
//获取按钮状态:
将名为IDpause控件上的字符赋值给strTemp
if(strtemp.Compare("暂停")==0)//比较strTemp和“暂停”,如果相等则返回0
{
pause();//选择暂停后,调用pause()暂停播放
SetDlgItemText(IDC_pause,"恢复");//将暂停按钮的值设置为恢复
}
if(strtemp.Compare("恢复")==0)//选择恢复后,调用resume()恢复播放
{
resume();
SetDlgItemText(IDC_pause,"暂停");//将恢复按钮的值设置为暂停
}
}
voidCMyDlg:
:
Onstop()//停止按钮
{
stop();//调用停止函数
SetDlgItemText(IDC_pause,"暂停");
GetDlgItem(IDC_play)->EnableWindow(false);//当stop按钮按下时,所有按钮均不可用
GetDlgItem(IDC_pause)->EnableWindow(false);
GetDlgItem(IDC_stop)->EnableWindow(false);
}
voidCMyDlg:
:
OnCustomdrawSlider2(NMHDR*pNMHDR,LRESULT*pResult)
{
*pResult=0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 C+ MFC 对话框 音乐 播放