类名称:CPicture

新建一个基于对话框的工程。 
给你的对话框中加入一个静态文本控件(Static Text)或者图片控件(Picture Control); 
利用ClassWizard给控件关联一个变量。类型是:CPictureEx的。如:CPictureEx  m_gif;当然,别忘了在你的工程中加入PictureEx.h和PictureEx.cpp文件。并在头文件中包含“PictureExcellent.h”头文件。 在OnInitDialog里加入下面代码: If(m_gif.Load("****.gif")) m_gif.Draw(); 运行你的



用途:封装了通过IPicture接口对各种常见格式的图像(如BMP、JPEG、GIF等)文件及资源的操作,在MFC的支持下工作,当然,如果你有兴趣,完全可以改成不需要MFC的支持就能工作。由于本人通常工作在MFC下,所以方便起见写成MFC的啦。 基类:无。 

注:以下对图像的坐标、尺寸的单位指的都是象素,图像的坐标原点位于图像左上角向下是+Y方向,向右是+X方向。 成员函数描述: 
CPicture::CPicture(); 
说明:构造函数。构造一个空的CPicture对象。 
BOOL CPicture::LoadPicture(UINT nResource, LPCTSTR lpszResType); 
BOOL CPicture::LoadPicture(LPCTSTR lpszResource,LPCTSTR lpszResType); 
说明:该函数从资源是加载一个图像,如果该对象已经包含一个图像,则原图像先被自动释放,而不论本次加载是否成功。 
返回值:如果加载成功则返回TRUE,否则返回FALSE。 参数: 
nResource  指定一个资源的ID号,该ID指定一个资源,函数将根据该资源来生成图像,资源的格式不用担心,对象会自动识别的(如果不认识该资源的格式自然加载就会失败)。 lpszResType 指定该资源的类型,国为该函数可以识别多种非标准的图像资源所以你应该指明你加载的该资源的类型 
lpszResource 指定一个资源的标识符,该标识指定一个资源,函数将根据该资源来生成图像,资源的格式不用担心,对象会自动识别的(如果不认识该资源的格式自然加载就会失败)。 
BOOL CPicture::LoadPictureFromFile(LPCTSTR lpszFileName); 说明:该函数从文件中加载一个图像。 
返回值:如果加载成功则返回TRUE,否则返回FALSE。 参数: 
lpszFileName  一个指向文件名字符串的指针。 BOOL CPicture::IsValid(); 说明:判断对象是否有效。 
返回值:如果对象中有一个有效的图像则返回TRUE,否则返回FALSE。 参数:无 
CSize CPicture::GetSize(); 说明:取得图象的尺寸 
返回值:一个CSize对象,包含了图像的尺寸,对一个无效的CPicture对象使用该函数将返回(0,0)。 
void CPicture::Draw(CDC* pDC, LPCRECT lprcDest, LPCRECT lprcSrc); void CPicture::Draw(CDC* pDC, int xDest,int yDest, int cxDest, int cyDest ,   int xSrc ,int ySrc ,int cxSrc ,int cySrc); 说明:在一个DC表面绘制对象内包含的图像,如果对象没有包含任何图象,则什么也不做。 返回值:无返回值。 参数: 
pDC    一个指向DC对象的指针,图像将绘制在该设备表面。 
lprcDest  指定一个目标矩形。源矩形内的部分图像被拉伸并绘制到设备表面的该象区域内 
lprcSrc  指定一个源矩形区域。图像中位于源矩形内的部分被拉伸并绘制到设备表面目标矩形区域 
xDest   指定目标矩形左上角的水平方向(X)坐标,见参数lprcDest的说明。 yDest   指定目标矩形左上角的垂直方向(Y)坐标,见参数lprcDest的说明。 cxDest   指定目标矩形的水平方向尺寸(宽度),见参数lprcDest的说明。 cyDest   指定目标矩形的垂直方向尺寸(高度),见参数lprcDest的说明。 xSrc   指定源矩形左上角的水平方向(X)坐标,见参数lprcSrc的说明。 ySrc   指定源矩形左上角的垂直方向(Y)坐标,见参数lprcSrc的说明。 cxSrc   指定源矩形的水平方向尺寸(宽度),见参数lprcSrc的说明。 cySrc   指定源矩形的垂直方向尺寸(高度),见参数lprcSrc的说明。 void CPicture::Release(); 
说明:将对象所包含的图像从内存中移除。注意对象本身并不会从内存中移除。你仍然可以用它来重新加载一个新的图像。你无须时刻记着为不再使用的图像调用Release,当类析构时,该函数自然被调用。当然我并不反对你显式地调用该函数来释放图像以便空出一点内存资源。 

返回值:无。 参数:无。







  










  




 
 void Release();  
protected: 
 IPicture*   m_pPic;  
 OLE_XSIZE_HIMETRIC   _w_him;  OLE_YSIZE_HIMETRIC   _h_him;  
 CSize     m_size;  
protected: 
 void CalcSize(); };   
#endif // define picture_h #endif // define PICTURE_H    
// 
// Picture.cpp: implementation of the CPicture class. // Lounge Stdio  2003     
// 作者:边城浪子(QQ:16168666) // E-mail: krh2001.lpfdiyvbb@163.com 
//  
#include "stdafx.h" #include "Picture.h"   
#ifdef _DEBUG #undef THIS_FILE 
static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif   
// // Construction/Destruction 
//  
CPicture::CPicture() 
:m_pPic(NULL), _h_him(0), _w_him(0), m_size(0,0) 






  




{ }  
CPicture::~CPicture() { 
 Release(); }  
void CPicture::Release() { 
 if(m_pPic != NULL)  { 
  m_pPic->Release();   m_pPic = NULL; 
  _h_him = _w_him = 0; 
  m_size.cx = m_size.cy = 0;  } }  
BOOL CPicture::LoadPicture(LPCTSTR lpszResource, LPCTSTR lpszResType) { 
 Release();  
 HINSTANCE  hInst = AfxFindResourceHandle(lpszResource, lpszResType);  HRSRC hRsrc = ::FindResource(hInst, lpszResource, lpszResType);  if(hRsrc == NULL) return FALSE; 
 HGLOBAL hGlobal = LoadResource(hInst, hRsrc);   
 if(hGlobal == NULL) return FALSE;     
 DWORD dwSize = SizeofResource(hInst, hRsrc);   
 HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);  if(hMem == NULL) return  FALSE;   
 LPVOID  pSrc = ::LockResource(hGlobal);  if(pSrc == NULL) {   ::GlobalFree(hMem);   return FALSE;  }   
 LPVOID pDes = ::GlobalLock(hMem);  if(pDes == NULL){ 






  




  //::GlobalUnlock(hGlobal);   ::GlobalFree(hMem);   return FALSE;  }   
 memcpy(pDes, pSrc, dwSize);   
 //GlobalUnlock(hGlobal);  GlobalUnlock(hMem);   
 ::FreeResource(hGlobal);   
 IStream* pStm = NULL; 
 CreateStreamOnHGlobal(hMem, TRUE, &pStm);   
 if(!SUCCEEDED(OleLoadPicture(pStm,dwSize,TRUE,IID_IPicture,(LPVOID*)&m_pPic)))  { 
  pStm -> Release();   ::GlobalFree(hMem);   pStm = NULL;   return FALSE;  }   
 pStm->Release();  ::GlobalFree(hMem);   
 CalcSize();  return TRUE;  }  
BOOL CPicture::LoadPictureFromFile(LPCTSTR lpszFileName) { 
 Release();  
 CFile   file; 
 if(!file.Open(lpszFileName, CFile::modeRead))   return FALSE;  
 DWORD dwSize = file.GetLength();   
 HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);  if(hMem == NULL) return  FALSE;   






  




 LPVOID pDes = ::GlobalLock(hMem);  if(pDes == NULL){   ::GlobalFree(hMem);   return FALSE;  }   
 file.ReadHuge(pDes, dwSize);   
 file.Close();  
 GlobalUnlock(hMem);   
 IStream* pStm = NULL; 
 CreateStreamOnHGlobal(hMem, TRUE, &pStm);   
 if(!SUCCEEDED(OleLoadPicture(pStm,dwSize,TRUE,IID_IPicture,(LPVOID*)&m_pPic)))  { 
  pStm -> Release();   ::GlobalFree(hMem);   pStm = NULL;   return FALSE;  }   
 pStm->Release();  ::GlobalFree(hMem);   
 CalcSize();  return TRUE;  }   
void CPicture::CalcSize() { 
 if(m_pPic == NULL) return;  
 m_pPic->get_Width(&_w_him);  m_pPic->get_Height(&_h_him);  
 CDC* pDC = CWnd::GetDesktopWindow()->GetDC();  m_size.cx = _w_him;  m_size.cy = _h_him;  
 pDC->HIMETRICtoDP(&m_size); 






  




 
 CWnd::GetDesktopWindow()->ReleaseDC(pDC);  }  
void CPicture::Draw(CDC* pDC, LPCRECT lprcDest, LPCRECT lprcSrc) { 
 if(m_pPic)  { 
  CSize  szOrig(lprcSrc->left, lprcSrc->top); 
  CSize  szSrc(lprcSrc->right - lprcSrc->left, lprcSrc->bottom - lprcSrc->top);   pDC->DPtoHIMETRIC(&szOrig);   pDC->DPtoHIMETRIC(&szSrc);  
  m_pPic->Render(*pDC, lprcDest->left,lprcDest->top,lprcDest->right-lprcDest->left,    lprcDest->bottom-lprcDest->top, szOrig.cx, _h_him-szOrig.cy, szSrc.cx,    -szSrc.cy, NULL);  } }  
void CPicture::Draw(CDC* pDC, int xDest,int yDest, int cxDest, int cyDest ,   int xSrc ,int ySrc ,int cxSrc ,int cySrc) { 
 Draw(pDC, CRect(xDest, yDest, xDest+cxDest, yDest+cyDest), CRect(xSrc, ySrc, xSrc+cxSrc, ySrc+cySrc)); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值