MFC在picture control中JPG/BMP/ICO等格式圖片顯示,並支援清除圖片顯示
1、新增一個picture control工具,修改ID為ID_STATIC_PICTURE
2、增加一個按鈕,caption為檢視圖片,雙擊按鈕生成按鈕的點選事件,在事件中新增程式碼,其中_T("Picture Files (*.bmp *.ico *.jpg)|*bmp;*.ico;*jpg|All Files (*.*)|*.*||")為顯示的型別,可以根據需要修改:
void CtestShowImageDlg::OnBnClickedButton1()
{
// TODO: 在此新增控制元件通知處理程式程式碼
// TODO: Add your control notification handler code here
#if 0
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"JPEG檔案(*.jpg)|*.jpg|GIF檔案(*.gif)|*.gif|bmp檔案(*.bmp)|*.bmp|",NULL);
#endif
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Picture Files (*.bmp *.ico *.jpg)|*bmp;*.ico;*jpg|All Files (*.*)|*.*||"), AfxGetMainWnd());
if(dlg.DoModal()==IDOK)
{
//SetDlgItemText(IDC_TXT_PATH,dlg.GetPathName());
//設定靜態控制元件的樣式,使其可以使用點陣圖,並使點陣圖顯示居中
((CStatic*)GetDlgItem(IDC_STATIC_PICTURE))-> ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
CDC *pDC=NULL;
pDC=GetDlgItem(IDC_STATIC_PICTURE)->GetDC();
//ShowJpgGif(pDC,dlg.GetPathName(),0,0);
ShowImage(pDC,dlg.GetPathName(),0,0);
ReleaseDC(pDC); // 記得釋放資源,不然會導致記憶體洩露
}
}
//************************************
// 方法說明: 顯示JPG和GIF、BMP圖片
// 引數說明: CDC * pDC 裝置環境物件
// 引數說明: CString strPath 要顯示的圖片路徑
// 引數說明: int x 要顯示的X位置
// 引數說明: int y 要顯示的Y位置
// 返回值: BOOL 成功返回TRUE,否則返回FALSE
//************************************
BOOL CtestShowImageDlg::ShowImage(CDC* pDC,CString strPath, int x, int y)
{
IPicture *pPic=NULL;
OleLoadPicturePath(CComBSTR(strPath.GetBuffer()), (LPUNKNOWN)NULL, 0, 0, IID_IPicture,(LPVOID*)&pPic);
if (NULL==pPic)
{
return FALSE;
}
// 獲取影象寬和高,注意這裡的寬和高不是影象的解析度
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
// 將影象寬度和高度單位轉化為畫素單位
//#define HIMETRIC_PER_INCH 2540
//int nPicWidth = MulDiv(hmWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX),2540);
//int nPicHeight = MulDiv(hmHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY),2540);
// 獲取顯示圖片視窗的寬度和高度
RECT rtWnd;
pDC->GetWindow()->GetWindowRect(&rtWnd);
int iWndWidth=rtWnd.right-rtWnd.left;
int iWndHeight=rtWnd.bottom-rtWnd.top;
if(FAILED(pPic->Render(*pDC,x,y,iWndWidth,iWndHeight,0,hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic->Release();
return false;
}
//記得釋放資源,不然會導致記憶體洩露
pPic->Release();
return true;
}
3、增加一個按鈕,caption為清除圖片,雙擊按鈕生成按鈕的點選事件,在事件中新增程式碼,其中CBrush br(0xf0f0f0);括號中為RGB值,可以根據需要修改顏色。
void CtestShowImageDlg::OnBnClickedButton2()
{
CRect rect;
CDC *pDC=NULL;
pDC=GetDlgItem(IDC_STATIC_PICTURE)->GetDC();
// TODO: 在此新增控制元件通知處理程式程式碼
GetDlgItem(IDC_STATIC_PICTURE)->GetClientRect(&rect);
CBrush br(0xf0f0f0);
pDC->FillRect( rect, &br );
SetRect( rect, rect.left, rect.top, rect.right, rect.bottom );
}