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);
}
實現這些功能後,基本上播放器就可以正常使用了。
下一篇講解附件功能。