MFC入门-MCI简单音乐播放器实现
1) 播放
2) 暂停/恢复
3) 停止
4) 音量调节
打开VS2010,新建-》文件-》新建项目:
点击确认之后:
点击下一步:
选择“基于对话框”,点击“下一步”:
点击“下一步”:
点击“下一步”:
默认选项,点击“完成”
默认生成的界面。
界面制作如下:
音乐播放界面
这里说明每个控件对应的Id:
文件名称后面的编辑框:IDC_filename
浏览按钮:IDC_filechoice
播放按钮:IDC_play
暂停按钮:IDC_pause
停止按钮:IDC_stop
音量调节里面的编辑框:IDC_volume
音量滑动条:IDC_SLIDER1
版本说明按钮:IDC_about
退出软件按钮:IDC_exitbtn
软件说明界面:
void Cmfc_music_playerDlg::OnBnClickedabout() { // TODO: 在此添加控件通知处理程序代码 CAboutDlg dlg; dlg.DoModal(); //弹出软件说明 }
void Cmfc_music_playerDlg::OnBnClickedexitbt() { // TODO: 在此添加控件通知处理程序代码 CDialog::OnCancel(); //退出 }
添加头文件和库:
#include <MMSystem.h> #include <Digitalv.h> #pragma comment(lib, "Winmm.lib")
//定义三个全局变量 HWND m_hWnd; DWORD DeviceId; MCI_OPEN_PARMS mciopenparms; //加载 void Load(HWND hWnd, CString strFilepath) { m_hWnd = hWnd; mciSendCommand(DeviceId, MCI_CLOSE, 0, 0); //在加载文件前先清空上一次播放的设备 mciopenparms.lpstrElementName = strFilepath; //将音乐文件路径传给设备 DWORD dwReturn; if (dwReturn = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, (DWORD)(LPVOID)&mciopenparms)) { //如果打开玩家失败,将出错信息储存在buffer,并显示出错警告 char buffer[256]; mciGetErrorString(dwReturn, buffer, 256); //获取错误码对应的错误信息 MessageBox(hWnd, buffer, "出错警告!", MB_ICONHAND | MB_ICONERROR | MB_ICONSTOP); //弹出错误信息提示对话框 } DeviceId = mciopenparms.wDeviceID; //打开文件成功就关联文件到设备 }
//播放 void play() { MCI_PLAY_PARMS mciplayparms; mciplayparms.dwCallback = (DWORD)m_hWnd; mciplayparms.dwFrom = 0; //每次播放都是从0开始播放 mciSendCommand(DeviceId, MCI_PLAY, MCI_FROM | MCI_NOTIFY, (DWORD)(LPVOID)&mciplayparms); }
void pause() { mciSendCommand(DeviceId, MCI_PAUSE, 0, 0); }
void resume() { mciSendCommand(DeviceId, MCI_RESUME, 0, 0); }
void stop() { mciSendCommand(DeviceId, MCI_STOP, 0, 0); mciSendCommand(DeviceId, MCI_CLOSE, 0, 0); //当点击停止按钮时,将所有的信息都清除掉 }
//设置音量 DWORD setVolume(DWORD vol) { MCI_DGV_SETAUDIO_PARMS setvolume; //设置音量的参数结构体 setvolume.dwCallback = NULL; // setvolume.dwItem = MCI_DGV_SETAUDIO_VOLUME; //动作是设置音量 setvolume.dwValue = vol; //音量值是vol mciSendCommand(DeviceId, MCI_SETAUDIO, MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)(LPVOID)&setvolume); return 0; }
void Cmfc_music_playerDlg::OnBnClickedfilechoice() { // TODO: 在此添加控件通知处理程序代码 char szFileFilter[] = "mp3文件(*.mp3)|*.mp3|" "wma文件(*.wma)|*.wma|" "wav文件(*.wav)|*.wav|" "所有文件(*.*)|*.*|"; CFileDialog dlg(true, NULL, NULL, OFN_HIDEREADONLY, szFileFilter); if (dlg.DoModal() == IDOK) { CString strFilepath = dlg.GetPathName(); CString strFilename = dlg.GetFileName(); SetDlgItemText(IDC_filename, strFilename); Load(this->m_hWnd, strFilepath); } GetDlgItem(IDC_play)->EnableWindow(true); //文件读取成功时所有按钮变成可选 GetDlgItem(IDC_pause)->EnableWindow(true); GetDlgItem(IDC_stop)->EnableWindow(true); }
void Cmfc_music_playerDlg::OnBnClickedplay() { // TODO: 在此添加控件通知处理程序代码 play(); SetDlgItemText(IDC_pause, "暂停"); }
void Cmfc_music_playerDlg::OnBnClickedpause() { // TODO: 在此添加控件通知处理程序代码 CString strTemp; GetDlgItemText(IDC_pause, strTemp); //获取按钮的状态 if (strTemp.Compare("暂停") == 0) { pause(); SetDlgItemText(IDC_pause, "恢复"); } if (strTemp.Compare("恢复") == 0) { resume(); SetDlgItemText(IDC_pause, "暂停"); } }
void Cmfc_music_playerDlg::OnBnClickedstop() { // TODO: 在此添加控件通知处理程序代码 stop(); SetDlgItemText(IDC_pause, "暂停"); GetDlgItem(IDC_play)->EnableWindow(false); //当按下stop的时候,播放和暂停不可选 GetDlgItem(IDC_pause)->EnableWindow(false); }