音樂播放器製作三(輔助功能的實現)

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

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