VS2013 MFC做音乐播放器,需要使用到ActiveX控件(Windows Media Player),可以播放音视频,支持歌单添加,删除,保存操作,支持循环,顺序,随机播放。
老样子展示一下界面。
这篇讲解一下附件控件的添加与实现,主要是背景颜色、文字大小、图片的展示。
- 背景颜色的添加
说到背景颜色就涉及到绘图,会碰到函数: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;
}
- 文字大小的调整
涉及到字体对话框类,选中对应的字体,然后设置文字为选中的字体即可。
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();
}
}
- 图片的展示
这里使用专门的对话框来实现。涉及到图片控件。
思路和歌单的保存类似,都是把路径存放在.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控件)
音乐播放器制作二(基本控件功能的实现)