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;
}
|
用以下形式调用:
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);
|