这两天做了一个小型的音乐播放器,基本功能都已实现,同时也让我对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::iterator pmusic = myvec.end() ;
std::vector::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(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
UpdateData(true) ;
myint = myslider.GetPos() /10 ;
//myint = m_nSlider ;
setvolume(myslider.GetPos()) ;
UpdateData(false) ;
*pResult = 0;
}
编写程序时需要注意不同类型数据之间的转换方式,往空间面板添加控件,尽量使用自己改好的控件id,避免与系统默认的几个关键id重合。