最近忙着做项目,好久没发文章了,好了,废话不多说
一、项目展示
这个音乐播放器的功能一目了然,还可以添加功能,有兴趣的高手研究研究
二、重点技术
整个程序主要实现了以下功能:
1)音量、播放进度控制
2)窗口置顶
3)基本的播放、暂停功能
1.播放暂停
首先要打开一个文件选择对话框,然后获取音乐文件路径,借助mciSendCommand()函数播放
先在MSDN看看MCI_PLAY_PARMS结构,用于播放音乐
typedef struct {
DWORD_PTR dwCallback;
DWORD dwFrom;
DWORD dwTo;
} MCI_PLAY_PARMS;
dwCallback:低序单词指定用于MCI_NOTIFY标志的窗口句柄。
dwFrom:要从中播放的位置。
dwTo:要播放的位置。
几个MCI命令
MCI_PAUSE 暂停
MCI_RESUME 继续播放
MCI_PLAY 播放
MCI_OPEN 打开
MCI_STATUS 获取当前时长
MCI_STOP 停止
MCI_CLOSE 关闭
这些命令需要用mciSendCommand()函数
mciSendCommand函数向指定的 MCI 设备发送命令消息。
MCIERROR mciSendCommand(
MCIDEVICEID IDDevice,
UINT uMsg,
DWORD_PTR fdwCommand,
DWORD_PTR dwParam
);
IDDevice :要接收命令消息的 MCI 设备的设备标识符。此参数不与MCI_OPEN命令消息一起使用。
uMsg :命令消息。有关列表,请参阅多媒体命令。
fdwCommand:命令消息的标志。
dwParam :指向包含命令消息参数的结构的指针。
上代码
//打开
void CMusicPlayerDlg::OnBnClickedBtnChoose()
{
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"MP3文件(*.mp3)|*.mp3|WMA文件(*.wma)|*.wma|WAV文件(*.wav)|*.wav|所有文件(*.*)|*.*||");
if (IDCANCEL == dlg.DoModal())
{
return;
}
//获取路径
CString strMusicFile = dlg.GetPathName();
SetDlgItemText(IDC_EDIT_NAME, strMusicFile);
//打开
MCI_OPEN_PARMS mciOpenParms;
mciOpenParms.lpstrElementName = strMusicFile;
MCIERROR mcierror = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, (DWORD)&mciOpenParms);
if (mcierror)
{
wchar_t szErrorMsg[256];
//获取错误信息
mciGetErrorString(mcierror, szErrorMsg, 256);
MessageBox(szErrorMsg, L"音乐播放器");
return;
}
StopMusic();//清除 循环播放
m_DeviceID = mciOpenParms.wDeviceID;
//调用函数自动播放
OnBnClickedBtnPlay();
}
//播放
void CMusicPlayerDlg::OnBnClickedBtnPlay()
{
MCI_PLAY_PARMS mciPlayParms;
mciPlayParms.dwCallback = NULL;
mciPlayParms.dwFrom = 0;
mciSendCommand(m_DeviceID, MCI_PLAY, MCI_FROM | MCI_NOTIFY, (DWORD)&mciPlayParms);
GetDlgItem(IDC_BTN_PAUSE)->EnableWindow(TRUE);
GetDlgItem(IDC_SLIDER_MUSIC)->EnableWindow(TRUE);
GetDlgItem(IDC_SLIDER_VOLUME)->EnableWindow(TRUE);
//获取总长度
CString strLength;
MCI_STATUS_PARMS mciStatusParms;
mciStatusParms.dwItem = MCI_STATUS_LENGTH;
mciSendCommand(m_DeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&mciStatusParms);
int m_dLength = mciStatusParms.dwReturn;
int minute = 0;//分
int second = m_dLength / 1000;//秒
if (second >= 60)
{
minute = second / 60;
second = second - (60 * minute);
strLength.Format(L"%d:%d", minute, second);
}
m_Silder.SetRange(0, m_dLength);
SetDlgItemText(IDC_EDIT_END, strLength);
SetTimer(1, 200, NULL);//计时器
}
//暂停
void CMusicPlayerDlg::OnBnClickedBtnCause()
{
CString str;
GetDlgItemText(IDC_BTN_PAUSE, str);
if (str == L"暂停")
{
mciSendCommand(m_DeviceID, MCI_PAUSE, 0, 0);
SetDlgItemText(IDC_BTN_PAUSE, L"继续");
}
else if (str == L"继续")
{
mciSendCommand(m_DeviceID, MCI_RESUME, 0, 0);
SetDlgItemText(IDC_BTN_PAUSE, L"暂停");
}
}
这里分成了三个函数,后面方便调用,还设置了个计时器,主要是后面的播放时长功能
2.窗口置顶
不多说,上代码
//置顶
void CMusicPlayerDlg::OnBnTopWin()
{
//CButton* pBtn = (CButton*)GetDlgItem(IDC_CHECK1);
//int state = pBtn->GetCheck();
int state= m_TopWin.GetCheck();
if (state == 1)
{
::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
}
else
{
::SetWindowPos(m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
}
3.音量播放进度
简单的MFC 操作
//计时器
void CMusicPlayerDlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case 1:
CString str;
MCI_STATUS_PARMS mciStatusParms;
mciStatusParms.dwItem = MCI_STATUS_POSITION;
mciSendCommand(m_DeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&mciStatusParms);
int m_dPosition = mciStatusParms.dwReturn;
int minute = 0;//分
int second = m_dPosition / 1000;//秒
str.Format(L"%d:%d", minute, second);
if (second >= 60)
{
minute = second / 60;
second = second - (60 * minute);
str.Format(L"%d:%d", minute, second);
}
m_Silder.SetPos(m_dPosition);
SetDlgItemText(IDC_EDIT_START, str);
break;
}
CDialogEx::OnTimer(nIDEvent);
}
//进度条
void CMusicPlayerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int nId = pScrollBar->GetDlgCtrlID();
int nPostion;
int nVolume;
if (nId == IDC_SLIDER_MUSIC)
{
nPostion = m_Silder.GetPos();
MCI_PLAY_PARMS mciPlayParms;
mciPlayParms.dwFrom = nPostion;
mciSendCommand(m_DeviceID, MCI_PLAY, MCI_FROM, (DWORD)&mciPlayParms);
}
else if (nId == IDC_SLIDER_VOLUME)
{
nVolume = m_Volume.GetPos();
MCI_DGV_SETAUDIO_PARMS mciSetVolume;
mciSetVolume.dwItem = MCI_DGV_SETAUDIO_VOLUME;
mciSetVolume.dwValue = nVolume;
mciSendCommand(m_DeviceID, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD)&mciSetVolume);
}
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
好了,分享一个完整项目链接
https://fow.lanzouw.com/iHmEE07oga9c
密码:96vp
谢谢,点个关注