VC在Picture控件下貼圖

首先把ImageStatic.h和ImageStatic.cpp導入工程

再給對話框添加Picture控件和Group Box控件,分別添加變量m_pic和m_Frame;

注意::要m_pic類改爲ImageStatic,m_Frame改爲CStatic;

然後 把ShowJpgGif()拷到主程序中,

/*   
  函數功能:顯示JPG和GIF圖片   
  參數說明:
  pDC:設備環境對象     
  strPath:要顯示的圖片路徑       
  x:要顯示的X位置      
  y:要顯示的Y位置
  bAdjust:爲true表示調整圖像大小
  w:調整後寬度,高度按比例調整
  */   
BOOL ShowJpgGif(CDC*pDC,CString str_Path, int x, int y, bool bAdjust,  int w, int h)   
 {   
          IStream   *pStm;       
          CFileStatus   fstatus;       
          CFile   file;       
          LONG   cb;       
    
          //打開文件並檢測文件的有效性   
          if   (file.Open(str_Path,CFile::modeRead)&&   
                  file.GetStatus(str_Path,fstatus)&&     
                  ((cb   =   fstatus.m_size)  !=   -1))       
          {       
    
                  HGLOBAL   hGlobal   =   GlobalAlloc(GMEM_MOVEABLE,   cb);       
                  LPVOID   pvData   =   NULL;       
                  if   (hGlobal   !=   NULL)       
                  {       
                          pvData   =   GlobalLock(hGlobal);   
                          if   (pvData   !=   NULL)       
                          {       
                                  file.Read(pvData,   cb);       
                                  GlobalUnlock(hGlobal);       
                                  CreateStreamOnHGlobal(hGlobal,   TRUE,   &pStm);       
                          }     
                  }     
 file.Close();
          }   
           else   
          {   
                  return   false;   
          }  //打開文件結束   
    
          //顯示JPEG和GIF格式的圖片,GIF只能顯示一幀,還不能顯示動畫,   
         //要顯示動畫GIF請使用ACTIVE控//件。   
          IPicture   *pPic;     
          //load   image   from   file   stream   
          if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))     
          {     
                  OLE_XSIZE_HIMETRIC   hmWidth;       
                  OLE_YSIZE_HIMETRIC   hmHeight;       
                  pPic->get_Width(&hmWidth);       
                  pPic->get_Height(&hmHeight);       
                  double   fX,fY;       
                  //get   image   height   and   width   
                  fX   =   (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/   
  ((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);       
                  fY   =   (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/   
  ((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);    


 int width = fX;
                  int height = fY;
 if (bAdjust)
 {
  width = w;
  if (0 != h)
  {
  height = h;
  }
  else
  {
  height = w/fX*fY;
  }
 }


                  //use   render   function   display   image   
                  if(FAILED(pPic->Render(*pDC,x,y,(DWORD)width,(DWORD)height,0,   
                       hmHeight,hmWidth,-hmHeight,NULL)))       
                  {   
                          pPic->Release();   
                          return   false;   
                  }   
                  pPic->Release();       
          }       
    
          else       
          {   
                  return   false;       
          }   




          return   true;   
 }   

再把void nitPicture()拷到OnPaint中

void nitPicture()//貼圖
{



CRect tempRect;
m_pic.GetWindowRect(tempRect);
ScreenToClient(tempRect);         //轉換到在對話框中的位置


char CDstr[MAX_PATH];
TCHAR IniFilePath[MAX_PATH];
GetModuleFileName(NULL,IniFilePath,MAX_PATH);
m_strFileName = CString(IniFilePath);

m_strFileName = m_strFileName.Left(m_strFileName.ReverseFind('\\'));///得到初始化文件的全路徑
        
        m_strFileName = m_strFileName.Left(m_strFileName.ReverseFind('\\')+1);

m_strFileName +="LOGO\\logo3.bmp";

//獲取圖片信息,按照圖片比例顯示圖片
HDC hdc;
BITMAP bmp;
HBITMAP hPic;

// hdc=CreateCompatibleDC(m_hdc);
hPic=(HBITMAP)LoadImage(NULL,m_strFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
GetObject(hPic,sizeof(BITMAP),&bmp);

float dx = bmp.bmHeight*1.0/bmp.bmWidth;//height*.1.0/width;
int wDest = tempRect.Width();
   int hDest = wDest * dx;






m_pic.SetImageWidth(wDest);
m_pic.SetImageHeight(hDest);





m_pic.SetImagePath(m_strFileName);


    m_frame.ShowWindow(FALSE);


}

ImageStatic.h//代碼





#pragma once


// ImageStatic


class ImageStatic : public CStatic
{
DECLARE_DYNAMIC(ImageStatic)

public:
void SetImagePath(CString imagePath);
CString GetImagePath();
void SetImageWidth(int width);
void SetImageHeight(int height);
void ClearImage();
ImageStatic();
virtual ~ImageStatic();

protected:
DECLARE_MESSAGE_MAP()
private:
CString m_ImagePath;
int m_ImageWidth;
int m_ImageHeight;
afx_msg void OnPaint();
};




ImageStatic.cpp//代碼


// ImageStatic.cpp : 實現文件
//


#include "stdafx.h"
#include "ImageStatic.h"


 BOOL ShowJpgGif(CDC*pDC,CString str_Path, int x, int y, bool bAdjust,  int w, int h) ;  
// ImageStatic


IMPLEMENT_DYNAMIC(ImageStatic, CStatic)


ImageStatic::ImageStatic()
{
m_ImageWidth = 0;
m_ImageHeight = 0;
}


ImageStatic::~ImageStatic()
{
}




BEGIN_MESSAGE_MAP(ImageStatic, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()




// ImageStatic 消息處理程序




void ImageStatic::SetImagePath(CString imagePath)
{
m_ImagePath = imagePath;
this->RedrawWindow();
}
CString ImageStatic::GetImagePath()
{
return m_ImagePath;
}


void ImageStatic::SetImageWidth(int width)
{
m_ImageWidth = width;
}


void ImageStatic::SetImageHeight(int height)
{
m_ImageHeight = height;
}


void ImageStatic::ClearImage()
{
m_ImagePath = "";
this->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ERASE);
}


void ImageStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此處添加消息處理程序代碼
// 不爲繪圖消息調用 CDialog::OnPaint()
bool bAdjust = m_ImageWidth > 0;
ShowJpgGif(this->GetDC(), m_ImagePath, 0, 0, bAdjust, m_ImageWidth, m_ImageHeight); 


}






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