MusicBox(音乐播放器)

      这两天做了一个小型的音乐播放器,基本功能都已实现,同时也让我对CSliderCtrl,MCI_OPEN_PARMS以及控件之间的消息映射,数据转换等有了更深入的理解,下面是自己编程的详细过程:

1  首先将控件的位置都摆好:


2  在浏览控件所对应的函数中,打开本地文件,选取相应的音乐文件。

void CMusic_BoxDlg::OnBnClickedBtnOpenFile()//路径
{
	// TODO: 在此添加控件通知处理程序代码、
	CString strFilter = TEXT("");
	strFilter = strFilter + TEXT("mp3文件(*.mp3)|*.mp3|") +
		TEXT("wma文件(*.wma)|*.wma|") + 
		TEXT("wav文件(*.wav)|*.wav|") + 
		TEXT("所有文件(*.*)|*.*|");

	CFileDialog dlg(true, NULL, NULL, OFN_HIDEREADONLY, strFilter);//打开模态对话框
	CString pathtemp ;
	if(dlg.DoModal() == IDOK)//成功
	{
		CString filepath = dlg.GetPathName();
		CString filename = dlg.GetFileName();
		pathtemp = filepath ;
		SetDlgItemText(IDC_COMBO1,filename);		

		//FileLoad(this->m_hWnd,filepath);	

		//文件读取成功时所有按钮变成可选
		GetDlgItem(IDC_BUTTON3)->EnableWindow(true);
		GetDlgItem(IDC_BUTTON1)->EnableWindow(true);
		GetDlgItem(IDC_BUTTON2)->EnableWindow(true);
	}

	//组合框
	TCHAR ws[256] ;
	CComboBox* pfix = (CComboBox*)GetDlgItem(IDC_COMBO1) ;
	pfix->GetWindowText(ws,256);
	TCHAR strCBText[256];
	int i ;
	for(i=0;i<20;i++)
	{
		pfix->GetLBText( i, strCBText);
		if(_tcscmp(ws,strCBText) == 0 )
		{
			alreadyadd = 1 ;
			return ;
		}
	}
	pfix->AddString(ws) ;
	myvec.push_back(pathtemp) ;
	
}
代码中涉及到组合框的内容,目的是让组合框下拉的内容不会出现重复的信息,同时将每个歌曲文件的路径保存在vector容器之中,方便之后选择音乐名称时,直接获得歌曲路径从而使得音乐正常播放。

3 点击播放按钮,让音乐开始播放

void CMusic_BoxDlg::OnBnClickedButton3()//音乐播放按钮
{
	// TODO: 在此添加控件通知处理程序代码
	CString ws ;
	CComboBox* pfix = (CComboBox*)GetDlgItem(IDC_COMBO1) ;

	std::vector<CString>::iterator pmusic = myvec.end() ;
	std::vector<CString>::iterator pmusic2 = myvec.begin() ;

	int num ;
	num = -1 ;
	num = pfix->GetCurSel();
	if(num<0)//判断有无在下拉列表中选中某一栏
	{
		if(alreadyadd == 1)//判断歌曲是否已经添加
		{
			
			pfix->GetWindowText(ws);
			CString temper ;
			int i ;
			for(i=0;i<20;i++)
			{
				pfix->GetLBText( i, temper);
				if(_tcscmp(ws,temper) == 0 )//找到已添加歌曲的具体位置
				{
					
					CString road = *(pmusic2 + i) ;
					FileLoad(m_hWnd,road);
					alreadyadd = 0 ;
					musicplay();
					return ;
				}
			}

		}
		else
		{			
			CString road = *(pmusic - 1) ;
			FileLoad(m_hWnd,road);
		}
		
	}
	else
	{
		CString strCBText;
		pfix->GetLBText( num, strCBText);
		pfix->GetWindowText(ws);
		if(strCBText == ws)//判断此时添加歌名是否和当前选中歌名一致
		{
			CString road = *(pmusic2 + num) ;
			FileLoad(m_hWnd,road);
		}
		else
		{
			if(alreadyadd == 1)//判断歌曲是否已经添加
			{
				CString temper ;
				int i ;
				for(i=0;i<20;i++)
				{
					pfix->GetLBText( i, temper);
					if(_tcscmp(ws,temper) == 0 )//找到已添加歌曲的具体位置
					{
						CString road = *(pmusic2 + i) ;
						FileLoad(m_hWnd,road);
						alreadyadd = 0 ;
						musicplay();
						return ;
					}
				}
				
			}
			else
			{		
				CString road = *(pmusic - 1) ;
				FileLoad(m_hWnd,road);
			}
			
		}
		
	}
	
	musicplay();	

}
在这里花了较多的代码去实现获取组合框中对应歌曲的路径的功能,这里的组合框下拉内容,可以说就是一个缩小版的歌曲清单。

4 按暂停按钮,让音乐暂停播放,同时使控件名称变为恢复,按下之后可以让音乐继续播放,倘若一开始打开音乐文件失败,控件面板上的播放,暂停,停止按钮是无效的。

void CMusic_BoxDlg::OnBnClickedButton1()//音乐暂停按钮
{
	// TODO: 在此添加控件通知处理程序代码
	CString mystate ;
	CString cs ;
	GetDlgItemText(IDC_BUTTON1,mystate) ;//获取按钮指示
	CString str1 = TEXT("暂停");
	CString str2 = TEXT("恢复");
	if(mystate == str1 )
	{
		mypause() ;
		SetDlgItemText(IDC_BUTTON1,str2) ;
	}
	else if(mystate == str2)
	{
		myresume() ;
		SetDlgItemText(IDC_BUTTON1,str1) ;
	}
}

5 停止播放音乐

void mystop()//请求设备停止播放,所有信息清除
{
	mciSendCommand(DeviceId,MCI_STOP,0,0) ;
	mciSendCommand(DeviceId,MCI_CLOSE,0,0) ;
}


void CMusic_BoxDlg::OnBnClickedButton2()//音乐停止播放
{
	// TODO: 在此添加控件通知处理程序代码
	mystop() ;
	GetDlgItem(IDC_BUTTON3)->EnableWindow(false) ;//播放和暂停不可选
	GetDlgItem(IDC_BUTTON1)->EnableWindow(false) ;
}
6 控制音乐音量,这里需要用到slider control控件,在类中定义CSliderCtrl变量,在oninit函数中设置滑动条的移动范围,同时设置滑动条的指针处置位值得值,代表初试音量的大小,在Exchang涵数中将变量与其关联的控件交换数据,将声音具体的大小值以整数的形式输入到编辑框中显示出来

void CMusic_BoxDlg::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	
	UpdateData(true) ;
	myint = myslider.GetPos() /10 ;
	//myint = m_nSlider ;
	setvolume(myslider.GetPos()) ;
	UpdateData(false) ;

	*pResult = 0;
}

下面是程序运行后的图片:

编写程序时需要注意不同类型数据之间的转换方式,往空间面板添加控件,尽量使用自己改好的控件id,避免与系统默认的几个关键id重合。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值