|
#pragma once
class CGdiPlusBitmap
{
public:
Gdiplus::Bitmap* m_pBitmap;
public:
CGdiPlusBitmap() { m_pBitmap = NULL; }
CGdiPlusBitmap(LPCWSTR pFile) { m_pBitmap = NULL; Load(pFile); }
virtual ~CGdiPlusBitmap() { Empty(); }
void Empty() { delete m_pBitmap; m_pBitmap = NULL; }
bool Load(LPCWSTR pFile)
{
Empty();
m_pBitmap = Gdiplus::Bitmap::FromFile(pFile);
return m_pBitmap->GetLastStatus() == Gdiplus::Ok;
}
operator Gdiplus::Bitmap*() const { return m_pBitmap; }
};
class CGdiPlusBitmapResource : public CGdiPlusBitmap
{
protected:
HGLOBAL m_hBuffer;
public:
CGdiPlusBitmapResource() { m_hBuffer = NULL; }
CGdiPlusBitmapResource(LPCTSTR pName, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
{ m_hBuffer = NULL; Load(pName, pType, hInst); }
CGdiPlusBitmapResource(UINT id, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
{ m_hBuffer = NULL; Load(id, pType, hInst); }
CGdiPlusBitmapResource(UINT id, UINT type, HMODULE hInst = NULL)
{ m_hBuffer = NULL; Load(id, type, hInst); }
virtual ~CGdiPlusBitmapResource() { Empty(); }
void Empty();
bool Load(LPCTSTR pName, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL);
bool Load(UINT id, LPCTSTR pType = RT_RCDATA, HMODULE hInst = NULL)
{ return Load(MAKEINTRESOURCE(id), pType, hInst); }
bool Load(UINT id, UINT type, HMODULE hInst = NULL)
{ return Load(MAKEINTRESOURCE(id), MAKEINTRESOURCE(type), hInst); }
};
inline
void CGdiPlusBitmapResource::Empty()
{
CGdiPlusBitmap::Empty();
if (m_hBuffer)
{
::GlobalUnlock(m_hBuffer);
::GlobalFree(m_hBuffer);
m_hBuffer = NULL;
}
}
inline
bool CGdiPlusBitmapResource::Load(LPCTSTR pName, LPCTSTR pType, HMODULE hInst)
{
Empty();
HRSRC hResource = ::FindResource(hInst, pName, pType);
if (!hResource)
return false;
DWORD imageSize = ::SizeofResource(hInst, hResource);
if (!imageSize)
return false;
const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource));
if (!pResourceData)
return false;
m_hBuffer = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
if (m_hBuffer)
{
void* pBuffer = ::GlobalLock(m_hBuffer);
if (pBuffer)
{
CopyMemory(pBuffer, pResourceData, imageSize);
IStream* pStream = NULL;
if (::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK)
{
m_pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
if (m_pBitmap)
{
if (m_pBitmap->GetLastStatus() == Gdiplus::Ok)
return true;
delete m_pBitmap;
m_pBitmap = NULL;
}
}
::GlobalUnlock(m_hBuffer);
}
::GlobalFree(m_hBuffer);
m_hBuffer = NULL;
}
return false;
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Joe is one of those software engineers with a film degree. His first paid programming job (you think film is a good way to make a living?) was writing games for Apple II's using 6502 assembly. He soon moved to 80x86 assembly, C, C++ (for a long time), C# and then back to C++ with occasional dabbling in C#, Python and other vile languages.
He first wrote software for Windows 3.0 in 1990. Save for some work in Linux, DOS and a mercifully brief foray into OS/2, he has concentrated on designing and writing software for all versions and types of Windows except RT.