音樂播放器製作二(基本控件功能的實現)

MFC做音樂播放器,需要使用到ActiveX控件(Windows Media Player),可以播放音視頻,支持歌單添加,刪除,保存操作,支持循環,順序,隨機播放

  還是放一張多媒體播放器的圖片。

在這裏插入圖片描述
  接下來具體介紹一下基本功能的實現:播放音樂、添加音樂、刪除音樂、保存音樂、歌單展示、歌單路徑、退出系統等功能。

在這裏插入圖片描述

  1. 播放音樂
      上一篇介紹了多媒體控件的添加,這次就來使用一下。
    知道文件路徑之後,調用函數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);
	}
}
  1. 刪除音樂
      只需要將歌單ListBox控件中選中的歌名去掉,然後再將路徑LixtBox去掉。
void CMusicPlayerDlg::OnBnClickedDelete()
{
	// TODO:  在此添加控件通知處理程序代碼
	m_songlist.DeleteString(m_songlist.GetCurSel());
	m_list1.DeleteString(m_list1.GetCurSel());
	m_control.stop();
}
  1. 保存音樂
      這裏涉及到存儲,筆者將歌曲信息保存到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();
}
  1. 歌單路徑
    歌曲路徑始終跟隨歌單光標。
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);
}
  1. 清空歌單
void CMusicPlayerDlg::OnBnClickedClear()
{
	// TODO:  在此添加控件通知處理程序代碼
	CStdioFile File;
	m_list1.ResetContent();
	m_songlist.ResetContent();
	File.Open(".\\MusicFileList.txt", CFile::modeCreate);
	m_control.stop();
}
  1. 播放形式
    利用定時器去處理播放形式的問題,是單曲/隨機/順序播放
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);
}
  1. 全屏展示
void CMusicPlayerDlg::OnBnClickedFullscreen()
{
	// TODO:  在此添加控件通知處理程序代碼
	m_player.put_fullScreen(TRUE);
}

  1. 退出系統
void CMusicPlayerDlg::OnBnClickedQuit()
{
	// TODO:  在此添加控件通知處理程序代碼
	CDialog::OnCancel();
	KillTimer(1);
	m_progress.SetPos(0);
}

實現這些功能後,基本上播放器就可以正常使用了。
下一篇講解附件功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章