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
#include
#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);
}