0.VC(ui)-相对路径载入任意类型的图片函数(随手代码)

#pragma once
#include "atlimage.h"
class CImageDraw
{
public:
 CImageDraw(void);
public:
 ~CImageDraw(void);
public:
static bool LoadImageFromResource(IN CImage* pImage,IN UINT nResID,
  IN LPCTSTR lpTyp);
void TileDraw(CDC *pDC,CImage &img,LPRECT  pRect);
};
 
#include "StdAfx.h"
#include "ImageDraw.h"
 
CImageDraw::CImageDraw(void)
{
 
}
 
CImageDraw::~CImageDraw(void)
{
}
 
bool CImageDraw::LoadImageFromResource(IN CImage* pImage,IN UINT nResID,
		  IN LPCTSTR lpTyp)
{
 if ( pImage == NULL) return false;
 pImage->Destroy();
 // 查找资源
 HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(nResID), lpTyp);
 if (hRsrc == NULL) return false;
 // 加载资源
 HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc);
 if (hImgData == NULL)
 {
  ::FreeResource(hImgData);
  return false;
 }
 
 // 锁定内存中的指定资源
 LPVOID lpVoid	= ::LockResource(hImgData);//the return value is a pointer to the first byte of the resource
 LPSTREAM pStream = NULL;
 DWORD dwSize	= ::SizeofResource(AfxGetResourceHandle(), hRsrc);//The number of bytes in the resource
 HGLOBAL hNew	= ::GlobalAlloc(GHND, dwSize);//该函数从堆中分配一定数目的字节数,GHND 标识 为GMEM_MOVEABLE 和 GMEM_ZEROINIT的组合. 返回值是新分配的堆的句柄
 LPBYTE lpByte	= (LPBYTE)::GlobalLock(hNew);//锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处。除非用 GlobalUnlock 函数将内存块解锁,否则地址会一直保持有效
 ::memcpy(lpByte, lpVoid, dwSize);//复制资源
 // 解除内存中的指定资源
 ::GlobalUnlock(hNew);
 // 从指定内存创建流对象
 HRESULT ht = ::CreateStreamOnHGlobal(hNew, TRUE, &pStream);//函数从指定内存创建流对象,TRU表示hGlobal最终会自动释放
 if ( ht != S_OK )
 {
  GlobalFree(hNew);
 }
 else
 {
  // 加载图片
  pImage->Load(pStream);
  GlobalFree(hNew);
 }
 // 释放资源
 ::FreeResource(hImgData);
 return true;
}
 
 
 
void CImageDraw::TileDraw(CDC *pDC,CImage &img,LPRECT pRect)
{
 int x,y,w,h;
 w=img.GetWidth();
 h=img.GetHeight();
 for (y=pRect->top;y<pRect->bottom-h;y+=h)
 {
  for (x=pRect->left;x<pRect->right-w;x+=w)
  {
   img.Draw(pDC->GetSafeHdc(),x,y);
  }
  if (x!=pRect->right)
  {
   img.Draw(pDC->GetSafeHdc(),x,y,pRect->right-x,h
	,0,0,pRect->right-x,h);
 
  }
 }
 if (y!=pRect->bottom)
 {
  for (x=pRect->left;x<pRect->right-w;x+=w)
  {
   img.Draw(pDC->GetSafeHdc(),x,y,w,pRect->bottom-y
	,0,0,w,pRect->bottom-y);
  }
  if (x!=pRect->right)
  {
   img.Draw(pDC->GetSafeHdc(),x,y
	,pRect->right-x,pRect->bottom-y
	,0,0
	,pRect->right-x,pRect->bottom-y);
  }
 
 }
 
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值