使用GDI+ 从资源文件中导入png图片,程序中加载并显示这个图片

本文介绍了一个C++函数,用于从Windows资源中加载PNG和BMP图像为HBITMAP格式。通过使用GDI+库,该函数能够处理PNG文件,并支持透明度等特性。此外,还提供了如何调用该函数的具体示例。

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

HBITMAP  CPngFileLoadDlg::LoadImageFromRes( UINT  pResourceID,  HMODULE  hInstance,  LPCTSTR  pResourceType)
{
     HBITMAP  hBitmap = NULL;
     LPCTSTR  pResourceName = MAKEINTRESOURCE(pResourceID);
 
     HRSRC  hResource = FindResource(hInstance, pResourceName, pResourceType);
 
     if (!hResource)
     {
       
         return  NULL;
     }
 
     DWORD  dwResourceSize = SizeofResource(hInstance, hResource);
 
     if (!dwResourceSize)
     {
      
         return  NULL;
     }
 
     const  void * pResourceData = LockResource(LoadResource(hInstance, hResource));
 
     if (!pResourceData)
     {
       
         return  NULL;
     }
 
     HGLOBAL  hResourceBuffer = GlobalAlloc(GMEM_MOVEABLE, dwResourceSize);
 
     if (!hResourceBuffer)
     {
         GlobalFree(hResourceBuffer);
        
         return  NULL;
     }
 
     void * pResourceBuffer = GlobalLock(hResourceBuffer);
 
     if (!pResourceBuffer)
     {
         GlobalUnlock(hResourceBuffer);
         GlobalFree(hResourceBuffer);
      
         return  NULL;
     }
 
     CopyMemory(pResourceBuffer, pResourceData, dwResourceSize);
     IStream* pIStream = NULL;
 
     if (CreateStreamOnHGlobal(hResourceBuffer, FALSE, &pIStream)==S_OK)
     {
                <strong> //  返回空指针</strong>
         Gdiplus::Image *pImage = Gdiplus::Image::FromStream(pIStream);
         Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromStream(pIStream);
 
         pIStream->Release();
         GlobalUnlock(hResourceBuffer);
         GlobalFree(hResourceBuffer);
 
         if (pBitmap==NULL)
         {
           
             return  NULL;
         }
 
         Gdiplus::Status result = pBitmap->GetLastStatus();
 
         if (result==Gdiplus::Ok)
         {
             pBitmap->GetHBITMAP(NULL, &hBitmap);
             return  hBitmap;
         }
 
         delete  pBitmap;
         //throw getGdiplusErrorString(result);
     }
     GlobalUnlock(hResourceBuffer);
     GlobalFree(hResourceBuffer);
 
  
     return  NULL;
}


用以下形式调用:
C/C++ code
?
1
2
3
4
5
6
// 加载PNG
HINSTANCE  hResInstance = ::AfxGetInstanceHandle();
     m_hImage = LoadImageFromRes(IDB_PNG1, hResInstance,  "PNG" );
// 加载bmp
HINSTANCE  hResInstance = ::AfxGetInstanceHandle();
     m_hImage = LoadImageFromRes(IDB_BITMAP1, hResInstance, RT_BITMAP);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值