1. 程式人生 > >MFC在picture control中JPG/BMP/ICO等格式圖片顯示,並支援清除圖片顯示

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 ); 
}