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控件)
音樂播放器製作二(基本控件功能的實現)