GDI+通过资源的方式载入图片

 
因为GDI+中没有专门的函数从资源载入图片,下面函数解决了此问题。
GDI+中有namespace,所以直接引用里面的类需要声明using namespace Gdiplus
否则会引起编译错误: 'Bitmap' 'Graphics' undeclare identifier
 
Gdiplus::Bitmap* LoadFromResource(UINT pResourceID, LPCTSTR pResourceType, HMODULE hInstance)
{
     try
     {
         LPCTSTR pResourceName = MAKEINTRESOURCE(pResourceID); 
         HRSRC hResource = FindResource(hInstance, pResourceName, pResourceType);
         if(!hResource)
         {
             throw _T("!hResource");
         } 
         DWORD dwResourceSize = SizeofResource(hInstance, hResource);
         if(!dwResourceSize)
         {
             throw _T("!dwResourceSize");
         }
         const void* pResourceData = LockResource(LoadResource(hInstance, hResource));
         if(!pResourceData)
         {
             throw _T("!pResourceData");
         }
         HGLOBAL hResourceBuffer = GlobalAlloc(GMEM_MOVEABLE, dwResourceSize);
         if(!hResourceBuffer)
         {
             GlobalFree(hResourceBuffer);
             throw _T("!hResourceBuffer");
         }
         void* pResourceBuffer = GlobalLock(hResourceBuffer);
         if(!pResourceBuffer)
         {
             GlobalUnlock(hResourceBuffer);
             GlobalFree(hResourceBuffer);
             throw _T("!pResourceBuffer");
         }
         CopyMemory(pResourceBuffer, pResourceData, dwResourceSize);
         IStream* pIStream = NULL;
         
         if(CreateStreamOnHGlobal(hResourceBuffer, FALSE, &pIStream) == S_OK)
         {
             Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromStream(pIStream);
             
             pIStream->Release();
             GlobalUnlock(hResourceBuffer);
             GlobalFree(hResourceBuffer); 
             if(pBitmap == NULL)
             {
                 throw _T("pBitmap == NULL");
             } 
             Status result = pBitmap->GetLastStatus();
             if(result == Ok)
             {
                 return pBitmap;
             }
             delete pBitmap;
         throw _T("result != Ok");
             //throw getGdiplusErrorString(result);
         }
         GlobalUnlock(hResourceBuffer);
         GlobalFree(hResourceBuffer);
         return NULL;
     }
     catch(LPCSTR errorContent)
     {
         CString errorMessage = _T("error:"); 
         errorMessage += errorContent;
         if(MessageBox(NULL, errorMessage, NULL, MB_YESNO)==IDYES)
         {
             return NULL;
         }
         else
         {
             exit(1);
         }
     }
     return NULL;
}

转载: http://hi.baidu.com/piperworldcup/blog/item/dcf17433b192e146ad4b5f07.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值