VS2013 MFC做音乐播放器,需要使用到ActiveX控件(Windows Media Player),可以播放音视频,支持歌单添加,删除,保存操作,支持循环,顺序,随机播放。
还是放一张多媒体播放器的图片。
接下来具体介绍一下基本功能的实现:播放音乐、添加音乐、删除音乐、保存音乐、歌单展示、歌单路径、退出系统等功能。
- 播放音乐:
上一篇介绍了多媒体控件的添加,这次就来使用一下。
知道文件路径之后,调用函数put_URL(文件路径),就可以播放音乐。
void CMusicPlayerDlg::OnBnClickedPlay()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
int index = m_songlist.GetCurSel();
m_list1.GetText(index, str);
m_player.put_URL(str);
}
当然这个是播放音乐控件的实现,如果要实现点击歌名就播放的功能,需要在歌名控件添加函数:光标发生变化触发函数,在函数里播放选中的音乐。
歌单和歌名路径存放在ListBox控件中。由于歌单只显示歌名,所以需要把歌单和歌单路径做一个匹配,获取歌单序号之后,再转换到歌路径当中,然后再播放音乐。
void CMusicPlayerDlg::OnLbnSelchangeSonglist()
{
// TODO: 在此添加控件通知处理程序代码
CString TempText;
iCount = m_songlist.GetCurSel();
m_songlist.GetText(iCount,TempText); //歌单控件
m_list1.SetCurSel(iCount); //歌名路径控件
int i;
for (i = 0; i < m_list1.GetCount();i++)
{
m_list1.GetText(i, m_SongName);
if (m_SongName.Find(TempText) != -1)
{
iCount = i;
m_list1.SetCurSel(iCount);
break;
}
}
if (i == m_list1.GetCount())
{
m_list1.GetText(0, m_SongName);
}
m_player.put_URL(m_SongName); //播放音乐
m_media = m_player.newMedia(m_SongName);
m_progress.SetRange(0, (int)m_media.get_duration()); //媒体总长度
Gross = (int)m_media.get_duration();
m_progress.SetPos(0);
SetTimer(1, 1000, NULL);
}
2. 添加音乐:
需要用到文件对话框,获取文件路径之后,需要去掉前面路径,只留下歌名和后缀。(为了展示)
void CMusicPlayerDlg::OnBnClickedOpen()
{
// TODO: 在此添加控件通知处理程序代码
char szFiileFilter[] = "MP3文件(*.mp3)|*.mp3|WMA文件(*.wma)|*.wma|WAV文件(*.wav)|*.wav|所有文件(*.*)|*.*||";
//文件对话框
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_NOCHANGEDIR, szFiileFilter);
POSITION pos = dlg.GetStartPosition();
if (dlg.DoModal() == IDOK)
{
while (pos != NULL)
m_PathName = dlg.GetNextPathName(pos);
char Song[200];
strncpy_s(Song, (LPCTSTR)m_PathName, sizeof(Song));
char delims1[] ="\\";
char *result1 = NULL;
CString SongList;
CString buf = Song;
int Str_Start = 0;
int Str_Stop = 0;
for (int i = sizeof(Song); i > 0; i--) //去掉前面路径信息
{
if (Song[i] == '.')
Str_Stop = i;
if ((i < Str_Stop) && (Song[i] == '\\'))
{
Str_Start = i;
break;
}
}
SongList = buf.Mid(Str_Start + 1, (Str_Stop - Str_Start + 4));
m_songlist.AddString(SongList);
m_list1.AddString(m_PathName);
}
}
- 删除音乐:
只需要将歌单ListBox控件中选中的歌名去掉,然后再将路径LixtBox去掉。
void CMusicPlayerDlg::OnBnClickedDelete()
{
// TODO: 在此添加控件通知处理程序代码
m_songlist.DeleteString(m_songlist.GetCurSel());
m_list1.DeleteString(m_list1.GetCurSel());
m_control.stop();
}
- 保存音乐:
这里涉及到存储,笔者将歌曲信息保存到txt文件中,所以在初始化的时候,需要初始化文件txt,如果是初始化完成,则需要将歌单读出来。
//初始化程序
m_control = m_player.get_controls();
m_setting = m_player.get_settings();
m_fntColor = GetSysColor(COLOR_MENUTEXT);//获取当前窗口字体颜色
CStdioFile *fsp = new CStdioFile(".\\MusicFileList.txt", CFile::modeRead);
m_list1.SetHorizontalExtent(1000); //设置歌单容量
m_songlist.SetHorizontalExtent(1000); //设置歌名路径控件容量
CString str;
int i = 0;
while (fsp->ReadString(str))
{
//***********************
char Song[200];
strncpy_s(Song, (LPCTSTR)str, sizeof(Song));
char delims1[] = "\\";
char *result1 = NULL;
CString SongList;
CString buf = Song;
int Str_Start = 0;
int Str_Stop = 0;
for (int i = sizeof(Song); i > 0; i--)
{
if (Song[i] == '.')
Str_Stop = i;
if ((i < Str_Stop) && (Song[i] == '\\'))
{
Str_Start = i;
break;
}
}
SongList = buf.Mid(Str_Start+1, (Str_Stop - Str_Start+4));
m_songlist.AddString(SongList);
m_list1.AddString(str);
}
fsp->Close();
delete fsp;
m_list1.SetCurSel(0);
m_songlist.SetCurSel(0);
m_list1.GetText(m_list1.GetCurSel(), m_PathName);
((CButton*)GetDlgItem(IDC_RADIO3))->SetCheck(true);
保存歌单则需要打开文件,将歌曲信息保存到文件中。
void CMusicPlayerDlg::OnBnClickedSave()
{
// TODO: 在此添加控件通知处理程序代码
CStdioFile file;
file.Open(".\\MusicFileList.txt", CFile::modeCreate | CFile::modeReadWrite | CFile::typeText);
for (int i = 0; i < m_list1.GetCount(); i++)
{
CString strtemp;
m_list1.GetText(i, strtemp);
strtemp += "\n";
file.WriteString(strtemp);
}
file.Close();
}
- 歌单路径:
歌曲路径始终跟随歌单光标。
void CMusicPlayerDlg::OnLbnSelchangeList1()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
int index;// = m_list1.GetCurSel();
index = iCount;
m_list1.SetCurSel(index);
m_list1.GetText(index, str);
m_player.put_URL(str);
}
- 清空歌单:
void CMusicPlayerDlg::OnBnClickedClear()
{
// TODO: 在此添加控件通知处理程序代码
CStdioFile File;
m_list1.ResetContent();
m_songlist.ResetContent();
File.Open(".\\MusicFileList.txt", CFile::modeCreate);
m_control.stop();
}
- 播放形式:
利用定时器去处理播放形式的问题,是单曲/随机/顺序播放。
void CMusicPlayerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int index = m_player.get_playState();
if (index ==1)
{
//顺序播放
if (((CButton*)GetDlgItem(IDC_RADIO3))->GetCheck())
{
CString str;
int index = m_songlist.GetCurSel() + 1;
if (index >= m_songlist.GetCount())
index = 0;
m_list1.GetText(index, str);
m_player.put_URL(str);
m_songlist.SetCurSel(index);
m_list1.SetCurSel(index);
m_progress.SetPos(0);
}
//随机播放
if (((CButton*)GetDlgItem(IDC_RADIO2))->GetCheck())
{
srand(time(NULL));
m_songlist.SetCurSel(rand() % m_songlist.GetCount());
m_list1.GetText(m_songlist.GetCurSel(), m_PathName);
m_player.put_URL(m_PathName);
m_songlist.SetCurSel(m_songlist.GetCurSel());
m_list1.SetCurSel(m_songlist.GetCurSel());
m_progress.SetPos(0);
}
//单曲循环
if (((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck())
{
CString str;
int index = m_songlist.GetCurSel();
m_list1.GetText(index, str);
m_player.put_URL(str);
m_songlist.SetCurSel(index);
m_list1.SetCurSel(index);
m_progress.SetPos(0);
}
}
int TimePoint = m_progress.GetPos()+1;
m_progress.SetPos(TimePoint);
double Percent = ((double)TimePoint / (double)Gross) * 100;
char PercentNum[4];
PercentNum[0] = (int)Percent / 10 + '0';
PercentNum[1] = (int)Percent % 10 + '0';
PercentNum[2] = '%';
PercentNum[3] = '\n';
CString str = PercentNum;
//CString str1 = "nihao";
SetDlgItemText(IDC_ShowNum, str);
CDialogEx::OnTimer(nIDEvent);
}
- 全屏展示
void CMusicPlayerDlg::OnBnClickedFullscreen()
{
// TODO: 在此添加控件通知处理程序代码
m_player.put_fullScreen(TRUE);
}
- 退出系统:
void CMusicPlayerDlg::OnBnClickedQuit()
{
// TODO: 在此添加控件通知处理程序代码
CDialog::OnCancel();
KillTimer(1);
m_progress.SetPos(0);
}
实现这些功能后,基本上播放器就可以正常使用了。
下一篇讲解附件功能,音乐播放器制作三(辅助功能的实现)