因为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
239

被折叠的 条评论
为什么被折叠?



