C++音乐播放器:MCI库的使用

最近忙着做项目,好久没发文章了,好了,废话不多说

一、项目展示

在这里插入图片描述

这个音乐播放器的功能一目了然,还可以添加功能,有兴趣的高手研究研究

二、重点技术

整个程序主要实现了以下功能:
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

谢谢,点个关注

猜你喜欢

转载自blog.csdn.net/m0_47563648/article/details/125715659
今日推荐