音乐播放器制作二(基本控件功能的实现)

VS2013 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);
}

实现这些功能后,基本上播放器就可以正常使用了。

整个工程文件下载地址

下一篇讲解附件功能,音乐播放器制作三(辅助功能的实现)

猜你喜欢

转载自blog.csdn.net/qq_34430371/article/details/105674332