-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCGdiPlusBitmap.h
executable file
·94 lines (73 loc) · 2.62 KB
/
CGdiPlusBitmap.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#ifndef __CGDIPLUSBITMAP_H__
#define __CGDIPLUSBITMAP_H__
#include <Gdiplus.h>
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() { CGdiPlusBitmap::Empty(); ::GlobalUnlock(m_hBuffer); ::GlobalFree(m_hBuffer); m_hBuffer = NULL; }
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
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)
return false;
void* pBuffer = ::GlobalLock(m_hBuffer);
if (!pBuffer)
{
::GlobalFree(m_hBuffer);
m_hBuffer = NULL;
return false;
}
CopyMemory(pBuffer, pResourceData, imageSize);
IStream* pStream = NULL;
if (::CreateStreamOnHGlobal(m_hBuffer, TRUE, &pStream) == S_OK)
{
m_pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
}
return m_pBitmap && m_pBitmap->GetLastStatus() == Gdiplus::Ok;
}
#endif // __CGDIPLUSBITMAP_H__