VC在Picture控件下贴图

本文介绍了一种在Windows应用程序中显示JPEG和GIF格式图片的方法,并提供了一个名为ImageStatic的自定义控件来简化这一过程。该控件能够加载指定路径的图片,并根据窗口尺寸调整图片大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先把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); 


}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值