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