音乐播放器制作三(辅助功能的实现)

VS2013 MFC做音乐播放器,需要使用到ActiveX控件(Windows Media Player),可以播放音视频,支持歌单添加,删除,保存操作,支持循环,顺序,随机播放

  老样子展示一下界面。

在这里插入图片描述
  这篇讲解一下附件控件的添加与实现,主要是背景颜色、文字大小、图片的展示。

  1. 背景颜色的添加

  说到背景颜色就涉及到绘图,会碰到函数:Invalidate(),作用就是无效整个界面,使得重新绘制界面。

  重新绘制界面,有专用的消息函数:WM_CTLCOLOR,在这个消息函数里绘制背景颜色即可。

  还涉及到颜色对话框类,获取选中的颜色。

void CMusicPlayerDlg::OnBnClickedSelectcolor()
{
	// TODO:  在此添加控件通知处理程序代码
	//首先把颜色对话框初始值为红色
	//COLORREF color = RGB(255,0,0);
	//构造颜色对话框
	CColorDialog ColorDlg(m_color, CC_FULLOPEN);
	memset(&m_color, 0, sizeof(COLORREF));
	if (IDOK == ColorDlg.DoModal())
	{
		m_color = ColorDlg.GetColor();
		m_bkBrush.CreateSolidBrush(m_color);
		Invalidate();
		iNnumber = 1;
	}
}
HBRUSH CMusicPlayerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	
	if (iNnumber==1)
	{
		HBRUSH hbr_bk = (HBRUSH)m_bkBrush;
		pDC->SetBkMode(TRANSPARENT);
		iNnumber = 0;
		return hbr_bk;
	}
	pDC->SetTextColor(m_fntColor);
	return hbr;
}

在这里插入图片描述

  1. 文字大小的调整

  涉及到字体对话框类,选中对应的字体,然后设置文字为选中的字体即可。

void CMusicPlayerDlg::OnBnClickedSelectfront()
{
	// TODO:  在此添加控件通知处理程序代码
	CString strFontName;
	LOGFONT lf;
	memset(&lf, 0,sizeof(LOGFONT));                     //将lf字节清除
	_tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("宋体"));  //将lf字体设置为宋体;
	CFontDialog FontDlg(&lf);                           //创建一个字体对话框的对象;
	FontDlg.m_cf.rgbColors = m_fntColor;
	if (FontDlg.DoModal() == IDOK)
	{
		//MessageBox("进入字体单元设置", "消息", MB_OKCANCEL|MB_ICONINFORMATION);
		if (m_font.m_hObject)
		{
			m_font.DeleteObject();
		}
		//用户创建新的字体
		m_font.CreateFontIndirectA(FontDlg.m_cf.lpLogFont);
		m_fntColor = FontDlg.GetColor();
		//获得编辑框的ID;
		GetDlgItem(IDC_LIST1)->SetFont(&m_font);
		GetDlgItem(IDC_SongList)->SetFont(&m_font);
		GetDlgItem(IDC_ShowNum)->SetFont(&m_font);
		//点击ok;选择字体;
		strFontName = FontDlg.m_cf.lpLogFont->lfFaceName;
		//Invalidate();
	}

}
  1. 图片的展示
    这里使用专门的对话框来实现。涉及到图片控件

在这里插入图片描述

思路和歌单的保存类似,都是把路径存放在.txt文件里面。

a. 保存图片

//这里如果没有txt文件,则创建txt文件
void LoadPictureDlg::OnBnClickedSavepicture()
{
	// TODO:  在此添加控件通知处理程序代码
	CStdioFile FileSave;
	FileSave.Open(".\\Picture.txt", CFile::modeCreate | CFile::modeReadWrite | CFile::typeText);         
	for (int i = 0; i < m_PictureList.GetCount(); i++)
	{
		CString strtemp;
		m_PictureList.GetText(i, strtemp);
		strtemp += "\n";
		FileSave.WriteString(strtemp);
	}
}

b. 读取图片

void LoadPictureDlg::OnBnClickedGetpicture()
{
	// TODO:  在此添加控件通知处理程序代码
	CStdioFile *FilePicture = new CStdioFile(".\\Picture.txt", CFile::modeRead);
	m_PictureList.SetHorizontalExtent(1000);
	CString StringName;
	while (FilePicture->ReadString(StringName))
	{
		m_PictureList.AddString(StringName);
	}
	FilePicture->Close();
	delete FilePicture;
	m_PictureList.SetCurSel(0);
}

c. 选择BMP图片

void LoadPictureDlg::OnBnClickedSelectbmp()
{
	// TODO:  在此添加控件通知处理程序代码
	CString filter;
	filter = "四有文件(*.bmp,*.jpg,*.gif,*tiff)|*.bmp;*.jpg;*.gif;*.tiff| BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff|所有文件(*.*)|*.*||";
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filter, NULL);

	//按下确定按钮 dlg.DoModal() 函数显示对话框  
	if (dlg.DoModal() == IDOK)
	{
		//打开对话框获取图像信息  
		CString BmpName = dlg.GetPathName();  //获取文件路径名   如D:\pic\abc.bmp  
		CString EntName = dlg.GetFileExt();      //获取文件扩展名  
		EntName.MakeLower();                     //将文件扩展名转换为一个小写字符  
		m_PictureList.AddString(BmpName);

		if (EntName.Compare(_T("bmp")) == 0)
		{
			//定义变量存储图片信息  
			BITMAPINFO *pBmpInfo;       //记录图像细节  
			BYTE *pBmpData;             //图像数据  
			BITMAPFILEHEADER bmpHeader; //文件头  
			BITMAPINFOHEADER bmpInfo;   //信息头  
			CFile bmpFile;              //记录打开文件  
			//以只读的方式打开文件 读取bmp图片各部分 bmp文件头 信息 数据  
			if (!bmpFile.Open(BmpName, CFile::modeRead | CFile::typeBinary))
				return;
			if (bmpFile.Read(&bmpHeader, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
				return;
			if (bmpFile.Read(&bmpInfo, sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
				return;
			pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
			//为图像数据申请空间  
			memcpy(pBmpInfo, &bmpInfo, sizeof(BITMAPINFOHEADER));
			DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;
			pBmpData = (BYTE*)new char[dataBytes];
			bmpFile.Read(pBmpData, dataBytes);
			bmpFile.Close();
			//显示图像  
			CWnd *pWnd = GetDlgItem(IDC_Loadbmp); //获得pictrue控件窗口的句柄  
			CRect rect;
			pWnd->GetClientRect(&rect); //获得pictrue控件所在的矩形区域  
			CDC *pDC = pWnd->GetDC(); //获得pictrue控件的DC  
			pDC->SetStretchBltMode(COLORONCOLOR);
			StretchDIBits(pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0,
			bmpInfo.biWidth, bmpInfo.biHeight, pBmpData, pBmpInfo, DIB_RGB_COLORS, SRCCOPY);
		}
	}
}

d. 选择jpg图片

void LoadPictureDlg::OnBnClickedSelectjpg()
{
	// TODO:  在此添加控件通知处理程序代码
	CFileDialog Filejpg(TRUE,_T(".jpg"),NULL,OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,_T("文件(*.jpg)|*.jpg|所有文件(*.*)|*.*||"),this);
	if (Filejpg.DoModal() == IDOK)
	{
		m_JpgPathName = Filejpg.GetPathName();
		m_PictureList.AddString(m_JpgPathName);
		UpdateData(FALSE);
		ShowPicture();
	}
}

//获取图片路径之后,图片大小和图片控件大小可能不匹配,需要缩放处理。

void LoadPictureDlg::ShowPicture()
{
	if (m_JpgPathName == "")
	{
		return;
	}
	CRect rect;
	CRect rectImage;
	CImage image;
	image.Load(m_JpgPathName);
	int cx = image.GetWidth();
	int cy = image.GetHeight();
	m_PictureControl.GetClientRect(&rect);
	CDC *pDC = m_PictureControl.GetDC();
	SetStretchBltMode(pDC->m_hDC, STRETCH_HALFTONE);
	if ((cx < rect.Width()) ||( cy < rect.Height()))
	{
		rectImage = CRect(rect.TopLeft(), CSize(cx, cy));
		image.StretchBlt(pDC->m_hDC, rectImage, SRCCOPY);
	}
	else
	{
		float xScale = (float)rect.Width() / (float)cx;
		float yScale = (float)rect.Height() / (float)cy;
		float ScaleIndex = (xScale >= yScale,xScale, yScale);
		rectImage = CRect(rect.TopLeft(), CSize((int)cx*ScaleIndex, (int)cy*ScaleIndex));
		image.StretchBlt(pDC->m_hDC, rect, SRCCOPY); //将图片画到Picture控件表示的矩形区域
	}

}

e. 删除图片

void LoadPictureDlg::OnBnClickedDeletepicture()
{
	// TODO:  在此添加控件通知处理程序代码
	int index = m_PictureList.GetCurSel();
	CString str;
	m_PictureList.GetText(index, str);
	m_PictureList.DeleteString(index);
}

f. 清空列表

void LoadPictureDlg::OnBnClickedClerapicture()
{
	// TODO:  在此添加控件通知处理程序代码
	CStdioFile File;
	m_PictureList.ResetContent();
	File.Open(".\\Picture.txt", CFile::modeCreate);
}

g. 确认/取消

void LoadPictureDlg::OnBnClickedOncancel2()
{
	// TODO:  在此添加控件通知处理程序代码
	OnCancel();
}


void LoadPictureDlg::OnBnClickedOnok()
{
	// TODO:  在此添加控件通知处理程序代码
	OnOK();
}

整个工程文件下载地址
音乐播放器制作一(Windows Media Player控件)
音乐播放器制作二(基本控件功能的实现)

猜你喜欢

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