1. 程式人生 > >mfc中通過觸發List Box 控制元件來顯示圖片

mfc中通過觸發List Box 控制元件來顯示圖片

幫小學弟寫的一個mfc的小程式,比較簡單。

1.觸發List Bo控制元件的左鍵單擊事件

void Ctest_pictureDlg::OnLbnDblclkList1()
{
	// TODO:  在此新增控制元件通知處理程式程式碼

	int nIndex = m_listBox.GetCurSel();

	CString BmpName;

	CString PicInfo;
		
	switch (nIndex)
	{
	case 0:
		BmpName = "0.bmp";
		PicInfo = "第0石英";
		break;
	case 1:
		BmpName = "1.bmp";
		PicInfo = "第1石英";
		break;
	case 2:
		BmpName = "2.bmp";
		PicInfo = "第2石英";
		break;
	case 3:
		BmpName = "3.bmp";
		PicInfo = "第3石英";
		break;
	case 4:
		BmpName = "4.bmp";
		PicInfo = "第4石英";
		break;
	case 5:
		BmpName = "5.bmp";
		PicInfo = "第5石英";
		break;
	default:
		break;
	}

	ShowPicture(BmpName);

	ShowPictureInfo(PicInfo);
}

2.讀取圖片的方法比較特別,可以適應static控制元件的大小。
void Ctest_pictureDlg::ShowPicture(CString BmpName)
{
	//定義變數儲存圖片資訊  
	BITMAPINFO *pBmpInfo;       //記錄影象細節  
	BYTE *pBmpData;             //影象資料  
	BITMAPFILEHEADER bmpHeader; //檔案頭  
	BITMAPINFOHEADER bmpInfo;   //資訊頭  
	CFile bmpFile;              //記錄開啟檔案  

	//以只讀的方式開啟檔案 讀取bmp圖片各部分 bmp檔案頭 資訊 資料  
	if (!bmpFile.Open(BmpName, CFile::modeRead | CFile::typeBinary))
	{
		MessageBox( _T("Picture not found!") , _T("Error") ,NULL );
		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_STATIC_Pic); //獲得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);
}

3.字型控制程式碼
void Ctest_pictureDlg::OnLbnDblclkListFont()
{
	// TODO:  在此新增控制元件通知處理程式程式碼

	int nIndex = m_fontList.GetCurSel();

	CString FontType;

	switch (nIndex)
	{
	case 0:
		FontType = _T("Arial");
			break;
	case 1:
		FontType = _T("黑體");
			break;
	case 2:
		FontType = _T("宋體");
		break;
	case 3:
		FontType = _T("微軟雅黑");
		break;
	case 4:
		FontType = _T("仿宋");
		break;
	case 5:
		FontType = _T("楷體");
		break;
	default:
		break;
	}

	MySetFont(FontType);
}

void Ctest_pictureDlg::MySetFont(CString FontType)
{
	CFont * f;
	f = new CFont;
	f->CreateFont(16, // nHeight 
		0, // nWidth 
		0, // nEscapement 
		0, // nOrientation 
		FW_BOLD, // nWeight 
		FALSE, // bItalic 
		FALSE, // bUnderline 
		0, // cStrikeOut 
		DEFAULT_CHARSET,//CHINESEBIG5_CHARSET,//ANSI_CHARSET, // nCharSet 
		OUT_DEFAULT_PRECIS, // nOutPrecision 
		CLIP_DEFAULT_PRECIS, // nClipPrecision 
		DEFAULT_QUALITY, // nQuality 
		DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
		FontType.GetBuffer(FontType.GetLength() )); // lpszFac 

	GetDlgItem(IDC_STATIC_PICINFO)->SetFont(f);

	m_listBox.SetFont(f);
	m_fontList.SetFont(f);

}

static控制元件參考: