15,981
社区成员




ATLINLINE HBITMAP AtlLoadGdiplusImage(ATL::_U_STRINGorID bitmap, ATL::_U_STRINGorID type = (UINT) 0)
{
USES_CONVERSION;
shared_ptr<Bitmap> pBitmap;
if( HIWORD(bitmap.m_lpstr) != NULL )
{
// Load from filename
pBitmap.reset(new Bitmap(T2CW(bitmap.m_lpstr)));
}
else if( type.m_lpstr != NULL && type.m_lpstr != RT_BITMAP )
{
// Loading PNG, JPG resources etc
WTL::CResource res;
if( !res.Load(type, bitmap) )
return NULL;
DWORD dwSize = res.GetSize();
HANDLE hMemory = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);
if( hMemory == NULL )
return NULL;
::memcpy(::GlobalLock(hMemory), res.Lock(), dwSize);
::GlobalUnlock(hMemory);
IStream* pStream = NULL;
if( FAILED( ::CreateStreamOnHGlobal(hMemory, TRUE, &pStream) ) )
{
::GlobalFree(hMemory);
return FALSE;
}
pBitmap.reset(new Gdiplus::Bitmap(pStream));
pStream->Release();
}
else
{
// This only loads BMP resources
pBitmap.reset(new Gdiplus::Bitmap(_Module.GetResourceInstance(), (LPCWSTR) (UINT) bitmap.m_lpstr));
}
if( pBitmap == NULL )
return NULL;
HBITMAP hBitmap = NULL;
pBitmap->GetHBITMAP(NULL, &hBitmap);
return hBitmap;
}