Visual C++课程设计
题目名称:简单的音乐播放器班级:信息安全1101
姓名:曹廷祥
学号:1111290103
指导教师:阎光伟
完成时间:2013.1.18
一.题目描述
音乐播放器是一种用于播放各种音乐文件的多媒体播放软件。利用MFC 应用程序、媒体控制接口MIC 的基本知识,设计一个功能非常简单易于操作的MP3播放器。要求能够播放常用Windows 音频格式的文件;实现播放控制:播放、暂停、音量增减、添加歌曲等功能;实现从本地磁盘加入文件,然后对其进行播放。本程序是基于MFC 对话框的简单程序实现音乐的简单控制。
二.功能分析
MFC 简单音乐播放器主要对常用Windows 音频格式的文件实现播放控制:播放歌曲、暂停播放、停止播放等;实现音量控制:静音、声音放大以及声音减小的功能。利用MCI 基本知识实现相关功能。
MCI (Media Control Interface )媒体控制接口是MircroSoft 提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、像等多媒体设备,而不需要知道它们的内部工作状况。它所支持的媒体格式包括avi 、wav 、mp3等等。音频文件包括多种格式的文件,MP3就是其中的一种。MP3是一种音频压缩的国际技术标准,它一般需要MP3播放器来读取。通过该程序可以实现简单的音乐播放。核心是让音乐文件和音乐播放设备关联。
三.系统结构分析 (1)整体结构设计
图3-1-a 整体结构设计图
(2)音乐播放流程图设计
M P 3播 放 器
打 开 文 件
播
放 歌 曲
暂
停 播 放
停
止
播 放
音
量
控 制
图3-2-a 音乐播放流程图
四.系统模块设计
(1)背景图片和背景音乐
首先将外部的音频文件资源添加到MFC 声音资源中,手工制作背景图片加入到资
源位图中。在OnPaint()函数中添加设置显示代码。最终使音乐播放器显示背景图片同时播放背景音乐。
(2)添加功能
该功能能够在本地磁盘中寻找音乐文件,并将文件加载到程序中,获取音频文件的
参数。同时获取文件存取的路径并获取音频文件名,将音频文件名赋值给编辑框同时刷新显示。具体如下:首先对文件类型进行过滤,调用DoModa()函数打开对话框选择一个媒体文件,通过GetPathName()函数获取文件路径,通过GetFileName()函数获取文件名后,将文件名字符串赋值给编辑框变量同时在控件上刷新显示“你选择的歌曲是(文件名)”,然后利用GetDlgItem()函数设置“暂停”按钮以及“停止”按钮不可用。
(3)播放功能
本地磁盘音乐文件添加完毕,单击播放按钮开始播放音乐,程序会调用按钮响应函
数,递归调用音乐播放函数Onplay 。而此函数是通过是文件参数和音频设备想绑定,从而实现音乐的播放。具体如下:在Onfilechoice()函数中,通过调用CMFCDlg 类的GetPathName()和GetFileName()函数获取刚才选择的文件路径以及文件名,调用该类的play()函数播放歌曲。
(4)暂停功能
当音乐处于播放状态时,单击暂停按钮调用暂停函数,再次单击此按钮实现音乐继
续播放。具体如下:在OnPause()函数中,首先通过调CMFCDlg 类的pause()函数暂停正
开始
添加音乐
播 放
停止
暂停
播放结束
退出
在播放的歌曲。
(5) 停止功能
当歌曲还未播完时,单击停止按钮时,调用音乐停止函数Onstop(),系统回到初始状态。具体如下:在Onstop()函数中,首先通过调用MFCDlg类的stop()函数停止正在播放的歌曲。
(6)音量功能
利用滑块控件和编辑框调节音量的大小,编辑框获取当前音量大小并显示,滑块用于调节音量大小。利用SetRange函数设置滑块滑动的范围,SetPos设置初始值,而编辑框变量值为滑块位置值/10,从而实现音量控制可视化。在此对话框内可以对音量进行增大或减小以及静音的设置。
五.主要类的功能设计
(1)首录类CloadDlg
先定义对话框登录类CLoadDlg,作为登录对话框的基类,在应用程序初始化的时候,自动显示对话框。经登录判断后决定是否能够进入播放器界面。
(2) 对话框类CMFCDlg
其次定义核心对话框类CMFCDlg,是播放器对话框的直接基类,控制音乐的打开/播放/暂停/停止等功能。该类包含多个函数,除了控制音乐的函数外还有右键菜单函数,快捷键功能函数以及背景音乐背景图片的设置函数等。
(3) 按钮类CSXBtn
最后是控制按钮的风格类CSXBtn,该类是从CButton派生而来。为该类添加了一个函数DrawItem()控制按钮控件的背景,显示风格,字体颜色等。调用时只需将按钮的owen 属性选中,并添加关联变量,变量类型为CSXBtn,运行时效果明显。
六.程序界面设计
(1)系统运行结果示意图如下:
<1>登陆运行界面如图6-1所示:
图6-1登录运行界面
<2>播放器运行界面如图6-2所示:
图6-2播放器运行界面
(2)对话框控件的属性描述如图6-3和6-4所示:
图6-3-a播放器对话框控件ID属性及关联变量
图6-3-b登陆控件ID属性及关联变量
(3)菜单功能设计
为了使程序使用起来比较灵活便捷,在对话框中添加了菜单和与鼠标右击相呼应的右键菜单,其功能和按钮功能相一致。
(4)按钮功能设计
为了使按钮比较美观,本人从Cbutton类中派生出CSXBtn类,进一步美化按钮,
例如按钮背景,按钮的字体颜色等。同时为每一个按钮添加关联变量和单击响应函数。使用起来非常方便。
(5)快捷键功能设计
在对话框中不能直接通过向导添加快捷键,故而通过CMFCDlg 类的PreTranslateMessage()函数实现此功能。
七.类与函数的设计与实现
(1) 类与函数层次介绍
图7-1-a 类与函数层次关系图
Pause:暂态正在播放的音乐 Play :控制音乐播放 Stop :停止播放音乐 Load :加载播放的音乐
RetVolumn:设置音乐播放音量
(2)函数代码功能介绍
//定义全局变量
HWND m_hWnd;//记录当前窗口的句柄 DWORD DeviceID;//制定播放音乐设备ID
MCI_OPEN_PARMS mciOpenParms;//指定打开音乐文件参数 //Load 函数的定义
void Load(HWND hWnd,CString strFilePath)//将文件路径传送给MCI_OPEN_PARMS {
m_hWnd=hWnd;
mciSendCommand(DeviceID,MCI_CLOSE,0,0);//MCI 的命令消息接口 mciOpenParms.lpstrElementName=strFilePath;
if(dwReturn==mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT, (DWORD)(PVOID)&mciOpenParms)) {
mciGetErrorString(dwReturn,buffer,256);//命令通过API 函数mciSendString 传给MCI DeviceID=mciOpenParms.wDeviceID;//成功则把文件关联到设备,失败则返回错误 }
//播放函数定义 void play()
CMFCDlg
Play
Stop
SetVolumn
Pause
Load
{
MCI_PLAY_PARMS mciplayparms;
mciplayparms.dwCallback=(DWORD)m_hWnd;
mciplayparms.dwFrom=0;
mciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID) &mciplayparms);
}
//暂停函数定义
void pause()
{
mciSendCommand(DeviceID,MCI_PAUSE,0,0);
}
//停止函数定义
void stop()
{
mciSendCommand(DeviceID,MCI_STOP,0,0);
mciSendCommand(DeviceID,MCI_CLOSE,0,0);
}
//设置音量函数定义
DWORD SetVolumn(DWORD vol)
{
MCI_DGV_SETAUDIO_PARMS SetV olumn;
SetV olumn.dwCallback=NULL;
SetV olumn.dwItem=MCI_DGV_SETAUDIO_VOLUME;
SetV olumn.dwValue=vol;
mciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_V ALUE|MCI_DG V_SETAUDIO_ITEM,(DWORD)(LPVOID)&SetV olumn);
}
//初始化对话框定义
BOOL CMFCDlg::OnInitDialog()
{
m_slider.SetRange(0,1000);//滑块的移动范围
m_slider.SetPos(500);//滑块中点
GetDlgItem(IDC_play)->EnableWindow(false);
GetDlgItem(IDC_pause)->EnableWindow(false);
GetDlgItem(IDC_stop)->EnableWindow(false);
PlaySound((LPCTSTR)IDR_WA VE1,AfxGetInstanceHandle(),SND_RESOURCE|SND_AS YNC); //背景音乐设置
}
//绘制对话框定义
void CMFCDlg::OnPaint()
{
//背景颜色填充
CRect rc;
GetClientRect( &rc );// 获取客户区
CPaintDC dc(this);
dc.FillSolidRect(&rc, RGB(0,160,0)); // 填充客户区颜色
//背景图片填充
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP); //IDB_BITMAP图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
Cbitmap*pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
CDialog::OnPaint();
}
}
//滑块设定定义
void CMFCDlg::OnCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult)
{
m_vol=m_slider.GetPos()/10;//音量设定
SetV olumn(m_slider.GetPos());//当前滑块位置
}
//打开文件按钮响应函数
void CMFCDlg::Onfilechoice()
{
char szFileFilter[]="mp3文件(*.mp3)|*.mp3|"//设置文件播放格式
"wma文件(*.wma)|*.wma|"
"wav文件(*.wav)|*.wav|"
"所有文件(*.*)|*.*|";
CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONL Y,szFileFilter);
if(dlg.DoModal()==IDOK)
{
CString strFilepath=dlg.GetPathName();//返回文件路径(盘符+路径+文件名
CString strFilename=dlg.GetFileName();//返回文件名
SetDlgItemText(IDC_filename,strFilename);//设置对话框中控件的文本和标题
Load(this->m_hWnd,strFilepath);//将文件路径使得MCI设备和文件关联
GetDlgItem(IDC_play)->EnableWindow(true);//函数检索指定对话框中控件句柄GetDlgItem(IDC_pause)->EnableWindow(true); //控制按钮的显示
GetDlgItem(IDC_stop)->EnableWindow(true);
}
}
//播放按钮响应函数
void CMFCDlg::Onplay()
{
play();
SetDlgItemText(IDC_pause,"暂停");
}
//暂停按钮响应函数
void CMFCDlg::Onpause()
{
CString strtemp;
GetDlgItemText(IDC_pause,strtemp);
if(https://www.doczj.com/doc/5d15398623.html,pare("暂停")==0)
{
pause();
SetDlgItemText(IDC_pause,"重播");
}
if(https://www.doczj.com/doc/5d15398623.html,pare("重播")==0)
{
play();
SetDlgItemText(IDC_pause,"暂停");//设置按钮文本标题
}
}
//停止按钮响应函数
void CMFCDlg::Onstop()
{
stop();
SetDlgItemText(IDC_pause,"暂停");
GetDlgItem(IDC_play)->EnableWindow(false);
GetDlgItem(IDC_pause)->EnableWindow(false);
}
//右键菜单的设计
void CMFCDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
CMenu m_menu;
m_menu.LoadMenu(IDR_RMENU);
CMenu *pMenu=m_menu.GetSubMenu(0);
POINT p;
GetCursorPos(&p);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,p.x,p.y,this);
pMenu->DestroyMenu();
}
//快捷键的设定
BOOL CMFCDlg::PreTranslateMessage(MSG* pMsg)
{
//判断Ctrl键是否按下
BOOL flag=((GetKeyState(VK_CONTROL) & (1<<(sizeof(SHORT)*8-1)))!= 0);
if(pMsg->message == WM_KEYDOWN)
{
if(flag)
{
switch(pMsg->wParam)
{
case 'P':
CMFCDlg::Onstop();break;
case 'O':
CMFCDlg::Onfilechoice() ;break;
case 'E':
CMFCDlg::Onexitbt();break;
case 'B':
CMFCDlg::Onplay();break;
case 'N':
CMFCDlg::Onpause();break;
}}}
}
// 按钮设置
void CSXBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CBrush B;
CRect rect;
CRect focusRect;
focusRect.CopyRect(&lpDrawItemStruct->rcItem);
focusRect.left+=4;
focusRect.right-=4;
focusRect.top+=4;
focusRect.bottom-=4;
rect.CopyRect(&lpDrawItemStruct->rcItem);
pDC->Draw3dRect(rect,::GetSysColor(COLOR_BTNSHADOW),::GetSysColor(COLOR_B TNHILIGHT));
B.CreateSolidBrush(RGB(10,80,10));
::FillRect(lpDrawItemStruct->hDC,&rect,(HBRUSH)B.m_hObject);
::SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
COLORREF crOldColor=::SetTextColor(lpDrawItemStruct->hDC,RGB(0,250,0));
::DrawText(lpDrawItemStruct->hDC,strText,strText.GetLength(),&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC,crOldColor);
}
(3)使用说明
该系统界面包括添加、播放/暂停、音量增减、等按钮。先单击‘文件’按钮,在本地磁盘找打音乐文件,然后将文件加入,添加的歌曲显示在播放列表中。选中播放列表的歌曲,然后单击‘播放’按扭,开始播放音乐,直到播放完后停止。在播放音乐文件期间,单击‘暂停’按钮,可以暂停播放音乐,再次单击‘暂停’按钮时,又可以继续播放。同时在音量按钮单击鼠标左键拖动调整音量的大小。注意:登录用户名为:ctx007密码为:007。添加完文件后,应先选中播放列表中的歌曲在点击‘播放’按钮才能播放。
八.程序设计总结
通过这次课程设计,用本学期所学的知识做了一个简单的程序。虽然功能可能有点简单,但是锻炼我的实际运用能力同时加深了我对VC++这门课程的理解,掌握了用MFC创建基于对话框的应用程序,同时了解了MCI相关知识。突然间发现学这门课程在实际中的重要性。但是不能否的是MFC中包含很多很多的东西。只有花费更多的精力才能在这方面有所突破。这次课程设计我做了MP3播放器的设计,MP3播放器主要对常用Windows音频格式的文件实现播放控制:播放歌曲、暂停播放、音量的控制、添加歌曲等功能。即使本次课程设计中可以实现播放、暂停以及音量等功能,但仍然存在着很多不足。例如歌曲播放列表,上一曲和下一曲,歌词的同步播放和播放模式的功能都没有得到实现。最大的感想就是能够学会知识重要但是能够用所学知识解决实际问题才是重中之重。作为编程人员,能编代码容易,但要灵活调试程序并编译通过才是难点。Vc的学习之路还很漫长,需要锻炼和学习的地方还很多但我会继续努力突破面临的种种困难。谢谢!