1 #pragma once
2
3
4 class CPicture
5 {
6 public:
7 CPicture();
8 virtual ~CPicture();
9
10 public:
11 BOOL LoadPictureFromRes( UINT nPicID, LPCTSTR lpszResType );
12 BOOL LoadPictureFromFile( LPCTSTR lpszFile );
13 BOOL Draw( HDC hDC, LPCRECT lprcDest, LPCRECT lprcSrc = NULL );
14 void Release();
15 inline operator bool() const;
16 BOOL GetSize( LPSIZE lpSize, HDC hDC );
17
18 protected:
19 IPicture* m_pPic;
20 OLE_XSIZE_HIMETRIC m_nWidth, m_nHeight;
21 };
1 #include "Picture.h"
2
3 CPicture::CPicture() : m_pPic( NULL )
4 {
5 }
6
7 CPicture::~CPicture()
8 {
9 if ( m_pPic != NULL )
10 {
11 m_pPic->Release();
12 }
13 }
14
15 CPicture::operator bool() const
16 {
17 return m_pPic != NULL ? true : false;
18 }
19
20 void CPicture::Release()
21 {
22 if ( m_pPic != NULL )
23 {
24 m_pPic->Release();
25 m_pPic = NULL;
26 }
27 }
28
29
30 BOOL CPicture::LoadPictureFromRes( UINT nPicID, LPCTSTR lpszResType )
31 {
32 HINSTANCE hInst;
33 HRSRC hRes;
34 HGLOBAL hGlobal, hMem;
35 LPVOID lpData, lpBuf;
36 DWORD dwSize;
37 HRESULT hr;
38 IStream* pStm;
39
40 if ( m_pPic )
41 {
42 m_pPic->Release();
43 m_pPic = NULL;
44 }
45
46 hInst = ::GetModuleHandle( NULL );
47
48 hRes = ::FindResource( hInst, MAKEINTRESOURCE( nPicID ), lpszResType );
49 if ( hRes == NULL )
50 {
51 return NULL;
52 }
53
54 hGlobal = ::LoadResource( hInst, hRes );
55 if ( hGlobal == NULL )
56 {
57 return NULL;
58 }
59
60 dwSize = ::SizeofResource( hInst, hRes );
61
62 hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
63 if ( hMem == NULL )
64 {
65 ::FreeResource( hGlobal );
66 return FALSE;
67 }
68
69 lpBuf = ::GlobalLock( hMem );
70 lpData = ::LockResource( hGlobal );
71 memcpy( lpBuf, lpData, dwSize );
72 ::GlobalUnlock( hMem );
73
74 //UnlockResource
75 ::FreeResource( hGlobal );
76
77 hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStm );
78 if ( FAILED( hr ) )
79 {
80 ::GlobalFree( hMem );
81 return FALSE;
82 }
83
84 hr = ::OleLoadPicture( pStm, dwSize, TRUE, IID_IPicture, ( LPVOID* )&m_pPic );
85 if ( hr != S_OK )
86 {
87 //m_pPic = NULL;
88 pStm->Release();
89 return FALSE;
90 }
91
92 m_pPic->get_Width( &m_nWidth );
93 m_pPic->get_Height( &m_nHeight );
94
95 pStm->Release();
96 return TRUE;
97 }
98
99 BOOL CPicture::LoadPictureFromFile( LPCTSTR lpszFile )
100 {
101 BOOL bRet;
102 HANDLE hFile;
103 DWORD dwSize, dwSizeHigh, dwReads;
104 HGLOBAL hMem;
105 LPVOID lpBuf;
106 HRESULT hr;
107 IStream* pStm;
108
109 if ( m_pPic )
110 {
111 m_pPic->Release();
112 m_pPic = NULL;
113 }
114
115 hFile = ::CreateFile( lpszFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
116 if ( hFile == INVALID_HANDLE_VALUE )
117 {
118 return FALSE;
119 }
120
121 dwSize = ::GetFileSize( hFile, &dwSizeHigh );
122 if ( dwSize == INVALID_FILE_SIZE || dwSizeHigh != 0 )
123 {
124 ::CloseHandle( hFile );
125 return FALSE;
126 }
127
128 hMem = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
129 if ( hMem == NULL )
130 {
131 ::CloseHandle( hFile );
132 return FALSE;
133 }
134
135 lpBuf = ::GlobalLock( hMem );
136
137 bRet = ::ReadFile( hFile, lpBuf, dwSize, &dwReads, NULL );
138 if ( !bRet || dwReads != dwReads )
139 {
140 ::CloseHandle( hFile );
141 ::GlobalUnlock( hMem );
142 ::GlobalFree( hMem );
143 return FALSE;
144 }
145
146 ::CloseHandle( hFile );
147 ::GlobalUnlock( hMem );
148
149 hr = ::CreateStreamOnHGlobal( hMem, TRUE, &pStm );
150 if ( FAILED( hr ) )
151 {
152 ::GlobalFree( hMem );
153 return FALSE;
154 }
155
156 hr = ::OleLoadPicture( pStm, dwSize, TRUE, IID_IPicture, ( LPVOID* )&m_pPic );
157 if ( hr != S_OK )
158 {
159 //m_pPic = NULL;
160 pStm->Release();
161 return FALSE;
162 }
163
164 m_pPic->get_Width( &m_nWidth );
165 m_pPic->get_Height( &m_nHeight );
166
167 pStm->Release();
168 return TRUE;
169 }
170
171 BOOL CPicture::GetSize( LPSIZE lpSize, HDC hDC )
172 {
173 int cxPerInch, cyPerInch;
174
175 if ( lpSize == NULL || hDC == NULL )
176 {
177 return FALSE;
178 }
179
180 cxPerInch = ::GetDeviceCaps( hDC, LOGPIXELSX );
181 cyPerInch = ::GetDeviceCaps( hDC, LOGPIXELSY );
182
183 if ( cxPerInch == 0 || cyPerInch == 0 )
184 {
185 return FALSE;
186 }
187
188 lpSize->cx = ::MulDiv( m_nWidth, cxPerInch, HIMETRIC_INCH );
189 lpSize->cy = ::MulDiv( m_nHeight, cyPerInch, HIMETRIC_INCH );
190
191 return TRUE;
192 }
193
194
195 BOOL CPicture::Draw( HDC hDC, LPCRECT lprcDest, LPCRECT lprcSrc )
196 {
197 POINT ptOri;
198 SIZE szSize;
199 int cxPerInch, cyPerInch;
200 HRESULT hr;
201
202 if ( hDC == NULL || lprcDest == NULL || m_pPic == NULL )
203 {
204 return FALSE;
205 }
206
207 if ( lprcSrc == NULL )
208 {
209 hr = m_pPic->Render( hDC, lprcDest->left, lprcDest->top, \
210 lprcDest->right - lprcDest->left, \
211 lprcDest->bottom - lprcDest->top, \
212 0, m_nHeight, m_nWidth, -m_nHeight, \
213 NULL );
214 }
215 else
216 {
217 cxPerInch = ::GetDeviceCaps( hDC, LOGPIXELSX );
218 cyPerInch = ::GetDeviceCaps( hDC, LOGPIXELSY );
219
220 if ( cxPerInch == 0 || cyPerInch == 0 )
221 {
222 return FALSE;
223 }
224
225 ptOri.x = ::MulDiv( lprcSrc->left, HIMETRIC_INCH, cxPerInch );
226 ptOri.y = ::MulDiv( lprcSrc->top, HIMETRIC_INCH, cyPerInch );
227
228 szSize.cx = ::MulDiv( lprcSrc->right - lprcSrc->left, HIMETRIC_INCH, cxPerInch );
229 szSize.cy = ::MulDiv( lprcSrc->bottom - lprcSrc->top, HIMETRIC_INCH, cyPerInch );
230
231 hr = m_pPic->Render( hDC, lprcDest->left, lprcDest->top, \
232 lprcDest->right - lprcDest->left, \
233 lprcDest->bottom - lprcDest->top, \
234 ptOri.x, m_nHeight - ptOri.y, szSize.cx, -szSize.cy, \
235 NULL );
236 }
237
238 return hr == S_OK ? TRUE : FALSE;
239 }