Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(389)

Side by Side Diff: third_party/wtl/include/atlgdi.h

Issue 703753005: More Windows build fixes. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: remove generated files Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/wtl/include/atlframe.h ('k') | third_party/wtl/include/atlmisc.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Windows Template Library - WTL version 8.0
2 // Copyright (C) Microsoft Corporation. All rights reserved.
3 //
4 // This file is a part of the Windows Template Library.
5 // The use and distribution terms for this software are covered by the
6 // Microsoft Permissive License (Ms-PL) which can be found in the file
7 // Ms-PL.txt at the root of this distribution.
8
9 #ifndef __ATLGDI_H__
10 #define __ATLGDI_H__
11
12 #pragma once
13
14 #ifndef __cplusplus
15 #error ATL requires C++ compilation (use a .cpp suffix)
16 #endif
17
18 #ifndef __ATLAPP_H__
19 #error atlgdi.h requires atlapp.h to be included first
20 #endif
21
22
23 // protect template members from windowsx.h macros
24 #ifdef _INC_WINDOWSX
25 #undef CopyRgn
26 #undef CreateBrush
27 #undef CreatePen
28 #undef SelectBrush
29 #undef SelectPen
30 #undef SelectFont
31 #undef SelectBitmap
32 #endif // _INC_WINDOWSX
33
34 // required libraries
35 #if !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE)
36 #pragma comment(lib, "msimg32.lib")
37 #endif // !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE)
38 #if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)
39 #pragma comment(lib, "opengl32.lib")
40 #endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)
41
42
43 ///////////////////////////////////////////////////////////////////////////////
44 // Classes in this file:
45 //
46 // CPenT<t_bManaged>
47 // CBrushT<t_bManaged>
48 // CLogFont
49 // CFontT<t_bManaged>
50 // CBitmapT<t_bManaged>
51 // CPaletteT<t_bManaged>
52 // CRgnT<t_bManaged>
53 // CDCT<t_bManaged>
54 // CPaintDC
55 // CClientDC
56 // CWindowDC
57 // CMemoryDC
58 // CEnhMetaFileInfo
59 // CEnhMetaFileT<t_bManaged>
60 // CEnhMetaFileDC
61 //
62 // Global functions:
63 // AtlGetBitmapResourceInfo()
64 // AtlGetBitmapResourceBitsPerPixel()
65 // AtlIsAlphaBitmapResource()
66 // AtlIsDib16()
67 // AtlGetDibColorTableSize()
68 // AtlGetDibNumColors(),
69 // AtlGetDibBitmap()
70 // AtlCopyBitmap()
71 // AtlCreatePackedDib16()
72 // AtlSetClipboardDib16()
73 // AtlGetClipboardDib()
74
75
76 namespace WTL
77 {
78
79 ///////////////////////////////////////////////////////////////////////////////
80 // Bitmap resource helpers to extract bitmap information for a bitmap resource
81
82 inline LPBITMAPINFOHEADER AtlGetBitmapResourceInfo(HMODULE hModule, ATL::_U_STRI NGorID image)
83 {
84 HRSRC hResource = ::FindResource(hModule, image.m_lpstr, RT_BITMAP);
85 ATLASSERT(hResource != NULL);
86 HGLOBAL hGlobal = ::LoadResource(hModule, hResource);
87 ATLASSERT(hGlobal != NULL);
88 LPBITMAPINFOHEADER pBitmapInfoHeader = (LPBITMAPINFOHEADER)::LockResourc e(hGlobal);
89 ATLASSERT(pBitmapInfoHeader != NULL);
90 return pBitmapInfoHeader;
91 }
92
93 inline WORD AtlGetBitmapResourceBitsPerPixel(HMODULE hModule, ATL::_U_STRINGorID image)
94 {
95 LPBITMAPINFOHEADER pBitmapInfoHeader = AtlGetBitmapResourceInfo(hModule, image);
96 ATLASSERT(pBitmapInfoHeader != NULL);
97 return pBitmapInfoHeader->biBitCount;
98 }
99
100 inline WORD AtlGetBitmapResourceBitsPerPixel(ATL::_U_STRINGorID image)
101 {
102 return AtlGetBitmapResourceBitsPerPixel(ModuleHelper::GetResourceInstanc e(), image);
103 }
104
105 ///////////////////////////////////////////////////////////////////////////////
106 // 32-bit (alpha channel) bitmap resource helper
107
108 // Note: 32-bit (alpha channel) images work only on Windows XP with Common Contr ols version 6.
109 // If you want your app to work on older version of Windows, load non-alpha imag es if Common
110 // Controls version is less than 6.
111
112 inline bool AtlIsAlphaBitmapResource(ATL::_U_STRINGorID image)
113 {
114 return (AtlGetBitmapResourceBitsPerPixel(image) == 32);
115 }
116
117
118 ///////////////////////////////////////////////////////////////////////////////
119 // CPen
120
121 template <bool t_bManaged>
122 class CPenT
123 {
124 public:
125 // Data members
126 HPEN m_hPen;
127
128 // Constructor/destructor/operators
129 CPenT(HPEN hPen = NULL) : m_hPen(hPen)
130 { }
131
132 ~CPenT()
133 {
134 if(t_bManaged && m_hPen != NULL)
135 DeleteObject();
136 }
137
138 CPenT<t_bManaged>& operator =(HPEN hPen)
139 {
140 Attach(hPen);
141 return *this;
142 }
143
144 void Attach(HPEN hPen)
145 {
146 if(t_bManaged && m_hPen != NULL && m_hPen != hPen)
147 ::DeleteObject(m_hPen);
148 m_hPen = hPen;
149 }
150
151 HPEN Detach()
152 {
153 HPEN hPen = m_hPen;
154 m_hPen = NULL;
155 return hPen;
156 }
157
158 operator HPEN() const { return m_hPen; }
159
160 bool IsNull() const { return (m_hPen == NULL); }
161
162 // Create methods
163 HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor)
164 {
165 ATLASSERT(m_hPen == NULL);
166 m_hPen = ::CreatePen(nPenStyle, nWidth, crColor);
167 return m_hPen;
168 }
169
170 #ifndef _WIN32_WCE
171 HPEN CreatePen(int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL)
172 {
173 ATLASSERT(m_hPen == NULL);
174 m_hPen = ::ExtCreatePen(nPenStyle, nWidth, pLogBrush, nStyleCoun t, lpStyle);
175 return m_hPen;
176 }
177 #endif // !_WIN32_WCE
178
179 HPEN CreatePenIndirect(LPLOGPEN lpLogPen)
180 {
181 ATLASSERT(m_hPen == NULL);
182 m_hPen = ::CreatePenIndirect(lpLogPen);
183 return m_hPen;
184 }
185
186 BOOL DeleteObject()
187 {
188 ATLASSERT(m_hPen != NULL);
189 BOOL bRet = ::DeleteObject(m_hPen);
190 if(bRet)
191 m_hPen = NULL;
192 return bRet;
193 }
194
195 // Attributes
196 int GetLogPen(LOGPEN* pLogPen) const
197 {
198 ATLASSERT(m_hPen != NULL);
199 return ::GetObject(m_hPen, sizeof(LOGPEN), pLogPen);
200 }
201
202 bool GetLogPen(LOGPEN& LogPen) const
203 {
204 ATLASSERT(m_hPen != NULL);
205 return (::GetObject(m_hPen, sizeof(LOGPEN), &LogPen) == sizeof(L OGPEN));
206 }
207
208 #ifndef _WIN32_WCE
209 int GetExtLogPen(EXTLOGPEN* pLogPen) const
210 {
211 ATLASSERT(m_hPen != NULL);
212 return ::GetObject(m_hPen, sizeof(EXTLOGPEN), pLogPen);
213 }
214
215 bool GetExtLogPen(EXTLOGPEN& ExtLogPen) const
216 {
217 ATLASSERT(m_hPen != NULL);
218 return (::GetObject(m_hPen, sizeof(EXTLOGPEN), &ExtLogPen) == si zeof(EXTLOGPEN));
219 }
220 #endif // !_WIN32_WCE
221 };
222
223 typedef CPenT<false> CPenHandle;
224 typedef CPenT<true> CPen;
225
226
227 ///////////////////////////////////////////////////////////////////////////////
228 // CBrush
229
230 template <bool t_bManaged>
231 class CBrushT
232 {
233 public:
234 // Data members
235 HBRUSH m_hBrush;
236
237 // Constructor/destructor/operators
238 CBrushT(HBRUSH hBrush = NULL) : m_hBrush(hBrush)
239 { }
240
241 ~CBrushT()
242 {
243 if(t_bManaged && m_hBrush != NULL)
244 DeleteObject();
245 }
246
247 CBrushT<t_bManaged>& operator =(HBRUSH hBrush)
248 {
249 Attach(hBrush);
250 return *this;
251 }
252
253 void Attach(HBRUSH hBrush)
254 {
255 if(t_bManaged && m_hBrush != NULL && m_hBrush != hBrush)
256 ::DeleteObject(m_hBrush);
257 m_hBrush = hBrush;
258 }
259
260 HBRUSH Detach()
261 {
262 HBRUSH hBrush = m_hBrush;
263 m_hBrush = NULL;
264 return hBrush;
265 }
266
267 operator HBRUSH() const { return m_hBrush; }
268
269 bool IsNull() const { return (m_hBrush == NULL); }
270
271 // Create methods
272 HBRUSH CreateSolidBrush(COLORREF crColor)
273 {
274 ATLASSERT(m_hBrush == NULL);
275 m_hBrush = ::CreateSolidBrush(crColor);
276 return m_hBrush;
277 }
278
279 #ifndef _WIN32_WCE
280 HBRUSH CreateHatchBrush(int nIndex, COLORREF crColor)
281 {
282 ATLASSERT(m_hBrush == NULL);
283 m_hBrush = ::CreateHatchBrush(nIndex, crColor);
284 return m_hBrush;
285 }
286 #endif // !_WIN32_WCE
287
288 #if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
289 HBRUSH CreateBrushIndirect(const LOGBRUSH* lpLogBrush)
290 {
291 ATLASSERT(m_hBrush == NULL);
292 #ifndef _WIN32_WCE
293 m_hBrush = ::CreateBrushIndirect(lpLogBrush);
294 #else // CE specific
295 m_hBrush = ATL::CreateBrushIndirect(lpLogBrush);
296 #endif // _WIN32_WCE
297 return m_hBrush;
298 }
299 #endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
300
301 HBRUSH CreatePatternBrush(HBITMAP hBitmap)
302 {
303 ATLASSERT(m_hBrush == NULL);
304 m_hBrush = ::CreatePatternBrush(hBitmap);
305 return m_hBrush;
306 }
307
308 HBRUSH CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage)
309 {
310 ATLASSERT(hPackedDIB != NULL);
311 const void* lpPackedDIB = GlobalLock(hPackedDIB);
312 ATLASSERT(lpPackedDIB != NULL);
313 m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage);
314 GlobalUnlock(hPackedDIB);
315 return m_hBrush;
316 }
317
318 HBRUSH CreateDIBPatternBrush(const void* lpPackedDIB, UINT nUsage)
319 {
320 ATLASSERT(m_hBrush == NULL);
321 m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage);
322 return m_hBrush;
323 }
324
325 HBRUSH CreateSysColorBrush(int nIndex)
326 {
327 ATLASSERT(m_hBrush == NULL);
328 m_hBrush = ::GetSysColorBrush(nIndex);
329 return m_hBrush;
330 }
331
332 BOOL DeleteObject()
333 {
334 ATLASSERT(m_hBrush != NULL);
335 BOOL bRet = ::DeleteObject(m_hBrush);
336 if(bRet)
337 m_hBrush = NULL;
338 return bRet;
339 }
340
341 // Attributes
342 int GetLogBrush(LOGBRUSH* pLogBrush) const
343 {
344 ATLASSERT(m_hBrush != NULL);
345 return ::GetObject(m_hBrush, sizeof(LOGBRUSH), pLogBrush);
346 }
347
348 bool GetLogBrush(LOGBRUSH& LogBrush) const
349 {
350 ATLASSERT(m_hBrush != NULL);
351 return (::GetObject(m_hBrush, sizeof(LOGBRUSH), &LogBrush) == si zeof(LOGBRUSH));
352 }
353 };
354
355 typedef CBrushT<false> CBrushHandle;
356 typedef CBrushT<true> CBrush;
357
358
359 ///////////////////////////////////////////////////////////////////////////////
360 // CFont
361
362 class CLogFont : public LOGFONT
363 {
364 public:
365 CLogFont()
366 {
367 memset(this, 0, sizeof(LOGFONT));
368 }
369
370 CLogFont(const LOGFONT& lf)
371 {
372 Copy(&lf);
373 }
374
375 CLogFont(HFONT hFont)
376 {
377 ATLASSERT(::GetObjectType(hFont) == OBJ_FONT);
378 ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this);
379 }
380
381 HFONT CreateFontIndirect()
382 {
383 return ::CreateFontIndirect(this);
384 }
385
386 void SetBold()
387 {
388 lfWeight = FW_BOLD;
389 }
390
391 bool IsBold() const
392 {
393 return (lfWeight >= FW_BOLD);
394 }
395
396 void MakeBolder(int iScale = 1)
397 {
398 lfWeight += FW_BOLD * iScale;
399 }
400
401 void MakeLarger(int iScale)
402 {
403 if(lfHeight > 0)
404 lfHeight += iScale;
405 else
406 lfHeight -= iScale;
407 }
408
409 void SetHeight(LONG nPointSize, HDC hDC = NULL)
410 {
411 // For MM_TEXT mapping mode
412 lfHeight = -::MulDiv(nPointSize, ::GetDeviceCaps(hDC, LOGPIXELSY ), 72);
413 }
414
415 LONG GetHeight(HDC hDC = NULL) const
416 {
417 // For MM_TEXT mapping mode
418 return ::MulDiv(-lfHeight, 72, ::GetDeviceCaps(hDC, LOGPIXELSY)) ;
419 }
420
421 LONG GetDeciPointHeight(HDC hDC = NULL) const
422 {
423 #ifndef _WIN32_WCE
424 POINT ptOrg = { 0, 0 };
425 ::DPtoLP(hDC, &ptOrg, 1);
426 POINT pt = { 0, 0 };
427 pt.y = abs(lfHeight) + ptOrg.y;
428 ::LPtoDP(hDC,&pt,1);
429 return ::MulDiv(pt.y, 720, ::GetDeviceCaps(hDC, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point
430 #else // CE specific
431 // DP and LP are always the same on CE
432 return ::MulDiv(abs(lfHeight), 720, ::GetDeviceCaps(hDC, LOGPIXE LSY)); // 72 points/inch, 10 decipoints/point
433 #endif // _WIN32_WCE
434 }
435
436 void SetHeightFromDeciPoint(LONG nDeciPtHeight, HDC hDC = NULL)
437 {
438 #ifndef _WIN32_WCE
439 POINT pt = { 0, 0 };
440 pt.y = ::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720); // 72 points/inch, 10 decipoints/point
441 ::DPtoLP(hDC, &pt, 1);
442 POINT ptOrg = { 0, 0 };
443 ::DPtoLP(hDC, &ptOrg, 1);
444 lfHeight = -abs(pt.y - ptOrg.y);
445 #else // CE specific
446 // DP and LP are always the same on CE
447 lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeci PtHeight, 720)); // 72 points/inch, 10 decipoints/point
448 #endif // _WIN32_WCE
449 }
450
451 #ifndef _WIN32_WCE
452 void SetCaptionFont()
453 {
454 NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS( ) };
455 ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof (ncm), &ncm, 0));
456 Copy(&ncm.lfCaptionFont);
457 }
458
459 void SetMenuFont()
460 {
461 NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS( ) };
462 ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof (ncm), &ncm, 0));
463 Copy(&ncm.lfMenuFont);
464 }
465
466 void SetStatusFont()
467 {
468 NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS( ) };
469 ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof (ncm), &ncm, 0));
470 Copy(&ncm.lfStatusFont);
471 }
472
473 void SetMessageBoxFont()
474 {
475 NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS( ) };
476 ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof (ncm), &ncm, 0));
477 Copy(&ncm.lfMessageFont);
478 }
479 #endif // !_WIN32_WCE
480
481 void Copy(const LOGFONT* pLogFont)
482 {
483 ATLASSERT(pLogFont != NULL);
484 *(LOGFONT*)this = *pLogFont;
485 }
486
487 CLogFont& operator =(const CLogFont& src)
488 {
489 Copy(&src);
490 return *this;
491 }
492
493 CLogFont& operator =(const LOGFONT& src)
494 {
495 Copy(&src);
496 return *this;
497 }
498
499 CLogFont& operator =(HFONT hFont)
500 {
501 ATLASSERT(::GetObjectType(hFont) == OBJ_FONT);
502 ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this);
503 return *this;
504 }
505
506 bool operator ==(const LOGFONT& logfont) const
507 {
508 return(logfont.lfHeight == lfHeight &&
509 logfont.lfWidth == lfWidth &&
510 logfont.lfEscapement == lfEscapement &&
511 logfont.lfOrientation == lfOrientation &&
512 logfont.lfWeight == lfWeight &&
513 logfont.lfItalic == lfItalic &&
514 logfont.lfUnderline == lfUnderline &&
515 logfont.lfStrikeOut == lfStrikeOut &&
516 logfont.lfCharSet == lfCharSet &&
517 logfont.lfOutPrecision == lfOutPrecision &&
518 logfont.lfClipPrecision == lfClipPrecision &&
519 logfont.lfQuality == lfQuality &&
520 logfont.lfPitchAndFamily == lfPitchAndFamily &&
521 lstrcmp(logfont.lfFaceName, lfFaceName) == 0);
522 }
523 };
524
525
526 template <bool t_bManaged>
527 class CFontT
528 {
529 public:
530 // Data members
531 HFONT m_hFont;
532
533 // Constructor/destructor/operators
534 CFontT(HFONT hFont = NULL) : m_hFont(hFont)
535 { }
536
537 ~CFontT()
538 {
539 if(t_bManaged && m_hFont != NULL)
540 DeleteObject();
541 }
542
543 CFontT<t_bManaged>& operator =(HFONT hFont)
544 {
545 Attach(hFont);
546 return *this;
547 }
548
549 void Attach(HFONT hFont)
550 {
551 if(t_bManaged && m_hFont != NULL && m_hFont != hFont)
552 ::DeleteObject(m_hFont);
553 m_hFont = hFont;
554 }
555
556 HFONT Detach()
557 {
558 HFONT hFont = m_hFont;
559 m_hFont = NULL;
560 return hFont;
561 }
562
563 operator HFONT() const { return m_hFont; }
564
565 bool IsNull() const { return (m_hFont == NULL); }
566
567 // Create methods
568 HFONT CreateFontIndirect(const LOGFONT* lpLogFont)
569 {
570 ATLASSERT(m_hFont == NULL);
571 m_hFont = ::CreateFontIndirect(lpLogFont);
572 return m_hFont;
573 }
574
575 #if !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500)
576 HFONT CreateFontIndirectEx(CONST ENUMLOGFONTEXDV* penumlfex)
577 {
578 ATLASSERT(m_hFont == NULL);
579 m_hFont = ::CreateFontIndirectEx(penumlfex);
580 return m_hFont;
581 }
582 #endif // !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500)
583
584 #if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
585 HFONT CreateFont(int nHeight, int nWidth, int nEscapement,
586 int nOrientation, int nWeight, BYTE bItalic, BYTE bUnder line,
587 BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision,
588 BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily ,
589 LPCTSTR lpszFacename)
590 {
591 ATLASSERT(m_hFont == NULL);
592 #ifndef _WIN32_WCE
593 m_hFont = ::CreateFont(nHeight, nWidth, nEscapement,
594 nOrientation, nWeight, bItalic, bUnderline, cStrikeOut,
595 nCharSet, nOutPrecision, nClipPrecision, nQuality,
596 nPitchAndFamily, lpszFacename);
597 #else // CE specific
598 m_hFont = ATL::CreateFont(nHeight, nWidth, nEscapement,
599 nOrientation, nWeight, bItalic, bUnderline, cStrikeOut,
600 nCharSet, nOutPrecision, nClipPrecision, nQuality,
601 nPitchAndFamily, lpszFacename);
602 #endif // _WIN32_WCE
603 return m_hFont;
604 }
605 #endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
606
607 HFONT CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, HDC hDC = NU LL, bool bBold = false, bool bItalic = false)
608 {
609 LOGFONT logFont = { 0 };
610 logFont.lfCharSet = DEFAULT_CHARSET;
611 logFont.lfHeight = nPointSize;
612 SecureHelper::strncpy_x(logFont.lfFaceName, _countof(logFont.lfF aceName), lpszFaceName, _TRUNCATE);
613
614 if(bBold)
615 logFont.lfWeight = FW_BOLD;
616 if(bItalic)
617 logFont.lfItalic = (BYTE)TRUE;
618
619 return CreatePointFontIndirect(&logFont, hDC);
620 }
621
622 HFONT CreatePointFontIndirect(const LOGFONT* lpLogFont, HDC hDC = NULL)
623 {
624 HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL);
625
626 // convert nPointSize to logical units based on hDC
627 LOGFONT logFont = *lpLogFont;
628 #ifndef _WIN32_WCE
629 POINT pt = { 0, 0 };
630 pt.y = ::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHei ght, 720); // 72 points/inch, 10 decipoints/point
631 ::DPtoLP(hDC1, &pt, 1);
632 POINT ptOrg = { 0, 0 };
633 ::DPtoLP(hDC1, &ptOrg, 1);
634 logFont.lfHeight = -abs(pt.y - ptOrg.y);
635 #else // CE specific
636 // DP and LP are always the same on CE
637 logFont.lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELS Y), logFont.lfHeight, 720)); // 72 points/inch, 10 decipoints/point
638 #endif // _WIN32_WCE
639
640 if(hDC == NULL)
641 ::ReleaseDC(NULL, hDC1);
642
643 return CreateFontIndirect(&logFont);
644 }
645
646 BOOL DeleteObject()
647 {
648 ATLASSERT(m_hFont != NULL);
649 BOOL bRet = ::DeleteObject(m_hFont);
650 if(bRet)
651 m_hFont = NULL;
652 return bRet;
653 }
654
655 // Attributes
656 int GetLogFont(LOGFONT* pLogFont) const
657 {
658 ATLASSERT(m_hFont != NULL);
659 return ::GetObject(m_hFont, sizeof(LOGFONT), pLogFont);
660 }
661
662 bool GetLogFont(LOGFONT& LogFont) const
663 {
664 ATLASSERT(m_hFont != NULL);
665 return (::GetObject(m_hFont, sizeof(LOGFONT), &LogFont) == sizeo f(LOGFONT));
666 }
667 };
668
669 typedef CFontT<false> CFontHandle;
670 typedef CFontT<true> CFont;
671
672
673 ///////////////////////////////////////////////////////////////////////////////
674 // CBitmap
675
676 template <bool t_bManaged>
677 class CBitmapT
678 {
679 public:
680 // Data members
681 HBITMAP m_hBitmap;
682
683 // Constructor/destructor/operators
684 CBitmapT(HBITMAP hBitmap = NULL) : m_hBitmap(hBitmap)
685 { }
686
687 ~CBitmapT()
688 {
689 if(t_bManaged && m_hBitmap != NULL)
690 DeleteObject();
691 }
692
693 CBitmapT<t_bManaged>& operator =(HBITMAP hBitmap)
694 {
695 Attach(hBitmap);
696 return *this;
697 }
698
699 void Attach(HBITMAP hBitmap)
700 {
701 if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap)
702 ::DeleteObject(m_hBitmap);
703 m_hBitmap = hBitmap;
704 }
705
706 HBITMAP Detach()
707 {
708 HBITMAP hBitmap = m_hBitmap;
709 m_hBitmap = NULL;
710 return hBitmap;
711 }
712
713 operator HBITMAP() const { return m_hBitmap; }
714
715 bool IsNull() const { return (m_hBitmap == NULL); }
716
717 // Create and load methods
718 HBITMAP LoadBitmap(ATL::_U_STRINGorID bitmap)
719 {
720 ATLASSERT(m_hBitmap == NULL);
721 m_hBitmap = ::LoadBitmap(ModuleHelper::GetResourceInstance(), bi tmap.m_lpstr);
722 return m_hBitmap;
723 }
724
725 HBITMAP LoadOEMBitmap(UINT nIDBitmap) // for OBM_/OCR_/OIC_
726 {
727 ATLASSERT(m_hBitmap == NULL);
728 m_hBitmap = ::LoadBitmap(NULL, MAKEINTRESOURCE(nIDBitmap));
729 return m_hBitmap;
730 }
731
732 #ifndef _WIN32_WCE
733 HBITMAP LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0, LPCOLORMAP lpC olorMap = NULL, int nMapSize = 0)
734 {
735 ATLASSERT(m_hBitmap == NULL);
736 m_hBitmap = ::CreateMappedBitmap(ModuleHelper::GetResourceInstan ce(), nIDBitmap, (WORD)nFlags, lpColorMap, nMapSize);
737 return m_hBitmap;
738 }
739 #endif // !_WIN32_WCE
740
741 HBITMAP CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitsPe rPixel, const void* lpBits)
742 {
743 ATLASSERT(m_hBitmap == NULL);
744 m_hBitmap = ::CreateBitmap(nWidth, nHeight, nPlanes, nBitsPerPix el, lpBits);
745 return m_hBitmap;
746 }
747
748 #ifndef _WIN32_WCE
749 HBITMAP CreateBitmapIndirect(LPBITMAP lpBitmap)
750 {
751 ATLASSERT(m_hBitmap == NULL);
752 m_hBitmap = ::CreateBitmapIndirect(lpBitmap);
753 return m_hBitmap;
754 }
755 #endif // !_WIN32_WCE
756
757 HBITMAP CreateCompatibleBitmap(HDC hDC, int nWidth, int nHeight)
758 {
759 ATLASSERT(m_hBitmap == NULL);
760 m_hBitmap = ::CreateCompatibleBitmap(hDC, nWidth, nHeight);
761 return m_hBitmap;
762 }
763
764 #ifndef _WIN32_WCE
765 HBITMAP CreateDiscardableBitmap(HDC hDC, int nWidth, int nHeight)
766 {
767 ATLASSERT(m_hBitmap == NULL);
768 m_hBitmap = ::CreateDiscardableBitmap(hDC, nWidth, nHeight);
769 return m_hBitmap;
770 }
771 #endif // !_WIN32_WCE
772
773 BOOL DeleteObject()
774 {
775 ATLASSERT(m_hBitmap != NULL);
776 BOOL bRet = ::DeleteObject(m_hBitmap);
777 if(bRet)
778 m_hBitmap = NULL;
779 return bRet;
780 }
781
782 // Attributes
783 int GetBitmap(BITMAP* pBitMap) const
784 {
785 ATLASSERT(m_hBitmap != NULL);
786 return ::GetObject(m_hBitmap, sizeof(BITMAP), pBitMap);
787 }
788
789 bool GetBitmap(BITMAP& bm) const
790 {
791 ATLASSERT(m_hBitmap != NULL);
792 return (::GetObject(m_hBitmap, sizeof(BITMAP), &bm) == sizeof(BI TMAP));
793 }
794
795 bool GetSize(SIZE& size) const
796 {
797 ATLASSERT(m_hBitmap != NULL);
798 BITMAP bm = { 0 };
799 if(!GetBitmap(&bm))
800 return false;
801 size.cx = bm.bmWidth;
802 size.cy = bm.bmHeight;
803 return true;
804 }
805
806 #ifndef _WIN32_WCE
807 DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const
808 {
809 ATLASSERT(m_hBitmap != NULL);
810 return ::GetBitmapBits(m_hBitmap, dwCount, lpBits);
811 }
812 #endif // !_WIN32_WCE
813
814 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
815 DWORD SetBitmapBits(DWORD dwCount, const void* lpBits)
816 {
817 ATLASSERT(m_hBitmap != NULL);
818 return ::SetBitmapBits(m_hBitmap, dwCount, lpBits);
819 }
820 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
821
822 #ifndef _WIN32_WCE
823 BOOL GetBitmapDimension(LPSIZE lpSize) const
824 {
825 ATLASSERT(m_hBitmap != NULL);
826 return ::GetBitmapDimensionEx(m_hBitmap, lpSize);
827 }
828
829 BOOL SetBitmapDimension(int nWidth, int nHeight, LPSIZE lpSize = NULL)
830 {
831 ATLASSERT(m_hBitmap != NULL);
832 return ::SetBitmapDimensionEx(m_hBitmap, nWidth, nHeight, lpSize );
833 }
834
835 // DIB support
836 HBITMAP CreateDIBitmap(HDC hDC, CONST BITMAPINFOHEADER* lpbmih, DWORD dw Init, CONST VOID* lpbInit, CONST BITMAPINFO* lpbmi, UINT uColorUse)
837 {
838 ATLASSERT(m_hBitmap == NULL);
839 m_hBitmap = ::CreateDIBitmap(hDC, lpbmih, dwInit, lpbInit, lpbmi , uColorUse);
840 return m_hBitmap;
841 }
842 #endif // !_WIN32_WCE
843
844 HBITMAP CreateDIBSection(HDC hDC, CONST BITMAPINFO* lpbmi, UINT uColorUs e, VOID** ppvBits, HANDLE hSection, DWORD dwOffset)
845 {
846 ATLASSERT(m_hBitmap == NULL);
847 m_hBitmap = ::CreateDIBSection(hDC, lpbmi, uColorUse, ppvBits, h Section, dwOffset);
848 return m_hBitmap;
849 }
850
851 #ifndef _WIN32_WCE
852 int GetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, LPVOID lpvBits , LPBITMAPINFO lpbmi, UINT uColorUse) const
853 {
854 ATLASSERT(m_hBitmap != NULL);
855 return ::GetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvB its, lpbmi, uColorUse);
856 }
857
858 int SetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, CONST VOID* lpv Bits, CONST BITMAPINFO* lpbmi, UINT uColorUse)
859 {
860 ATLASSERT(m_hBitmap != NULL);
861 return ::SetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBi ts, lpbmi, uColorUse);
862 }
863 #endif // !_WIN32_WCE
864 };
865
866 typedef CBitmapT<false> CBitmapHandle;
867 typedef CBitmapT<true> CBitmap;
868
869
870 ///////////////////////////////////////////////////////////////////////////////
871 // CPalette
872
873 template <bool t_bManaged>
874 class CPaletteT
875 {
876 public:
877 // Data members
878 HPALETTE m_hPalette;
879
880 // Constructor/destructor/operators
881 CPaletteT(HPALETTE hPalette = NULL) : m_hPalette(hPalette)
882 { }
883
884 ~CPaletteT()
885 {
886 if(t_bManaged && m_hPalette != NULL)
887 DeleteObject();
888 }
889
890 CPaletteT<t_bManaged>& operator =(HPALETTE hPalette)
891 {
892 Attach(hPalette);
893 return *this;
894 }
895
896 void Attach(HPALETTE hPalette)
897 {
898 if(t_bManaged && m_hPalette != NULL && m_hPalette != hPalette)
899 ::DeleteObject(m_hPalette);
900 m_hPalette = hPalette;
901 }
902
903 HPALETTE Detach()
904 {
905 HPALETTE hPalette = m_hPalette;
906 m_hPalette = NULL;
907 return hPalette;
908 }
909
910 operator HPALETTE() const { return m_hPalette; }
911
912 bool IsNull() const { return (m_hPalette == NULL); }
913
914 // Create methods
915 HPALETTE CreatePalette(LPLOGPALETTE lpLogPalette)
916 {
917 ATLASSERT(m_hPalette == NULL);
918 m_hPalette = ::CreatePalette(lpLogPalette);
919 return m_hPalette;
920 }
921
922 #ifndef _WIN32_WCE
923 HPALETTE CreateHalftonePalette(HDC hDC)
924 {
925 ATLASSERT(m_hPalette == NULL);
926 ATLASSERT(hDC != NULL);
927 m_hPalette = ::CreateHalftonePalette(hDC);
928 return m_hPalette;
929 }
930 #endif // !_WIN32_WCE
931
932 BOOL DeleteObject()
933 {
934 ATLASSERT(m_hPalette != NULL);
935 BOOL bRet = ::DeleteObject(m_hPalette);
936 if(bRet)
937 m_hPalette = NULL;
938 return bRet;
939 }
940
941 // Attributes
942 int GetEntryCount() const
943 {
944 ATLASSERT(m_hPalette != NULL);
945 WORD nEntries = 0;
946 ::GetObject(m_hPalette, sizeof(WORD), &nEntries);
947 return (int)nEntries;
948 }
949
950 UINT GetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTR Y lpPaletteColors) const
951 {
952 ATLASSERT(m_hPalette != NULL);
953 return ::GetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);
954 }
955
956 UINT SetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTR Y lpPaletteColors)
957 {
958 ATLASSERT(m_hPalette != NULL);
959 return ::SetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);
960 }
961
962 // Operations
963 #ifndef _WIN32_WCE
964 void AnimatePalette(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY l pPaletteColors)
965 {
966 ATLASSERT(m_hPalette != NULL);
967 ::AnimatePalette(m_hPalette, nStartIndex, nNumEntries, lpPalette Colors);
968 }
969
970 BOOL ResizePalette(UINT nNumEntries)
971 {
972 ATLASSERT(m_hPalette != NULL);
973 return ::ResizePalette(m_hPalette, nNumEntries);
974 }
975 #endif // !_WIN32_WCE
976
977 UINT GetNearestPaletteIndex(COLORREF crColor) const
978 {
979 ATLASSERT(m_hPalette != NULL);
980 return ::GetNearestPaletteIndex(m_hPalette, crColor);
981 }
982 };
983
984 typedef CPaletteT<false> CPaletteHandle;
985 typedef CPaletteT<true> CPalette;
986
987
988 ///////////////////////////////////////////////////////////////////////////////
989 // CRgn
990
991 template <bool t_bManaged>
992 class CRgnT
993 {
994 public:
995 // Data members
996 HRGN m_hRgn;
997
998 // Constructor/destructor/operators
999 CRgnT(HRGN hRgn = NULL) : m_hRgn(hRgn)
1000 { }
1001
1002 ~CRgnT()
1003 {
1004 if(t_bManaged && m_hRgn != NULL)
1005 DeleteObject();
1006 }
1007
1008 CRgnT<t_bManaged>& operator =(HRGN hRgn)
1009 {
1010 Attach(hRgn);
1011 return *this;
1012 }
1013
1014 void Attach(HRGN hRgn)
1015 {
1016 if(t_bManaged && m_hRgn != NULL && m_hRgn != hRgn)
1017 ::DeleteObject(m_hRgn);
1018 m_hRgn = hRgn;
1019 }
1020
1021 HRGN Detach()
1022 {
1023 HRGN hRgn = m_hRgn;
1024 m_hRgn = NULL;
1025 return hRgn;
1026 }
1027
1028 operator HRGN() const { return m_hRgn; }
1029
1030 bool IsNull() const { return (m_hRgn == NULL); }
1031
1032 // Create methods
1033 HRGN CreateRectRgn(int x1, int y1, int x2, int y2)
1034 {
1035 ATLASSERT(m_hRgn == NULL);
1036 m_hRgn = ::CreateRectRgn(x1, y1, x2, y2);
1037 return m_hRgn;
1038 }
1039
1040 HRGN CreateRectRgnIndirect(LPCRECT lpRect)
1041 {
1042 ATLASSERT(m_hRgn == NULL);
1043 m_hRgn = ::CreateRectRgnIndirect(lpRect);
1044 return m_hRgn;
1045 }
1046
1047 #ifndef _WIN32_WCE
1048 HRGN CreateEllipticRgn(int x1, int y1, int x2, int y2)
1049 {
1050 ATLASSERT(m_hRgn == NULL);
1051 m_hRgn = ::CreateEllipticRgn(x1, y1, x2, y2);
1052 return m_hRgn;
1053 }
1054
1055 HRGN CreateEllipticRgnIndirect(LPCRECT lpRect)
1056 {
1057 ATLASSERT(m_hRgn == NULL);
1058 m_hRgn = ::CreateEllipticRgnIndirect(lpRect);
1059 return m_hRgn;
1060 }
1061
1062 HRGN CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode)
1063 {
1064 ATLASSERT(m_hRgn == NULL);
1065 m_hRgn = ::CreatePolygonRgn(lpPoints, nCount, nMode);
1066 return m_hRgn;
1067 }
1068
1069 HRGN CreatePolyPolygonRgn(LPPOINT lpPoints, LPINT lpPolyCounts, int nCou nt, int nPolyFillMode)
1070 {
1071 ATLASSERT(m_hRgn == NULL);
1072 m_hRgn = ::CreatePolyPolygonRgn(lpPoints, lpPolyCounts, nCount, nPolyFillMode);
1073 return m_hRgn;
1074 }
1075
1076 HRGN CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3)
1077 {
1078 ATLASSERT(m_hRgn == NULL);
1079 m_hRgn = ::CreateRoundRectRgn(x1, y1, x2, y2, x3, y3);
1080 return m_hRgn;
1081 }
1082
1083 HRGN CreateFromPath(HDC hDC)
1084 {
1085 ATLASSERT(m_hRgn == NULL);
1086 ATLASSERT(hDC != NULL);
1087 m_hRgn = ::PathToRegion(hDC);
1088 return m_hRgn;
1089 }
1090
1091 HRGN CreateFromData(const XFORM* lpXForm, int nCount, const RGNDATA* pRg nData)
1092 {
1093 ATLASSERT(m_hRgn == NULL);
1094 m_hRgn = ::ExtCreateRegion(lpXForm, nCount, pRgnData);
1095 return m_hRgn;
1096 }
1097 #endif // !_WIN32_WCE
1098
1099 BOOL DeleteObject()
1100 {
1101 ATLASSERT(m_hRgn != NULL);
1102 BOOL bRet = ::DeleteObject(m_hRgn);
1103 if(bRet)
1104 m_hRgn = NULL;
1105 return bRet;
1106 }
1107
1108 // Operations
1109 void SetRectRgn(int x1, int y1, int x2, int y2)
1110 {
1111 ATLASSERT(m_hRgn != NULL);
1112 ::SetRectRgn(m_hRgn, x1, y1, x2, y2);
1113 }
1114
1115 void SetRectRgn(LPCRECT lpRect)
1116 {
1117 ATLASSERT(m_hRgn != NULL);
1118 ::SetRectRgn(m_hRgn, lpRect->left, lpRect->top, lpRect->right, l pRect->bottom);
1119 }
1120
1121 int CombineRgn(HRGN hRgnSrc1, HRGN hRgnSrc2, int nCombineMode)
1122 {
1123 ATLASSERT(m_hRgn != NULL);
1124 return ::CombineRgn(m_hRgn, hRgnSrc1, hRgnSrc2, nCombineMode);
1125 }
1126
1127 int CombineRgn(HRGN hRgnSrc, int nCombineMode)
1128 {
1129 ATLASSERT(m_hRgn != NULL);
1130 return ::CombineRgn(m_hRgn, m_hRgn, hRgnSrc, nCombineMode);
1131 }
1132
1133 int CopyRgn(HRGN hRgnSrc)
1134 {
1135 ATLASSERT(m_hRgn != NULL);
1136 return ::CombineRgn(m_hRgn, hRgnSrc, NULL, RGN_COPY);
1137 }
1138
1139 BOOL EqualRgn(HRGN hRgn) const
1140 {
1141 ATLASSERT(m_hRgn != NULL);
1142 return ::EqualRgn(m_hRgn, hRgn);
1143 }
1144
1145 int OffsetRgn(int x, int y)
1146 {
1147 ATLASSERT(m_hRgn != NULL);
1148 return ::OffsetRgn(m_hRgn, x, y);
1149 }
1150
1151 int OffsetRgn(POINT point)
1152 {
1153 ATLASSERT(m_hRgn != NULL);
1154 return ::OffsetRgn(m_hRgn, point.x, point.y);
1155 }
1156
1157 int GetRgnBox(LPRECT lpRect) const
1158 {
1159 ATLASSERT(m_hRgn != NULL);
1160 return ::GetRgnBox(m_hRgn, lpRect);
1161 }
1162
1163 BOOL PtInRegion(int x, int y) const
1164 {
1165 ATLASSERT(m_hRgn != NULL);
1166 return ::PtInRegion(m_hRgn, x, y);
1167 }
1168
1169 BOOL PtInRegion(POINT point) const
1170 {
1171 ATLASSERT(m_hRgn != NULL);
1172 return ::PtInRegion(m_hRgn, point.x, point.y);
1173 }
1174
1175 BOOL RectInRegion(LPCRECT lpRect) const
1176 {
1177 ATLASSERT(m_hRgn != NULL);
1178 return ::RectInRegion(m_hRgn, lpRect);
1179 }
1180
1181 int GetRegionData(LPRGNDATA lpRgnData, int nDataSize) const
1182 {
1183 ATLASSERT(m_hRgn != NULL);
1184 return (int)::GetRegionData(m_hRgn, nDataSize, lpRgnData);
1185 }
1186 };
1187
1188 typedef CRgnT<false> CRgnHandle;
1189 typedef CRgnT<true> CRgn;
1190
1191
1192 ///////////////////////////////////////////////////////////////////////////////
1193 // CDC - The device context class
1194
1195 template <bool t_bManaged>
1196 class CDCT
1197 {
1198 public:
1199 // Data members
1200 HDC m_hDC;
1201
1202 // Constructor/destructor/operators
1203 CDCT(HDC hDC = NULL) : m_hDC(hDC)
1204 {
1205 }
1206
1207 ~CDCT()
1208 {
1209 if(t_bManaged && m_hDC != NULL)
1210 ::DeleteDC(Detach());
1211 }
1212
1213 CDCT<t_bManaged>& operator =(HDC hDC)
1214 {
1215 Attach(hDC);
1216 return *this;
1217 }
1218
1219 void Attach(HDC hDC)
1220 {
1221 if(t_bManaged && m_hDC != NULL && m_hDC != hDC)
1222 ::DeleteDC(m_hDC);
1223 m_hDC = hDC;
1224 }
1225
1226 HDC Detach()
1227 {
1228 HDC hDC = m_hDC;
1229 m_hDC = NULL;
1230 return hDC;
1231 }
1232
1233 operator HDC() const { return m_hDC; }
1234
1235 bool IsNull() const { return (m_hDC == NULL); }
1236
1237 // Operations
1238 #ifndef _WIN32_WCE
1239 HWND WindowFromDC() const
1240 {
1241 ATLASSERT(m_hDC != NULL);
1242 return ::WindowFromDC(m_hDC);
1243 }
1244 #endif // !_WIN32_WCE
1245
1246 CPenHandle GetCurrentPen() const
1247 {
1248 ATLASSERT(m_hDC != NULL);
1249 return CPenHandle((HPEN)::GetCurrentObject(m_hDC, OBJ_PEN));
1250 }
1251
1252 CBrushHandle GetCurrentBrush() const
1253 {
1254 ATLASSERT(m_hDC != NULL);
1255 return CBrushHandle((HBRUSH)::GetCurrentObject(m_hDC, OBJ_BRUSH) );
1256 }
1257
1258 CPaletteHandle GetCurrentPalette() const
1259 {
1260 ATLASSERT(m_hDC != NULL);
1261 return CPaletteHandle((HPALETTE)::GetCurrentObject(m_hDC, OBJ_PA L));
1262 }
1263
1264 CFontHandle GetCurrentFont() const
1265 {
1266 ATLASSERT(m_hDC != NULL);
1267 return CFontHandle((HFONT)::GetCurrentObject(m_hDC, OBJ_FONT));
1268 }
1269
1270 CBitmapHandle GetCurrentBitmap() const
1271 {
1272 ATLASSERT(m_hDC != NULL);
1273 return CBitmapHandle((HBITMAP)::GetCurrentObject(m_hDC, OBJ_BITM AP));
1274 }
1275
1276 HDC CreateDC(LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName, LPCTSTR lps zOutput, const DEVMODE* lpInitData)
1277 {
1278 ATLASSERT(m_hDC == NULL);
1279 m_hDC = ::CreateDC(lpszDriverName, lpszDeviceName, lpszOutput, l pInitData);
1280 return m_hDC;
1281 }
1282
1283 HDC CreateCompatibleDC(HDC hDC = NULL)
1284 {
1285 ATLASSERT(m_hDC == NULL);
1286 m_hDC = ::CreateCompatibleDC(hDC);
1287 return m_hDC;
1288 }
1289
1290 BOOL DeleteDC()
1291 {
1292 if(m_hDC == NULL)
1293 return FALSE;
1294 BOOL bRet = ::DeleteDC(m_hDC);
1295 if(bRet)
1296 m_hDC = NULL;
1297 return bRet;
1298 }
1299
1300 // Device-Context Functions
1301 int SaveDC()
1302 {
1303 ATLASSERT(m_hDC != NULL);
1304 return ::SaveDC(m_hDC);
1305 }
1306
1307 BOOL RestoreDC(int nSavedDC)
1308 {
1309 ATLASSERT(m_hDC != NULL);
1310 return ::RestoreDC(m_hDC, nSavedDC);
1311 }
1312
1313 int GetDeviceCaps(int nIndex) const
1314 {
1315 ATLASSERT(m_hDC != NULL);
1316 return ::GetDeviceCaps(m_hDC, nIndex);
1317 }
1318
1319 #ifndef _WIN32_WCE
1320 UINT SetBoundsRect(LPCRECT lpRectBounds, UINT flags)
1321 {
1322 ATLASSERT(m_hDC != NULL);
1323 return ::SetBoundsRect(m_hDC, lpRectBounds, flags);
1324 }
1325
1326 UINT GetBoundsRect(LPRECT lpRectBounds, UINT flags) const
1327 {
1328 ATLASSERT(m_hDC != NULL);
1329 return ::GetBoundsRect(m_hDC, lpRectBounds, flags);
1330 }
1331
1332 BOOL ResetDC(const DEVMODE* lpDevMode)
1333 {
1334 ATLASSERT(m_hDC != NULL);
1335 return ::ResetDC(m_hDC, lpDevMode) != NULL;
1336 }
1337
1338 // Drawing-Tool Functions
1339 BOOL GetBrushOrg(LPPOINT lpPoint) const
1340 {
1341 ATLASSERT(m_hDC != NULL);
1342 return ::GetBrushOrgEx(m_hDC, lpPoint);
1343 }
1344 #endif // !_WIN32_WCE
1345
1346 BOOL SetBrushOrg(int x, int y, LPPOINT lpPoint = NULL)
1347 {
1348 ATLASSERT(m_hDC != NULL);
1349 return ::SetBrushOrgEx(m_hDC, x, y, lpPoint);
1350 }
1351
1352 BOOL SetBrushOrg(POINT point, LPPOINT lpPointRet = NULL)
1353 {
1354 ATLASSERT(m_hDC != NULL);
1355 return ::SetBrushOrgEx(m_hDC, point.x, point.y, lpPointRet);
1356 }
1357
1358 #ifndef _WIN32_WCE
1359 int EnumObjects(int nObjectType, int (CALLBACK* lpfn)(LPVOID, LPARAM), L PARAM lpData)
1360 {
1361 ATLASSERT(m_hDC != NULL);
1362 #ifdef STRICT
1363 return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, lpD ata);
1364 #else
1365 return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, (LP VOID)lpData);
1366 #endif
1367 }
1368 #endif // !_WIN32_WCE
1369
1370 // Type-safe selection helpers
1371 HPEN SelectPen(HPEN hPen)
1372 {
1373 ATLASSERT(m_hDC != NULL);
1374 #ifndef _WIN32_WCE
1375 ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN || :: GetObjectType(hPen) == OBJ_EXTPEN);
1376 #else // CE specific
1377 ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN);
1378 #endif // _WIN32_WCE
1379 return (HPEN)::SelectObject(m_hDC, hPen);
1380 }
1381
1382 HBRUSH SelectBrush(HBRUSH hBrush)
1383 {
1384 ATLASSERT(m_hDC != NULL);
1385 ATLASSERT(hBrush == NULL || ::GetObjectType(hBrush) == OBJ_BRUSH );
1386 return (HBRUSH)::SelectObject(m_hDC, hBrush);
1387 }
1388
1389 HFONT SelectFont(HFONT hFont)
1390 {
1391 ATLASSERT(m_hDC != NULL);
1392 ATLASSERT(hFont == NULL || ::GetObjectType(hFont) == OBJ_FONT);
1393 return (HFONT)::SelectObject(m_hDC, hFont);
1394 }
1395
1396 HBITMAP SelectBitmap(HBITMAP hBitmap)
1397 {
1398 ATLASSERT(m_hDC != NULL);
1399 ATLASSERT(hBitmap == NULL || ::GetObjectType(hBitmap) == OBJ_BIT MAP);
1400 return (HBITMAP)::SelectObject(m_hDC, hBitmap);
1401 }
1402
1403 int SelectRgn(HRGN hRgn) // special return for regions
1404 {
1405 ATLASSERT(m_hDC != NULL);
1406 ATLASSERT(hRgn == NULL || ::GetObjectType(hRgn) == OBJ_REGION);
1407 return PtrToInt(::SelectObject(m_hDC, hRgn));
1408 }
1409
1410 // Type-safe selection helpers for stock objects
1411 HPEN SelectStockPen(int nPen)
1412 {
1413 ATLASSERT(m_hDC != NULL);
1414 #if (_WIN32_WINNT >= 0x0500)
1415 ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL _PEN || nPen == DC_PEN);
1416 #else
1417 ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL _PEN);
1418 #endif // !(_WIN32_WINNT >= 0x0500)
1419 return SelectPen((HPEN)::GetStockObject(nPen));
1420 }
1421
1422 HBRUSH SelectStockBrush(int nBrush)
1423 {
1424 #if (_WIN32_WINNT >= 0x0500)
1425 ATLASSERT((nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH) || n Brush == DC_BRUSH);
1426 #else
1427 ATLASSERT(nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH);
1428 #endif // !(_WIN32_WINNT >= 0x0500)
1429 return SelectBrush((HBRUSH)::GetStockObject(nBrush));
1430 }
1431
1432 HFONT SelectStockFont(int nFont)
1433 {
1434 #ifndef _WIN32_WCE
1435 ATLASSERT((nFont >= OEM_FIXED_FONT && nFont <= SYSTEM_FIXED_FONT ) || nFont == DEFAULT_GUI_FONT);
1436 #else // CE specific
1437 ATLASSERT(nFont == SYSTEM_FONT);
1438 #endif // _WIN32_WCE
1439 return SelectFont((HFONT)::GetStockObject(nFont));
1440 }
1441
1442 HPALETTE SelectStockPalette(int nPalette, BOOL bForceBackground)
1443 {
1444 ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supporte d
1445 return SelectPalette((HPALETTE)::GetStockObject(nPalette), bForc eBackground);
1446 }
1447
1448 // Color and Color Palette Functions
1449 COLORREF GetNearestColor(COLORREF crColor) const
1450 {
1451 ATLASSERT(m_hDC != NULL);
1452 return ::GetNearestColor(m_hDC, crColor);
1453 }
1454
1455 HPALETTE SelectPalette(HPALETTE hPalette, BOOL bForceBackground)
1456 {
1457 ATLASSERT(m_hDC != NULL);
1458
1459 return ::SelectPalette(m_hDC, hPalette, bForceBackground);
1460 }
1461
1462 UINT RealizePalette()
1463 {
1464 ATLASSERT(m_hDC != NULL);
1465 return ::RealizePalette(m_hDC);
1466 }
1467
1468 #ifndef _WIN32_WCE
1469 void UpdateColors()
1470 {
1471 ATLASSERT(m_hDC != NULL);
1472 ::UpdateColors(m_hDC);
1473 }
1474 #endif // !_WIN32_WCE
1475
1476 // Drawing-Attribute Functions
1477 COLORREF GetBkColor() const
1478 {
1479 ATLASSERT(m_hDC != NULL);
1480 return ::GetBkColor(m_hDC);
1481 }
1482
1483 int GetBkMode() const
1484 {
1485 ATLASSERT(m_hDC != NULL);
1486 return ::GetBkMode(m_hDC);
1487 }
1488
1489 #ifndef _WIN32_WCE
1490 int GetPolyFillMode() const
1491 {
1492 ATLASSERT(m_hDC != NULL);
1493 return ::GetPolyFillMode(m_hDC);
1494 }
1495
1496 int GetROP2() const
1497 {
1498 ATLASSERT(m_hDC != NULL);
1499 return ::GetROP2(m_hDC);
1500 }
1501
1502 int GetStretchBltMode() const
1503 {
1504 ATLASSERT(m_hDC != NULL);
1505 return ::GetStretchBltMode(m_hDC);
1506 }
1507 #endif // !_WIN32_WCE
1508
1509 COLORREF GetTextColor() const
1510 {
1511 ATLASSERT(m_hDC != NULL);
1512 return ::GetTextColor(m_hDC);
1513 }
1514
1515 COLORREF SetBkColor(COLORREF crColor)
1516 {
1517 ATLASSERT(m_hDC != NULL);
1518 return ::SetBkColor(m_hDC, crColor);
1519 }
1520
1521 int SetBkMode(int nBkMode)
1522 {
1523 ATLASSERT(m_hDC != NULL);
1524 return ::SetBkMode(m_hDC, nBkMode);
1525 }
1526
1527 #ifndef _WIN32_WCE
1528 int SetPolyFillMode(int nPolyFillMode)
1529 {
1530 ATLASSERT(m_hDC != NULL);
1531 return ::SetPolyFillMode(m_hDC, nPolyFillMode);
1532 }
1533 #endif // !_WIN32_WCE
1534
1535 int SetROP2(int nDrawMode)
1536 {
1537 ATLASSERT(m_hDC != NULL);
1538 return ::SetROP2(m_hDC, nDrawMode);
1539 }
1540
1541 #ifndef _WIN32_WCE
1542 int SetStretchBltMode(int nStretchMode)
1543 {
1544 ATLASSERT(m_hDC != NULL);
1545 return ::SetStretchBltMode(m_hDC, nStretchMode);
1546 }
1547 #endif // !_WIN32_WCE
1548
1549 COLORREF SetTextColor(COLORREF crColor)
1550 {
1551 ATLASSERT(m_hDC != NULL);
1552 return ::SetTextColor(m_hDC, crColor);
1553 }
1554
1555 #ifndef _WIN32_WCE
1556 BOOL GetColorAdjustment(LPCOLORADJUSTMENT lpColorAdjust) const
1557 {
1558 ATLASSERT(m_hDC != NULL);
1559 return ::GetColorAdjustment(m_hDC, lpColorAdjust);
1560 }
1561
1562 BOOL SetColorAdjustment(const COLORADJUSTMENT* lpColorAdjust)
1563 {
1564 ATLASSERT(m_hDC != NULL);
1565 return ::SetColorAdjustment(m_hDC, lpColorAdjust);
1566 }
1567
1568 // Mapping Functions
1569 int GetMapMode() const
1570 {
1571 ATLASSERT(m_hDC != NULL);
1572 return ::GetMapMode(m_hDC);
1573 }
1574
1575 BOOL GetViewportOrg(LPPOINT lpPoint) const
1576 {
1577 ATLASSERT(m_hDC != NULL);
1578 return ::GetViewportOrgEx(m_hDC, lpPoint);
1579 }
1580
1581 int SetMapMode(int nMapMode)
1582 {
1583 ATLASSERT(m_hDC != NULL);
1584 return ::SetMapMode(m_hDC, nMapMode);
1585 }
1586 #endif // !_WIN32_WCE
1587
1588 // Viewport Origin
1589 BOOL SetViewportOrg(int x, int y, LPPOINT lpPoint = NULL)
1590 {
1591 ATLASSERT(m_hDC != NULL);
1592 return ::SetViewportOrgEx(m_hDC, x, y, lpPoint);
1593 }
1594
1595 BOOL SetViewportOrg(POINT point, LPPOINT lpPointRet = NULL)
1596 {
1597 ATLASSERT(m_hDC != NULL);
1598 return SetViewportOrg(point.x, point.y, lpPointRet);
1599 }
1600
1601 #ifndef _WIN32_WCE
1602 BOOL OffsetViewportOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL)
1603 {
1604 ATLASSERT(m_hDC != NULL);
1605 return ::OffsetViewportOrgEx(m_hDC, nWidth, nHeight, lpPoint);
1606 }
1607
1608 // Viewport Extent
1609 BOOL GetViewportExt(LPSIZE lpSize) const
1610 {
1611 ATLASSERT(m_hDC != NULL);
1612 return ::GetViewportExtEx(m_hDC, lpSize);
1613 }
1614
1615 BOOL SetViewportExt(int x, int y, LPSIZE lpSize = NULL)
1616 {
1617 ATLASSERT(m_hDC != NULL);
1618 return ::SetViewportExtEx(m_hDC, x, y, lpSize);
1619 }
1620
1621 BOOL SetViewportExt(SIZE size, LPSIZE lpSizeRet = NULL)
1622 {
1623 ATLASSERT(m_hDC != NULL);
1624 return SetViewportExt(size.cx, size.cy, lpSizeRet);
1625 }
1626
1627 BOOL ScaleViewportExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL)
1628 {
1629 ATLASSERT(m_hDC != NULL);
1630 return ::ScaleViewportExtEx(m_hDC, xNum, xDenom, yNum, yDenom, l pSize);
1631 }
1632 #endif // !_WIN32_WCE
1633
1634 // Window Origin
1635 #ifndef _WIN32_WCE
1636 BOOL GetWindowOrg(LPPOINT lpPoint) const
1637 {
1638 ATLASSERT(m_hDC != NULL);
1639 return ::GetWindowOrgEx(m_hDC, lpPoint);
1640 }
1641
1642 BOOL SetWindowOrg(int x, int y, LPPOINT lpPoint = NULL)
1643 {
1644 ATLASSERT(m_hDC != NULL);
1645 return ::SetWindowOrgEx(m_hDC, x, y, lpPoint);
1646 }
1647
1648 BOOL SetWindowOrg(POINT point, LPPOINT lpPointRet = NULL)
1649 {
1650 ATLASSERT(m_hDC != NULL);
1651 return SetWindowOrg(point.x, point.y, lpPointRet);
1652 }
1653
1654 BOOL OffsetWindowOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL)
1655 {
1656 ATLASSERT(m_hDC != NULL);
1657 return ::OffsetWindowOrgEx(m_hDC, nWidth, nHeight, lpPoint);
1658 }
1659
1660 // Window extent
1661 BOOL GetWindowExt(LPSIZE lpSize) const
1662 {
1663 ATLASSERT(m_hDC != NULL);
1664 return ::GetWindowExtEx(m_hDC, lpSize);
1665 }
1666
1667 BOOL SetWindowExt(int x, int y, LPSIZE lpSize = NULL)
1668 {
1669 ATLASSERT(m_hDC != NULL);
1670 return ::SetWindowExtEx(m_hDC, x, y, lpSize);
1671 }
1672
1673 BOOL SetWindowExt(SIZE size, LPSIZE lpSizeRet = NULL)
1674 {
1675 ATLASSERT(m_hDC != NULL);
1676 return SetWindowExt(size.cx, size.cy, lpSizeRet);
1677 }
1678
1679 BOOL ScaleWindowExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE l pSize = NULL)
1680 {
1681 ATLASSERT(m_hDC != NULL);
1682 return ::ScaleWindowExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpS ize);
1683 }
1684
1685 // Coordinate Functions
1686 BOOL DPtoLP(LPPOINT lpPoints, int nCount = 1) const
1687 {
1688 ATLASSERT(m_hDC != NULL);
1689 return ::DPtoLP(m_hDC, lpPoints, nCount);
1690 }
1691
1692 BOOL DPtoLP(LPRECT lpRect) const
1693 {
1694 ATLASSERT(m_hDC != NULL);
1695 return ::DPtoLP(m_hDC, (LPPOINT)lpRect, 2);
1696 }
1697
1698 BOOL DPtoLP(LPSIZE lpSize) const
1699 {
1700 SIZE sizeWinExt = { 0, 0 };
1701 if(!GetWindowExt(&sizeWinExt))
1702 return FALSE;
1703 SIZE sizeVpExt = { 0, 0 };
1704 if(!GetViewportExt(&sizeVpExt))
1705 return FALSE;
1706 lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeWinExt.cx), abs(sizeVp Ext.cx));
1707 lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeWinExt.cy), abs(sizeVp Ext.cy));
1708 return TRUE;
1709 }
1710
1711 BOOL LPtoDP(LPPOINT lpPoints, int nCount = 1) const
1712 {
1713 ATLASSERT(m_hDC != NULL);
1714 return ::LPtoDP(m_hDC, lpPoints, nCount);
1715 }
1716
1717 BOOL LPtoDP(LPRECT lpRect) const
1718 {
1719 ATLASSERT(m_hDC != NULL);
1720 return ::LPtoDP(m_hDC, (LPPOINT)lpRect, 2);
1721 }
1722
1723 BOOL LPtoDP(LPSIZE lpSize) const
1724 {
1725 SIZE sizeWinExt = { 0, 0 };
1726 if(!GetWindowExt(&sizeWinExt))
1727 return FALSE;
1728 SIZE sizeVpExt = { 0, 0 };
1729 if(!GetViewportExt(&sizeVpExt))
1730 return FALSE;
1731 lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeVpExt.cx), abs(sizeWin Ext.cx));
1732 lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeVpExt.cy), abs(sizeWin Ext.cy));
1733 return TRUE;
1734 }
1735
1736 // Special Coordinate Functions (useful for dealing with metafiles and OLE)
1737 #define HIMETRIC_INCH 2540 // HIMETRIC units per inch
1738
1739 void DPtoHIMETRIC(LPSIZE lpSize) const
1740 {
1741 ATLASSERT(m_hDC != NULL);
1742 int nMapMode;
1743 if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TE XT)
1744 {
1745 // when using a constrained map mode, map against physic al inch
1746 ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC);
1747 DPtoLP(lpSize);
1748 ((CDCHandle*)this)->SetMapMode(nMapMode);
1749 }
1750 else
1751 {
1752 // map against logical inch for non-constrained mapping modes
1753 int cxPerInch = GetDeviceCaps(LOGPIXELSX);
1754 int cyPerInch = GetDeviceCaps(LOGPIXELSY);
1755 ATLASSERT(cxPerInch != 0 && cyPerInch != 0);
1756 lpSize->cx = ::MulDiv(lpSize->cx, HIMETRIC_INCH, cxPerIn ch);
1757 lpSize->cy = ::MulDiv(lpSize->cy, HIMETRIC_INCH, cyPerIn ch);
1758 }
1759 }
1760
1761 void HIMETRICtoDP(LPSIZE lpSize) const
1762 {
1763 ATLASSERT(m_hDC != NULL);
1764 int nMapMode;
1765 if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TE XT)
1766 {
1767 // when using a constrained map mode, map against physic al inch
1768 ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC);
1769 LPtoDP(lpSize);
1770 ((CDCHandle*)this)->SetMapMode(nMapMode);
1771 }
1772 else
1773 {
1774 // map against logical inch for non-constrained mapping modes
1775 int cxPerInch = GetDeviceCaps(LOGPIXELSX);
1776 int cyPerInch = GetDeviceCaps(LOGPIXELSY);
1777 ATLASSERT(cxPerInch != 0 && cyPerInch != 0);
1778 lpSize->cx = ::MulDiv(lpSize->cx, cxPerInch, HIMETRIC_IN CH);
1779 lpSize->cy = ::MulDiv(lpSize->cy, cyPerInch, HIMETRIC_IN CH);
1780 }
1781 }
1782
1783 void LPtoHIMETRIC(LPSIZE lpSize) const
1784 {
1785 LPtoDP(lpSize);
1786 DPtoHIMETRIC(lpSize);
1787 }
1788
1789 void HIMETRICtoLP(LPSIZE lpSize) const
1790 {
1791 HIMETRICtoDP(lpSize);
1792 DPtoLP(lpSize);
1793 }
1794 #endif // !_WIN32_WCE
1795
1796 // Region Functions
1797 BOOL FillRgn(HRGN hRgn, HBRUSH hBrush)
1798 {
1799 ATLASSERT(m_hDC != NULL);
1800 return ::FillRgn(m_hDC, hRgn, hBrush);
1801 }
1802
1803 #ifndef _WIN32_WCE
1804 BOOL FrameRgn(HRGN hRgn, HBRUSH hBrush, int nWidth, int nHeight)
1805 {
1806 ATLASSERT(m_hDC != NULL);
1807 return ::FrameRgn(m_hDC, hRgn, hBrush, nWidth, nHeight);
1808 }
1809
1810 BOOL InvertRgn(HRGN hRgn)
1811 {
1812 ATLASSERT(m_hDC != NULL);
1813 return ::InvertRgn(m_hDC, hRgn);
1814 }
1815
1816 BOOL PaintRgn(HRGN hRgn)
1817 {
1818 ATLASSERT(m_hDC != NULL);
1819 return ::PaintRgn(m_hDC, hRgn);
1820 }
1821 #endif // !_WIN32_WCE
1822
1823 // Clipping Functions
1824 int GetClipBox(LPRECT lpRect) const
1825 {
1826 ATLASSERT(m_hDC != NULL);
1827 return ::GetClipBox(m_hDC, lpRect);
1828 }
1829
1830 int GetClipRgn(CRgn& region) const
1831 {
1832 ATLASSERT(m_hDC != NULL);
1833 if(region.IsNull())
1834 region.CreateRectRgn(0, 0, 0, 0);
1835
1836 int nRet = ::GetClipRgn(m_hDC, region);
1837 if(nRet != 1)
1838 region.DeleteObject();
1839
1840 return nRet;
1841 }
1842
1843 #ifndef _WIN32_WCE
1844 BOOL PtVisible(int x, int y) const
1845 {
1846 ATLASSERT(m_hDC != NULL);
1847 return ::PtVisible(m_hDC, x, y);
1848 }
1849
1850 BOOL PtVisible(POINT point) const
1851 {
1852 ATLASSERT(m_hDC != NULL);
1853 return ::PtVisible(m_hDC, point.x, point.y);
1854 }
1855 #endif // !_WIN32_WCE
1856
1857 BOOL RectVisible(LPCRECT lpRect) const
1858 {
1859 ATLASSERT(m_hDC != NULL);
1860 return ::RectVisible(m_hDC, lpRect);
1861 }
1862
1863 int SelectClipRgn(HRGN hRgn)
1864 {
1865 ATLASSERT(m_hDC != NULL);
1866 return ::SelectClipRgn(m_hDC, (HRGN)hRgn);
1867 }
1868
1869 int ExcludeClipRect(int x1, int y1, int x2, int y2)
1870 {
1871 ATLASSERT(m_hDC != NULL);
1872 return ::ExcludeClipRect(m_hDC, x1, y1, x2, y2);
1873 }
1874
1875 int ExcludeClipRect(LPCRECT lpRect)
1876 {
1877 ATLASSERT(m_hDC != NULL);
1878 return ::ExcludeClipRect(m_hDC, lpRect->left, lpRect->top, lpRec t->right, lpRect->bottom);
1879 }
1880
1881 #ifndef _WIN32_WCE
1882 int ExcludeUpdateRgn(HWND hWnd)
1883 {
1884 ATLASSERT(m_hDC != NULL);
1885 return ::ExcludeUpdateRgn(m_hDC, hWnd);
1886 }
1887 #endif // !_WIN32_WCE
1888
1889 int IntersectClipRect(int x1, int y1, int x2, int y2)
1890 {
1891 ATLASSERT(m_hDC != NULL);
1892 return ::IntersectClipRect(m_hDC, x1, y1, x2, y2);
1893 }
1894
1895 int IntersectClipRect(LPCRECT lpRect)
1896 {
1897 ATLASSERT(m_hDC != NULL);
1898 return ::IntersectClipRect(m_hDC, lpRect->left, lpRect->top, lpR ect->right, lpRect->bottom);
1899 }
1900
1901 #ifndef _WIN32_WCE
1902 int OffsetClipRgn(int x, int y)
1903 {
1904 ATLASSERT(m_hDC != NULL);
1905 return ::OffsetClipRgn(m_hDC, x, y);
1906 }
1907
1908 int OffsetClipRgn(SIZE size)
1909 {
1910 ATLASSERT(m_hDC != NULL);
1911 return ::OffsetClipRgn(m_hDC, size.cx, size.cy);
1912 }
1913
1914 int SelectClipRgn(HRGN hRgn, int nMode)
1915 {
1916 ATLASSERT(m_hDC != NULL);
1917 return ::ExtSelectClipRgn(m_hDC, hRgn, nMode);
1918 }
1919 #endif // !_WIN32_WCE
1920
1921 // Line-Output Functions
1922 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
1923 BOOL GetCurrentPosition(LPPOINT lpPoint) const
1924 {
1925 ATLASSERT(m_hDC != NULL);
1926 return ::GetCurrentPositionEx(m_hDC, lpPoint);
1927 }
1928
1929 BOOL MoveTo(int x, int y, LPPOINT lpPoint = NULL)
1930 {
1931 ATLASSERT(m_hDC != NULL);
1932 return ::MoveToEx(m_hDC, x, y, lpPoint);
1933 }
1934
1935 BOOL MoveTo(POINT point, LPPOINT lpPointRet = NULL)
1936 {
1937 ATLASSERT(m_hDC != NULL);
1938 return MoveTo(point.x, point.y, lpPointRet);
1939 }
1940
1941 BOOL LineTo(int x, int y)
1942 {
1943 ATLASSERT(m_hDC != NULL);
1944 return ::LineTo(m_hDC, x, y);
1945 }
1946
1947 BOOL LineTo(POINT point)
1948 {
1949 ATLASSERT(m_hDC != NULL);
1950 return LineTo(point.x, point.y);
1951 }
1952 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
1953
1954 #ifndef _WIN32_WCE
1955 BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
1956 {
1957 ATLASSERT(m_hDC != NULL);
1958 return ::Arc(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);
1959 }
1960
1961 BOOL Arc(LPCRECT lpRect, POINT ptStart, POINT ptEnd)
1962 {
1963 ATLASSERT(m_hDC != NULL);
1964 return ::Arc(m_hDC, lpRect->left, lpRect->top,
1965 lpRect->right, lpRect->bottom, ptStart.x, ptStart.y,
1966 ptEnd.x, ptEnd.y);
1967 }
1968 #endif // !_WIN32_WCE
1969
1970 BOOL Polyline(LPPOINT lpPoints, int nCount)
1971 {
1972 ATLASSERT(m_hDC != NULL);
1973 return ::Polyline(m_hDC, lpPoints, nCount);
1974 }
1975
1976 #ifndef _WIN32_WCE
1977 BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweep Angle)
1978 {
1979 ATLASSERT(m_hDC != NULL);
1980 return ::AngleArc(m_hDC, x, y, nRadius, fStartAngle, fSweepAngle );
1981 }
1982
1983 BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y 4)
1984 {
1985 ATLASSERT(m_hDC != NULL);
1986 return ::ArcTo(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);
1987 }
1988
1989 BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd)
1990 {
1991 ATLASSERT(m_hDC != NULL);
1992 return ArcTo(lpRect->left, lpRect->top, lpRect->right,
1993 lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);
1994 }
1995
1996 int GetArcDirection() const
1997 {
1998 ATLASSERT(m_hDC != NULL);
1999 return ::GetArcDirection(m_hDC);
2000 }
2001
2002 int SetArcDirection(int nArcDirection)
2003 {
2004 ATLASSERT(m_hDC != NULL);
2005 return ::SetArcDirection(m_hDC, nArcDirection);
2006 }
2007
2008 BOOL PolyDraw(const POINT* lpPoints, const BYTE* lpTypes, int nCount)
2009 {
2010 ATLASSERT(m_hDC != NULL);
2011 return ::PolyDraw(m_hDC, lpPoints, lpTypes, nCount);
2012 }
2013
2014 BOOL PolylineTo(const POINT* lpPoints, int nCount)
2015 {
2016 ATLASSERT(m_hDC != NULL);
2017 return ::PolylineTo(m_hDC, lpPoints, nCount);
2018 }
2019
2020 BOOL PolyPolyline(const POINT* lpPoints,
2021 const DWORD* lpPolyPoints, int nCount)
2022 {
2023 ATLASSERT(m_hDC != NULL);
2024 return ::PolyPolyline(m_hDC, lpPoints, lpPolyPoints, nCount);
2025 }
2026
2027 BOOL PolyBezier(const POINT* lpPoints, int nCount)
2028 {
2029 ATLASSERT(m_hDC != NULL);
2030 return ::PolyBezier(m_hDC, lpPoints, nCount);
2031 }
2032
2033 BOOL PolyBezierTo(const POINT* lpPoints, int nCount)
2034 {
2035 ATLASSERT(m_hDC != NULL);
2036 return ::PolyBezierTo(m_hDC, lpPoints, nCount);
2037 }
2038 #endif // !_WIN32_WCE
2039
2040 // Simple Drawing Functions
2041 BOOL FillRect(LPCRECT lpRect, HBRUSH hBrush)
2042 {
2043 ATLASSERT(m_hDC != NULL);
2044 return ::FillRect(m_hDC, lpRect, hBrush);
2045 }
2046
2047 BOOL FillRect(LPCRECT lpRect, int nColorIndex)
2048 {
2049 ATLASSERT(m_hDC != NULL);
2050 #ifndef _WIN32_WCE
2051 return ::FillRect(m_hDC, lpRect, (HBRUSH)LongToPtr(nColorIndex + 1));
2052 #else // CE specific
2053 return ::FillRect(m_hDC, lpRect, ::GetSysColorBrush(nColorIndex) );
2054 #endif // _WIN32_WCE
2055 }
2056
2057 #ifndef _WIN32_WCE
2058 BOOL FrameRect(LPCRECT lpRect, HBRUSH hBrush)
2059 {
2060 ATLASSERT(m_hDC != NULL);
2061 return ::FrameRect(m_hDC, lpRect, hBrush);
2062 }
2063 #endif // !_WIN32_WCE
2064
2065 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)
2066 BOOL InvertRect(LPCRECT lpRect)
2067 {
2068 ATLASSERT(m_hDC != NULL);
2069 return ::InvertRect(m_hDC, lpRect);
2070 }
2071 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)
2072
2073 BOOL DrawIcon(int x, int y, HICON hIcon)
2074 {
2075 ATLASSERT(m_hDC != NULL);
2076 #ifndef _WIN32_WCE
2077 return ::DrawIcon(m_hDC, x, y, hIcon);
2078 #else // CE specific
2079 return ::DrawIconEx(m_hDC, x, y, hIcon, 0, 0, 0, NULL, DI_NORMAL );
2080 #endif // _WIN32_WCE
2081 }
2082
2083 BOOL DrawIcon(POINT point, HICON hIcon)
2084 {
2085 ATLASSERT(m_hDC != NULL);
2086 #ifndef _WIN32_WCE
2087 return ::DrawIcon(m_hDC, point.x, point.y, hIcon);
2088 #else // CE specific
2089 return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, 0, 0, 0, NUL L, DI_NORMAL);
2090 #endif // _WIN32_WCE
2091 }
2092
2093 BOOL DrawIconEx(int x, int y, HICON hIcon, int cxWidth, int cyWidth, UIN T uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)
2094 {
2095 ATLASSERT(m_hDC != NULL);
2096 return ::DrawIconEx(m_hDC, x, y, hIcon, cxWidth, cyWidth, uStepI fAniCur, hbrFlickerFreeDraw, uFlags);
2097 }
2098
2099 BOOL DrawIconEx(POINT point, HICON hIcon, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)
2100 {
2101 ATLASSERT(m_hDC != NULL);
2102 return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, size.cx, siz e.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags);
2103 }
2104
2105 #ifndef _WIN32_WCE
2106 BOOL DrawState(POINT pt, SIZE size, HBITMAP hBitmap, UINT nFlags, HBRUSH hBrush = NULL)
2107 {
2108 ATLASSERT(m_hDC != NULL);
2109 return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hBitmap, 0, pt.x , pt.y, size.cx, size.cy, nFlags | DST_BITMAP);
2110 }
2111
2112 BOOL DrawState(POINT pt, SIZE size, HICON hIcon, UINT nFlags, HBRUSH hBr ush = NULL)
2113 {
2114 ATLASSERT(m_hDC != NULL);
2115 return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hIcon, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_ICON);
2116 }
2117
2118 BOOL DrawState(POINT pt, SIZE size, LPCTSTR lpszText, UINT nFlags, BOOL bPrefixText = TRUE, int nTextLen = 0, HBRUSH hBrush = NULL)
2119 {
2120 ATLASSERT(m_hDC != NULL);
2121 return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)lpszText, (WPARA M)nTextLen, pt.x, pt.y, size.cx, size.cy, nFlags | (bPrefixText ? DST_PREFIXTEXT : DST_TEXT));
2122 }
2123
2124 BOOL DrawState(POINT pt, SIZE size, DRAWSTATEPROC lpDrawProc, LPARAM lDa ta, UINT nFlags, HBRUSH hBrush = NULL)
2125 {
2126 ATLASSERT(m_hDC != NULL);
2127 return ::DrawState(m_hDC, hBrush, lpDrawProc, lData, 0, pt.x, pt .y, size.cx, size.cy, nFlags | DST_COMPLEX);
2128 }
2129 #endif // !_WIN32_WCE
2130
2131 // Ellipse and Polygon Functions
2132 #ifndef _WIN32_WCE
2133 BOOL Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y 4)
2134 {
2135 ATLASSERT(m_hDC != NULL);
2136 return ::Chord(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);
2137 }
2138
2139 BOOL Chord(LPCRECT lpRect, POINT ptStart, POINT ptEnd)
2140 {
2141 ATLASSERT(m_hDC != NULL);
2142 return ::Chord(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);
2143 }
2144 #endif // !_WIN32_WCE
2145
2146 void DrawFocusRect(LPCRECT lpRect)
2147 {
2148 ATLASSERT(m_hDC != NULL);
2149 ::DrawFocusRect(m_hDC, lpRect);
2150 }
2151
2152 BOOL Ellipse(int x1, int y1, int x2, int y2)
2153 {
2154 ATLASSERT(m_hDC != NULL);
2155 return ::Ellipse(m_hDC, x1, y1, x2, y2);
2156 }
2157
2158 BOOL Ellipse(LPCRECT lpRect)
2159 {
2160 ATLASSERT(m_hDC != NULL);
2161 return ::Ellipse(m_hDC, lpRect->left, lpRect->top, lpRect->right , lpRect->bottom);
2162 }
2163
2164 #ifndef _WIN32_WCE
2165 BOOL Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
2166 {
2167 ATLASSERT(m_hDC != NULL);
2168 return ::Pie(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);
2169 }
2170
2171 BOOL Pie(LPCRECT lpRect, POINT ptStart, POINT ptEnd)
2172 {
2173 ATLASSERT(m_hDC != NULL);
2174 return ::Pie(m_hDC, lpRect->left, lpRect->top, lpRect->right, lp Rect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);
2175 }
2176 #endif // !_WIN32_WCE
2177
2178 BOOL Polygon(LPPOINT lpPoints, int nCount)
2179 {
2180 ATLASSERT(m_hDC != NULL);
2181 return ::Polygon(m_hDC, lpPoints, nCount);
2182 }
2183
2184 #ifndef _WIN32_WCE
2185 BOOL PolyPolygon(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount)
2186 {
2187 ATLASSERT(m_hDC != NULL);
2188 return ::PolyPolygon(m_hDC, lpPoints, lpPolyCounts, nCount);
2189 }
2190 #endif // !_WIN32_WCE
2191
2192 BOOL Rectangle(int x1, int y1, int x2, int y2)
2193 {
2194 ATLASSERT(m_hDC != NULL);
2195 return ::Rectangle(m_hDC, x1, y1, x2, y2);
2196 }
2197
2198 BOOL Rectangle(LPCRECT lpRect)
2199 {
2200 ATLASSERT(m_hDC != NULL);
2201 return ::Rectangle(m_hDC, lpRect->left, lpRect->top, lpRect->rig ht, lpRect->bottom);
2202 }
2203
2204 BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3)
2205 {
2206 ATLASSERT(m_hDC != NULL);
2207 return ::RoundRect(m_hDC, x1, y1, x2, y2, x3, y3);
2208 }
2209
2210 BOOL RoundRect(LPCRECT lpRect, POINT point)
2211 {
2212 ATLASSERT(m_hDC != NULL);
2213 return ::RoundRect(m_hDC, lpRect->left, lpRect->top, lpRect->rig ht, lpRect->bottom, point.x, point.y);
2214 }
2215
2216 // Bitmap Functions
2217 BOOL PatBlt(int x, int y, int nWidth, int nHeight, DWORD dwRop)
2218 {
2219 ATLASSERT(m_hDC != NULL);
2220 return ::PatBlt(m_hDC, x, y, nWidth, nHeight, dwRop);
2221 }
2222
2223 BOOL BitBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC,
2224 int xSrc, int ySrc, DWORD dwRop)
2225 {
2226 ATLASSERT(m_hDC != NULL);
2227 return ::BitBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc , dwRop);
2228 }
2229
2230 BOOL StretchBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int x Src, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop)
2231 {
2232 ATLASSERT(m_hDC != NULL);
2233 return ::StretchBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, dwRop);
2234 }
2235
2236 COLORREF GetPixel(int x, int y) const
2237 {
2238 ATLASSERT(m_hDC != NULL);
2239 return ::GetPixel(m_hDC, x, y);
2240 }
2241
2242 COLORREF GetPixel(POINT point) const
2243 {
2244 ATLASSERT(m_hDC != NULL);
2245 return ::GetPixel(m_hDC, point.x, point.y);
2246 }
2247
2248 COLORREF SetPixel(int x, int y, COLORREF crColor)
2249 {
2250 ATLASSERT(m_hDC != NULL);
2251 return ::SetPixel(m_hDC, x, y, crColor);
2252 }
2253
2254 COLORREF SetPixel(POINT point, COLORREF crColor)
2255 {
2256 ATLASSERT(m_hDC != NULL);
2257 return ::SetPixel(m_hDC, point.x, point.y, crColor);
2258 }
2259
2260 #ifndef _WIN32_WCE
2261 BOOL FloodFill(int x, int y, COLORREF crColor)
2262 {
2263 ATLASSERT(m_hDC != NULL);
2264 return ::FloodFill(m_hDC, x, y, crColor);
2265 }
2266
2267 BOOL ExtFloodFill(int x, int y, COLORREF crColor, UINT nFillType)
2268 {
2269 ATLASSERT(m_hDC != NULL);
2270 return ::ExtFloodFill(m_hDC, x, y, crColor, nFillType);
2271 }
2272 #endif // !_WIN32_WCE
2273
2274 BOOL MaskBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc , int ySrc, HBITMAP hMaskBitmap, int xMask, int yMask, DWORD dwRop)
2275 {
2276 ATLASSERT(m_hDC != NULL);
2277 return ::MaskBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySr c, hMaskBitmap, xMask, yMask, dwRop);
2278 }
2279
2280 #ifndef _WIN32_WCE
2281 BOOL PlgBlt(LPPOINT lpPoint, HDC hSrcDC, int xSrc, int ySrc, int nWidth, int nHeight, HBITMAP hMaskBitmap, int xMask, int yMask)
2282 {
2283 ATLASSERT(m_hDC != NULL);
2284 return ::PlgBlt(m_hDC, lpPoint, hSrcDC, xSrc, ySrc, nWidth, nHei ght, hMaskBitmap, xMask, yMask);
2285 }
2286
2287 BOOL SetPixelV(int x, int y, COLORREF crColor)
2288 {
2289 ATLASSERT(m_hDC != NULL);
2290 return ::SetPixelV(m_hDC, x, y, crColor);
2291 }
2292
2293 BOOL SetPixelV(POINT point, COLORREF crColor)
2294 {
2295 ATLASSERT(m_hDC != NULL);
2296 return ::SetPixelV(m_hDC, point.x, point.y, crColor);
2297 }
2298 #endif // !_WIN32_WCE
2299
2300 #if !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE)
2301 #ifndef _WIN32_WCE
2302 BOOL TransparentBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, i nt xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent)
2303 {
2304 ATLASSERT(m_hDC != NULL);
2305 return ::TransparentBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xS rc, ySrc, nSrcWidth, nSrcHeight, crTransparent);
2306 }
2307 #else // CE specific
2308 BOOL TransparentImage(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent)
2309 {
2310 ATLASSERT(m_hDC != NULL);
2311 return ::TransparentImage(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent);
2312 }
2313 #endif // _WIN32_WCE
2314
2315 #if (!defined(_WIN32_WCE) || (_WIN32_WCE >= 420))
2316 BOOL GradientFill(const PTRIVERTEX pVertices, DWORD nVertices, void* pMe shElements, DWORD nMeshElements, DWORD dwMode)
2317 {
2318 ATLASSERT(m_hDC != NULL);
2319 return ::GradientFill(m_hDC, pVertices, nVertices, pMeshElements , nMeshElements, dwMode);
2320 }
2321 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)
2322
2323 #if !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500)
2324 BOOL AlphaBlend(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int x Src, int ySrc, int nSrcWidth, int nSrcHeight, BLENDFUNCTION bf)
2325 {
2326 ATLASSERT(m_hDC != NULL);
2327 return ::AlphaBlend(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, bf);
2328 }
2329 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500)
2330 #endif // !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE)
2331
2332 // Extra bitmap functions
2333 // Helper function for painting a disabled toolbar or menu bitmap
2334 // This function can take either an HBITMAP (for SS) or a DC with
2335 // the bitmap already painted (for cmdbar)
2336 BOOL DitherBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, HBITMA P hBitmap, int xSrc, int ySrc,
2337 HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFAC E),
2338 HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIG HT),
2339 HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3D SHADOW))
2340 {
2341 ATLASSERT(m_hDC != NULL || hBitmap != NULL);
2342 ATLASSERT(nWidth > 0 && nHeight > 0);
2343
2344 // Create a generic DC for all BitBlts
2345 CDCHandle dc = (hSrcDC != NULL) ? hSrcDC : ::CreateCompatibleDC( m_hDC);
2346 ATLASSERT(dc.m_hDC != NULL);
2347 if(dc.m_hDC == NULL)
2348 return FALSE;
2349
2350 // Create a DC for the monochrome DIB section
2351 CDC dcBW = ::CreateCompatibleDC(m_hDC);
2352 ATLASSERT(dcBW.m_hDC != NULL);
2353 if(dcBW.m_hDC == NULL)
2354 {
2355 if(hSrcDC == NULL)
2356 dc.DeleteDC();
2357 return FALSE;
2358 }
2359
2360 // Create the monochrome DIB section with a black and white pale tte
2361 struct RGBBWBITMAPINFO
2362 {
2363 BITMAPINFOHEADER bmiHeader;
2364 RGBQUAD bmiColors[2];
2365 };
2366
2367 RGBBWBITMAPINFO rgbBWBitmapInfo =
2368 {
2369 { sizeof(BITMAPINFOHEADER), nWidth, nHeight, 1, 1, BI_RG B, 0, 0, 0, 0, 0 },
2370 { { 0x00, 0x00, 0x00, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x00 } }
2371 };
2372
2373 VOID* pbitsBW;
2374 CBitmap bmpBW = ::CreateDIBSection(dcBW, (LPBITMAPINFO)&rgbBWBit mapInfo, DIB_RGB_COLORS, &pbitsBW, NULL, 0);
2375 ATLASSERT(bmpBW.m_hBitmap != NULL);
2376 if(bmpBW.m_hBitmap == NULL)
2377 {
2378 if(hSrcDC == NULL)
2379 dc.DeleteDC();
2380 return FALSE;
2381 }
2382
2383 // Attach the monochrome DIB section and the bitmap to the DCs
2384 HBITMAP hbmOldBW = dcBW.SelectBitmap(bmpBW);
2385 HBITMAP hbmOldDC = NULL;
2386 if(hBitmap != NULL)
2387 hbmOldDC = dc.SelectBitmap(hBitmap);
2388
2389 // Block: Dark gray removal: we want (128, 128, 128) pixels to b ecome black and not white
2390 {
2391 CDC dcTemp1 = ::CreateCompatibleDC(m_hDC);
2392 CDC dcTemp2 = ::CreateCompatibleDC(m_hDC);
2393 CBitmap bmpTemp1;
2394 bmpTemp1.CreateCompatibleBitmap(dc, nWidth, nHeight);
2395 CBitmap bmpTemp2;
2396 bmpTemp2.CreateBitmap(nWidth, nHeight, 1, 1, NULL);
2397 HBITMAP hOldBmp1 = dcTemp1.SelectBitmap(bmpTemp1);
2398 HBITMAP hOldBmp2 = dcTemp2.SelectBitmap(bmpTemp2);
2399 // Let's copy our image, it will be altered
2400 dcTemp1.BitBlt(0, 0, nWidth, nHeight, dc, xSrc, ySrc, SR CCOPY);
2401
2402 // All dark gray pixels will become white, the others bl ack
2403 dcTemp1.SetBkColor(RGB(128, 128, 128));
2404 dcTemp2.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRC COPY);
2405 // Do an XOR to set to black these white pixels
2406 dcTemp1.BitBlt(0, 0, nWidth, nHeight, dcTemp2, 0, 0, SRC INVERT);
2407
2408 // BitBlt the bitmap into the monochrome DIB section
2409 // The DIB section will do a true monochrome conversion
2410 // The magenta background being closer to white will bec ome white
2411 dcBW.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOP Y);
2412
2413 // Cleanup
2414 dcTemp1.SelectBitmap(hOldBmp1);
2415 dcTemp2.SelectBitmap(hOldBmp2);
2416 }
2417
2418 // Paint the destination rectangle using hBrushBackground
2419 if(hBrushBackground != NULL)
2420 {
2421 RECT rc = { x, y, x + nWidth, y + nHeight };
2422 FillRect(&rc, hBrushBackground);
2423 }
2424
2425 // BitBlt the black bits in the monochrome bitmap into hBrush3DE ffect color in the destination DC
2426 // The magic ROP comes from the Charles Petzold's book
2427 HBRUSH hOldBrush = SelectBrush(hBrush3DEffect);
2428 BitBlt(x + 1, y + 1, nWidth, nHeight, dcBW, 0, 0, 0xB8074A);
2429
2430 // BitBlt the black bits in the monochrome bitmap into hBrushDis abledImage color in the destination DC
2431 SelectBrush(hBrushDisabledImage);
2432 BitBlt(x, y, nWidth, nHeight, dcBW, 0, 0, 0xB8074A);
2433
2434 SelectBrush(hOldBrush);
2435 dcBW.SelectBitmap(hbmOldBW);
2436 dc.SelectBitmap(hbmOldDC);
2437
2438 if(hSrcDC == NULL)
2439 dc.DeleteDC();
2440
2441 return TRUE;
2442 }
2443
2444 // Text Functions
2445 #ifndef _WIN32_WCE
2446 BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount = -1)
2447 {
2448 ATLASSERT(m_hDC != NULL);
2449 if(nCount == -1)
2450 nCount = lstrlen(lpszString);
2451 return ::TextOut(m_hDC, x, y, lpszString, nCount);
2452 }
2453 #endif // !_WIN32_WCE
2454
2455 BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lps zString, UINT nCount = -1, LPINT lpDxWidths = NULL)
2456 {
2457 ATLASSERT(m_hDC != NULL);
2458 if(nCount == -1)
2459 nCount = lstrlen(lpszString);
2460 return ::ExtTextOut(m_hDC, x, y, nOptions, lpRect, lpszString, n Count, lpDxWidths);
2461 }
2462
2463 #ifndef _WIN32_WCE
2464 SIZE TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount = -1, in t nTabPositions = 0, LPINT lpnTabStopPositions = NULL, int nTabOrigin = 0)
2465 {
2466 ATLASSERT(m_hDC != NULL);
2467 if(nCount == -1)
2468 nCount = lstrlen(lpszString);
2469 LONG lRes = ::TabbedTextOut(m_hDC, x, y, lpszString, nCount, nTa bPositions, lpnTabStopPositions, nTabOrigin);
2470 SIZE size = { GET_X_LPARAM(lRes), GET_Y_LPARAM(lRes) };
2471 return size;
2472 }
2473 #endif // !_WIN32_WCE
2474
2475 int DrawText(LPCTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat )
2476 {
2477 ATLASSERT(m_hDC != NULL);
2478 #ifndef _WIN32_WCE
2479 ATLASSERT((uFormat & DT_MODIFYSTRING) == 0);
2480 #endif // !_WIN32_WCE
2481 return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat);
2482 }
2483
2484 int DrawText(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat)
2485 {
2486 ATLASSERT(m_hDC != NULL);
2487 return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat);
2488 }
2489
2490 #ifndef _WIN32_WCE
2491 int DrawTextEx(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uForma t, LPDRAWTEXTPARAMS lpDTParams = NULL)
2492 {
2493 ATLASSERT(m_hDC != NULL);
2494 return ::DrawTextEx(m_hDC, lpstrText, cchText, lpRect, uFormat, lpDTParams);
2495 }
2496 #endif // !_WIN32_WCE
2497
2498 #if (_WIN32_WINNT >= 0x0501)
2499 int DrawShadowText(LPCWSTR lpstrText, int cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset)
2500 {
2501 ATLASSERT(m_hDC != NULL);
2502 // This function is present only if comctl32.dll version 6 is lo aded;
2503 // we use LoadLibrary/GetProcAddress to allow apps compiled with
2504 // _WIN32_WINNT >= 0x0501 to run on older Windows/CommCtrl
2505 int nRet = 0;
2506 HMODULE hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll"));
2507 ATLASSERT(hCommCtrlDLL != NULL);
2508 if(hCommCtrlDLL != NULL)
2509 {
2510 typedef int (WINAPI *PFN_DrawShadowText)(HDC hDC, LPCWST R lpstrText, UINT cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLOR REF clrShadow, int xOffset, int yOffset);
2511 PFN_DrawShadowText pfnDrawShadowText = (PFN_DrawShadowTe xt)::GetProcAddress(hCommCtrlDLL, "DrawShadowText");
2512 ATLASSERT(pfnDrawShadowText != NULL); // this function requires CommCtrl6
2513 if(pfnDrawShadowText != NULL)
2514 nRet = pfnDrawShadowText(m_hDC, lpstrText, cchTe xt, lpRect, dwFlags, clrText, clrShadow, xOffset, yOffset);
2515 ::FreeLibrary(hCommCtrlDLL);
2516 }
2517 return nRet;
2518 }
2519 #endif // (_WIN32_WINNT >= 0x0501)
2520
2521 BOOL GetTextExtent(LPCTSTR lpszString, int nCount, LPSIZE lpSize) const
2522 {
2523 ATLASSERT(m_hDC != NULL);
2524 if(nCount == -1)
2525 nCount = lstrlen(lpszString);
2526 return ::GetTextExtentPoint32(m_hDC, lpszString, nCount, lpSize) ;
2527 }
2528
2529 BOOL GetTextExtentExPoint(LPCTSTR lpszString, int cchString, LPSIZE lpSi ze, int nMaxExtent, LPINT lpnFit = NULL, LPINT alpDx = NULL)
2530 {
2531 ATLASSERT(m_hDC != NULL);
2532 return ::GetTextExtentExPoint(m_hDC, lpszString, cchString, nMax Extent, lpnFit, alpDx, lpSize);
2533 }
2534
2535 #ifndef _WIN32_WCE
2536 DWORD GetTabbedTextExtent(LPCTSTR lpszString, int nCount = -1, int nTabP ositions = 0, LPINT lpnTabStopPositions = NULL) const
2537 {
2538 ATLASSERT(m_hDC != NULL);
2539 if(nCount == -1)
2540 nCount = lstrlen(lpszString);
2541 return ::GetTabbedTextExtent(m_hDC, lpszString, nCount, nTabPosi tions, lpnTabStopPositions);
2542 }
2543
2544 BOOL GrayString(HBRUSH hBrush, BOOL (CALLBACK* lpfnOutput)(HDC, LPARAM, int), LPARAM lpData, int nCount, int x, int y, int nWidth, int nHeight)
2545 {
2546 ATLASSERT(m_hDC != NULL);
2547 return ::GrayString(m_hDC, hBrush, (GRAYSTRINGPROC)lpfnOutput, l pData, nCount, x, y, nWidth, nHeight);
2548 }
2549 #endif // !_WIN32_WCE
2550
2551 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
2552 UINT GetTextAlign() const
2553 {
2554 ATLASSERT(m_hDC != NULL);
2555 return ::GetTextAlign(m_hDC);
2556 }
2557
2558 UINT SetTextAlign(UINT nFlags)
2559 {
2560 ATLASSERT(m_hDC != NULL);
2561 return ::SetTextAlign(m_hDC, nFlags);
2562 }
2563 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
2564
2565 int GetTextFace(LPTSTR lpszFacename, int nCount) const
2566 {
2567 ATLASSERT(m_hDC != NULL);
2568 return ::GetTextFace(m_hDC, nCount, lpszFacename);
2569 }
2570
2571 int GetTextFaceLen() const
2572 {
2573 ATLASSERT(m_hDC != NULL);
2574 return ::GetTextFace(m_hDC, 0, NULL);
2575 }
2576
2577 #ifndef _ATL_NO_COM
2578 #ifdef _OLEAUTO_H_
2579 BOOL GetTextFace(BSTR& bstrFace) const
2580 {
2581 USES_CONVERSION;
2582 ATLASSERT(m_hDC != NULL);
2583 ATLASSERT(bstrFace == NULL);
2584
2585 int nLen = GetTextFaceLen();
2586 if(nLen == 0)
2587 return FALSE;
2588
2589 CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
2590 LPTSTR lpszText = buff.Allocate(nLen);
2591 if(lpszText == NULL)
2592 return FALSE;
2593
2594 if(!GetTextFace(lpszText, nLen))
2595 return FALSE;
2596
2597 bstrFace = ::SysAllocString(T2OLE(lpszText));
2598 return (bstrFace != NULL) ? TRUE : FALSE;
2599 }
2600 #endif
2601 #endif // !_ATL_NO_COM
2602
2603 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
2604 int GetTextFace(_CSTRING_NS::CString& strFace) const
2605 {
2606 ATLASSERT(m_hDC != NULL);
2607
2608 int nLen = GetTextFaceLen();
2609 if(nLen == 0)
2610 return 0;
2611
2612 LPTSTR lpstr = strFace.GetBufferSetLength(nLen);
2613 if(lpstr == NULL)
2614 return 0;
2615 int nRet = GetTextFace(lpstr, nLen);
2616 strFace.ReleaseBuffer();
2617 return nRet;
2618 }
2619 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
2620
2621 BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const
2622 {
2623 ATLASSERT(m_hDC != NULL);
2624 return ::GetTextMetrics(m_hDC, lpMetrics);
2625 }
2626
2627 #ifndef _WIN32_WCE
2628 int SetTextJustification(int nBreakExtra, int nBreakCount)
2629 {
2630 ATLASSERT(m_hDC != NULL);
2631 return ::SetTextJustification(m_hDC, nBreakExtra, nBreakCount);
2632 }
2633
2634 int GetTextCharacterExtra() const
2635 {
2636 ATLASSERT(m_hDC != NULL);
2637 return ::GetTextCharacterExtra(m_hDC);
2638 }
2639
2640 int SetTextCharacterExtra(int nCharExtra)
2641 {
2642 ATLASSERT(m_hDC != NULL);
2643 return ::SetTextCharacterExtra(m_hDC, nCharExtra);
2644 }
2645 #endif // !_WIN32_WCE
2646
2647 // Advanced Drawing
2648 BOOL DrawEdge(LPRECT lpRect, UINT nEdge, UINT nFlags)
2649 {
2650 ATLASSERT(m_hDC != NULL);
2651 return ::DrawEdge(m_hDC, lpRect, nEdge, nFlags);
2652 }
2653
2654 BOOL DrawFrameControl(LPRECT lpRect, UINT nType, UINT nState)
2655 {
2656 ATLASSERT(m_hDC != NULL);
2657 return ::DrawFrameControl(m_hDC, lpRect, nType, nState);
2658 }
2659
2660 // Scrolling Functions
2661 BOOL ScrollDC(int dx, int dy, LPCRECT lpRectScroll, LPCRECT lpRectClip, HRGN hRgnUpdate, LPRECT lpRectUpdate)
2662 {
2663 ATLASSERT(m_hDC != NULL);
2664 return ::ScrollDC(m_hDC, dx, dy, lpRectScroll, lpRectClip, hRgnU pdate, lpRectUpdate);
2665 }
2666
2667 // Font Functions
2668 #ifndef _WIN32_WCE
2669 BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const
2670 {
2671 ATLASSERT(m_hDC != NULL);
2672 return ::GetCharWidth(m_hDC, nFirstChar, nLastChar, lpBuffer);
2673 }
2674
2675 // GetCharWidth32 is not supported under Win9x
2676 BOOL GetCharWidth32(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) con st
2677 {
2678 ATLASSERT(m_hDC != NULL);
2679 return ::GetCharWidth32(m_hDC, nFirstChar, nLastChar, lpBuffer);
2680 }
2681
2682 DWORD SetMapperFlags(DWORD dwFlag)
2683 {
2684 ATLASSERT(m_hDC != NULL);
2685 return ::SetMapperFlags(m_hDC, dwFlag);
2686 }
2687
2688 BOOL GetAspectRatioFilter(LPSIZE lpSize) const
2689 {
2690 ATLASSERT(m_hDC != NULL);
2691 return ::GetAspectRatioFilterEx(m_hDC, lpSize);
2692 }
2693
2694 BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABC lpabc) cons t
2695 {
2696 ATLASSERT(m_hDC != NULL);
2697 return ::GetCharABCWidths(m_hDC, nFirstChar, nLastChar, lpabc);
2698 }
2699
2700 DWORD GetFontData(DWORD dwTable, DWORD dwOffset, LPVOID lpData, DWORD cb Data) const
2701 {
2702 ATLASSERT(m_hDC != NULL);
2703 return ::GetFontData(m_hDC, dwTable, dwOffset, lpData, cbData);
2704 }
2705
2706 int GetKerningPairs(int nPairs, LPKERNINGPAIR lpkrnpair) const
2707 {
2708 ATLASSERT(m_hDC != NULL);
2709 return ::GetKerningPairs(m_hDC, nPairs, lpkrnpair);
2710 }
2711
2712 UINT GetOutlineTextMetrics(UINT cbData, LPOUTLINETEXTMETRIC lpotm) const
2713 {
2714 ATLASSERT(m_hDC != NULL);
2715 return ::GetOutlineTextMetrics(m_hDC, cbData, lpotm);
2716 }
2717
2718 DWORD GetGlyphOutline(UINT nChar, UINT nFormat, LPGLYPHMETRICS lpgm, DWO RD cbBuffer, LPVOID lpBuffer, const MAT2* lpmat2) const
2719 {
2720 ATLASSERT(m_hDC != NULL);
2721 return ::GetGlyphOutline(m_hDC, nChar, nFormat, lpgm, cbBuffer, lpBuffer, lpmat2);
2722 }
2723
2724 BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABCFLOAT lpABCF ) const
2725 {
2726 ATLASSERT(m_hDC != NULL);
2727 return ::GetCharABCWidthsFloat(m_hDC, nFirstChar, nLastChar, lpA BCF);
2728 }
2729
2730 BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, float* lpFloatBuffer) const
2731 {
2732 ATLASSERT(m_hDC != NULL);
2733 return ::GetCharWidthFloat(m_hDC, nFirstChar, nLastChar, lpFloat Buffer);
2734 }
2735 #endif // !_WIN32_WCE
2736
2737 // Printer/Device Escape Functions
2738 #ifndef _WIN32_WCE
2739 int Escape(int nEscape, int nCount, LPCSTR lpszInData, LPVOID lpOutData)
2740 {
2741 ATLASSERT(m_hDC != NULL);
2742 return ::Escape(m_hDC, nEscape, nCount, lpszInData, lpOutData);
2743 }
2744 #endif // !_WIN32_WCE
2745
2746 int Escape(int nEscape, int nInputSize, LPCSTR lpszInputData,
2747 int nOutputSize, LPSTR lpszOutputData)
2748 {
2749 ATLASSERT(m_hDC != NULL);
2750 return ::ExtEscape(m_hDC, nEscape, nInputSize, lpszInputData, nO utputSize, lpszOutputData);
2751 }
2752
2753 #ifndef _WIN32_WCE
2754 int DrawEscape(int nEscape, int nInputSize, LPCSTR lpszInputData)
2755 {
2756 ATLASSERT(m_hDC != NULL);
2757 return ::DrawEscape(m_hDC, nEscape, nInputSize, lpszInputData);
2758 }
2759 #endif // !_WIN32_WCE
2760
2761 // Escape helpers
2762 #if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc))
2763 int StartDoc(LPCTSTR lpszDocName) // old Win3.0 version
2764 {
2765 DOCINFO di = { 0 };
2766 di.cbSize = sizeof(DOCINFO);
2767 di.lpszDocName = lpszDocName;
2768 return StartDoc(&di);
2769 }
2770
2771 int StartDoc(LPDOCINFO lpDocInfo)
2772 {
2773 ATLASSERT(m_hDC != NULL);
2774 return ::StartDoc(m_hDC, lpDocInfo);
2775 }
2776
2777 int StartPage()
2778 {
2779 ATLASSERT(m_hDC != NULL);
2780 return ::StartPage(m_hDC);
2781 }
2782
2783 int EndPage()
2784 {
2785 ATLASSERT(m_hDC != NULL);
2786 return ::EndPage(m_hDC);
2787 }
2788
2789 int SetAbortProc(BOOL (CALLBACK* lpfn)(HDC, int))
2790 {
2791 ATLASSERT(m_hDC != NULL);
2792 return ::SetAbortProc(m_hDC, (ABORTPROC)lpfn);
2793 }
2794
2795 int AbortDoc()
2796 {
2797 ATLASSERT(m_hDC != NULL);
2798 return ::AbortDoc(m_hDC);
2799 }
2800
2801 int EndDoc()
2802 {
2803 ATLASSERT(m_hDC != NULL);
2804 return ::EndDoc(m_hDC);
2805 }
2806 #endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc))
2807
2808 // MetaFile Functions
2809 #ifndef _WIN32_WCE
2810 BOOL PlayMetaFile(HMETAFILE hMF)
2811 {
2812 ATLASSERT(m_hDC != NULL);
2813 if(::GetDeviceCaps(m_hDC, TECHNOLOGY) == DT_METAFILE)
2814 {
2815 // playing metafile in metafile, just use core windows A PI
2816 return ::PlayMetaFile(m_hDC, hMF);
2817 }
2818
2819 // for special playback, lParam == pDC
2820 return ::EnumMetaFile(m_hDC, hMF, EnumMetaFileProc, (LPARAM)this );
2821 }
2822
2823 BOOL PlayMetaFile(HENHMETAFILE hEnhMetaFile, LPCRECT lpBounds)
2824 {
2825 ATLASSERT(m_hDC != NULL);
2826 return ::PlayEnhMetaFile(m_hDC, hEnhMetaFile, lpBounds);
2827 }
2828
2829 BOOL AddMetaFileComment(UINT nDataSize, const BYTE* pCommentData) // can be used for enhanced metafiles only
2830 {
2831 ATLASSERT(m_hDC != NULL);
2832 return ::GdiComment(m_hDC, nDataSize, pCommentData);
2833 }
2834
2835 // Special handling for metafile playback
2836 static int CALLBACK EnumMetaFileProc(HDC hDC, HANDLETABLE* pHandleTable, METARECORD* pMetaRec, int nHandles, LPARAM lParam)
2837 {
2838 CDCHandle* pDC = (CDCHandle*)lParam;
2839
2840 switch (pMetaRec->rdFunction)
2841 {
2842 case META_SETMAPMODE:
2843 pDC->SetMapMode((int)(short)pMetaRec->rdParm[0]);
2844 break;
2845 case META_SETWINDOWEXT:
2846 pDC->SetWindowExt((int)(short)pMetaRec->rdParm[1], (int) (short)pMetaRec->rdParm[0]);
2847 break;
2848 case META_SETWINDOWORG:
2849 pDC->SetWindowOrg((int)(short)pMetaRec->rdParm[1], (int) (short)pMetaRec->rdParm[0]);
2850 break;
2851 case META_SETVIEWPORTEXT:
2852 pDC->SetViewportExt((int)(short)pMetaRec->rdParm[1], (in t)(short)pMetaRec->rdParm[0]);
2853 break;
2854 case META_SETVIEWPORTORG:
2855 pDC->SetViewportOrg((int)(short)pMetaRec->rdParm[1], (in t)(short)pMetaRec->rdParm[0]);
2856 break;
2857 case META_SCALEWINDOWEXT:
2858 pDC->ScaleWindowExt((int)(short)pMetaRec->rdParm[3], (in t)(short)pMetaRec->rdParm[2],
2859 (int)(short)pMetaRec->rdParm[1], (int)(short)pMe taRec->rdParm[0]);
2860 break;
2861 case META_SCALEVIEWPORTEXT:
2862 pDC->ScaleViewportExt((int)(short)pMetaRec->rdParm[3], ( int)(short)pMetaRec->rdParm[2],
2863 (int)(short)pMetaRec->rdParm[1], (int)(short)pMe taRec->rdParm[0]);
2864 break;
2865 case META_OFFSETVIEWPORTORG:
2866 pDC->OffsetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
2867 break;
2868 case META_SAVEDC:
2869 pDC->SaveDC();
2870 break;
2871 case META_RESTOREDC:
2872 pDC->RestoreDC((int)(short)pMetaRec->rdParm[0]);
2873 break;
2874 case META_SETBKCOLOR:
2875 pDC->SetBkColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[ 0]);
2876 break;
2877 case META_SETTEXTCOLOR:
2878 pDC->SetTextColor(*(UNALIGNED COLORREF*)&pMetaRec->rdPar m[0]);
2879 break;
2880
2881 // need to watch out for SelectObject(HFONT), for custom font ma pping
2882 case META_SELECTOBJECT:
2883 {
2884 HGDIOBJ hObject = pHandleTable->objectHandle[pMe taRec->rdParm[0]];
2885 UINT nObjType = ::GetObjectType(hObject);
2886 if(nObjType == 0)
2887 {
2888 // object type is unknown, determine if it is a font
2889 HFONT hStockFont = (HFONT)::GetStockObje ct(SYSTEM_FONT);
2890 HFONT hFontOld = (HFONT)::SelectObject(p DC->m_hDC, hStockFont);
2891 HGDIOBJ hObjOld = ::SelectObject(pDC->m_ hDC, hObject);
2892 if(hObjOld == hStockFont)
2893 {
2894 // got the stock object back, so must be selecting a font
2895 pDC->SelectFont((HFONT)hObject);
2896 break; // don't play the defaul t record
2897 }
2898 else
2899 {
2900 // didn't get the stock object b ack, so restore everything
2901 ::SelectObject(pDC->m_hDC, hFont Old);
2902 ::SelectObject(pDC->m_hDC, hObjO ld);
2903 }
2904 // and fall through to PlayMetaFileRecor d...
2905 }
2906 else if(nObjType == OBJ_FONT)
2907 {
2908 // play back as CDCHandle::SelectFont(HF ONT)
2909 pDC->SelectFont((HFONT)hObject);
2910 break; // don't play the default record
2911 }
2912 }
2913 // fall through...
2914
2915 default:
2916 ::PlayMetaFileRecord(hDC, pHandleTable, pMetaRec, nHandl es);
2917 break;
2918 }
2919
2920 return 1;
2921 }
2922 #endif // !_WIN32_WCE
2923
2924 // Path Functions
2925 #ifndef _WIN32_WCE
2926 BOOL AbortPath()
2927 {
2928 ATLASSERT(m_hDC != NULL);
2929 return ::AbortPath(m_hDC);
2930 }
2931
2932 BOOL BeginPath()
2933 {
2934 ATLASSERT(m_hDC != NULL);
2935 return ::BeginPath(m_hDC);
2936 }
2937
2938 BOOL CloseFigure()
2939 {
2940 ATLASSERT(m_hDC != NULL);
2941 return ::CloseFigure(m_hDC);
2942 }
2943
2944 BOOL EndPath()
2945 {
2946 ATLASSERT(m_hDC != NULL);
2947 return ::EndPath(m_hDC);
2948 }
2949
2950 BOOL FillPath()
2951 {
2952 ATLASSERT(m_hDC != NULL);
2953 return ::FillPath(m_hDC);
2954 }
2955
2956 BOOL FlattenPath()
2957 {
2958 ATLASSERT(m_hDC != NULL);
2959 return ::FlattenPath(m_hDC);
2960 }
2961
2962 BOOL StrokeAndFillPath()
2963 {
2964 ATLASSERT(m_hDC != NULL);
2965 return ::StrokeAndFillPath(m_hDC);
2966 }
2967
2968 BOOL StrokePath()
2969 {
2970 ATLASSERT(m_hDC != NULL);
2971 return ::StrokePath(m_hDC);
2972 }
2973
2974 BOOL WidenPath()
2975 {
2976 ATLASSERT(m_hDC != NULL);
2977 return ::WidenPath(m_hDC);
2978 }
2979
2980 BOOL GetMiterLimit(PFLOAT pfMiterLimit) const
2981 {
2982 ATLASSERT(m_hDC != NULL);
2983 return ::GetMiterLimit(m_hDC, pfMiterLimit);
2984 }
2985
2986 BOOL SetMiterLimit(float fMiterLimit)
2987 {
2988 ATLASSERT(m_hDC != NULL);
2989 return ::SetMiterLimit(m_hDC, fMiterLimit, NULL);
2990 }
2991
2992 int GetPath(LPPOINT lpPoints, LPBYTE lpTypes, int nCount) const
2993 {
2994 ATLASSERT(m_hDC != NULL);
2995 return ::GetPath(m_hDC, lpPoints, lpTypes, nCount);
2996 }
2997
2998 BOOL SelectClipPath(int nMode)
2999 {
3000 ATLASSERT(m_hDC != NULL);
3001 return ::SelectClipPath(m_hDC, nMode);
3002 }
3003 #endif // !_WIN32_WCE
3004
3005 // Misc Helper Functions
3006 static CBrushHandle PASCAL GetHalftoneBrush()
3007 {
3008 HBRUSH halftoneBrush = NULL;
3009 WORD grayPattern[8];
3010 for(int i = 0; i < 8; i++)
3011 grayPattern[i] = (WORD)(0x5555 << (i & 1));
3012 HBITMAP grayBitmap = CreateBitmap(8, 8, 1, 1, &grayPattern);
3013 if(grayBitmap != NULL)
3014 {
3015 halftoneBrush = ::CreatePatternBrush(grayBitmap);
3016 DeleteObject(grayBitmap);
3017 }
3018 return CBrushHandle(halftoneBrush);
3019 }
3020
3021 void DrawDragRect(LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE si zeLast, HBRUSH hBrush = NULL, HBRUSH hBrushLast = NULL)
3022 {
3023 // first, determine the update region and select it
3024 CRgn rgnOutside;
3025 rgnOutside.CreateRectRgnIndirect(lpRect);
3026 RECT rect = *lpRect;
3027 ::InflateRect(&rect, -size.cx, -size.cy);
3028 ::IntersectRect(&rect, &rect, lpRect);
3029 CRgn rgnInside;
3030 rgnInside.CreateRectRgnIndirect(&rect);
3031 CRgn rgnNew;
3032 rgnNew.CreateRectRgn(0, 0, 0, 0);
3033 rgnNew.CombineRgn(rgnOutside, rgnInside, RGN_XOR);
3034
3035 HBRUSH hBrushOld = NULL;
3036 CBrush brushHalftone;
3037 if(hBrush == NULL)
3038 brushHalftone = hBrush = CDCHandle::GetHalftoneBrush();
3039 if(hBrushLast == NULL)
3040 hBrushLast = hBrush;
3041
3042 CRgn rgnLast;
3043 CRgn rgnUpdate;
3044 if(lpRectLast != NULL)
3045 {
3046 // find difference between new region and old region
3047 rgnLast.CreateRectRgn(0, 0, 0, 0);
3048 rgnOutside.SetRectRgn(lpRectLast->left, lpRectLast->top, lpRectLast->right, lpRectLast->bottom);
3049 rect = *lpRectLast;
3050 ::InflateRect(&rect, -sizeLast.cx, -sizeLast.cy);
3051 ::IntersectRect(&rect, &rect, lpRectLast);
3052 rgnInside.SetRectRgn(rect.left, rect.top, rect.right, re ct.bottom);
3053 rgnLast.CombineRgn(rgnOutside, rgnInside, RGN_XOR);
3054
3055 // only diff them if brushes are the same
3056 if(hBrush == hBrushLast)
3057 {
3058 rgnUpdate.CreateRectRgn(0, 0, 0, 0);
3059 rgnUpdate.CombineRgn(rgnLast, rgnNew, RGN_XOR);
3060 }
3061 }
3062 if(hBrush != hBrushLast && lpRectLast != NULL)
3063 {
3064 // brushes are different -- erase old region first
3065 SelectClipRgn(rgnLast);
3066 GetClipBox(&rect);
3067 hBrushOld = SelectBrush(hBrushLast);
3068 PatBlt(rect.left, rect.top, rect.right - rect.left, rect .bottom - rect.top, PATINVERT);
3069 SelectBrush(hBrushOld);
3070 hBrushOld = NULL;
3071 }
3072
3073 // draw into the update/new region
3074 SelectClipRgn(rgnUpdate.IsNull() ? rgnNew : rgnUpdate);
3075 GetClipBox(&rect);
3076 hBrushOld = SelectBrush(hBrush);
3077 PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT);
3078
3079 // cleanup DC
3080 if(hBrushOld != NULL)
3081 SelectBrush(hBrushOld);
3082 SelectClipRgn(NULL);
3083 }
3084
3085 void FillSolidRect(LPCRECT lpRect, COLORREF clr)
3086 {
3087 ATLASSERT(m_hDC != NULL);
3088
3089 COLORREF clrOld = ::SetBkColor(m_hDC, clr);
3090 ATLASSERT(clrOld != CLR_INVALID);
3091 if(clrOld != CLR_INVALID)
3092 {
3093 ::ExtTextOut(m_hDC, 0, 0, ETO_OPAQUE, lpRect, NULL, 0, N ULL);
3094 ::SetBkColor(m_hDC, clrOld);
3095 }
3096 }
3097
3098 void FillSolidRect(int x, int y, int cx, int cy, COLORREF clr)
3099 {
3100 ATLASSERT(m_hDC != NULL);
3101
3102 RECT rect = { x, y, x + cx, y + cy };
3103 FillSolidRect(&rect, clr);
3104 }
3105
3106 void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomR ight)
3107 {
3108 Draw3dRect(lpRect->left, lpRect->top, lpRect->right - lpRect->le ft,
3109 lpRect->bottom - lpRect->top, clrTopLeft, clrBottomRight );
3110 }
3111
3112 void Draw3dRect(int x, int y, int cx, int cy, COLORREF clrTopLeft, COLOR REF clrBottomRight)
3113 {
3114 FillSolidRect(x, y, cx - 1, 1, clrTopLeft);
3115 FillSolidRect(x, y, 1, cy - 1, clrTopLeft);
3116 FillSolidRect(x + cx, y, -1, cy, clrBottomRight);
3117 FillSolidRect(x, y + cy, cx, -1, clrBottomRight);
3118 }
3119
3120 // DIB support
3121 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
3122 int SetDIBitsToDevice(int x, int y, DWORD dwWidth, DWORD dwHeight, int x Src, int ySrc, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITM APINFO* lpbmi, UINT uColorUse)
3123 {
3124 ATLASSERT(m_hDC != NULL);
3125 return ::SetDIBitsToDevice(m_hDC, x, y, dwWidth, dwHeight, xSrc, ySrc, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse);
3126 }
3127 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
3128
3129 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
3130 int StretchDIBits(int x, int y, int nWidth, int nHeight, int xSrc, int y Src, int nSrcWidth, int nSrcHeight, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi , UINT uColorUse, DWORD dwRop)
3131 {
3132 ATLASSERT(m_hDC != NULL);
3133 return ::StretchDIBits(m_hDC, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth, nSrcHeight, lpvBits, lpbmi, uColorUse, dwRop);
3134 }
3135
3136 UINT GetDIBColorTable(UINT uStartIndex, UINT cEntries, RGBQUAD* pColors) const
3137 {
3138 ATLASSERT(m_hDC != NULL);
3139 return ::GetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors) ;
3140 }
3141
3142 UINT SetDIBColorTable(UINT uStartIndex, UINT cEntries, CONST RGBQUAD* pC olors)
3143 {
3144 ATLASSERT(m_hDC != NULL);
3145 return ::SetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors) ;
3146 }
3147 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
3148
3149 // OpenGL support
3150 #if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)
3151 int ChoosePixelFormat(CONST PIXELFORMATDESCRIPTOR* ppfd)
3152 {
3153 ATLASSERT(m_hDC != NULL);
3154 return ::ChoosePixelFormat(m_hDC, ppfd);
3155 }
3156
3157 int DescribePixelFormat(int iPixelFormat, UINT nBytes, LPPIXELFORMATDESC RIPTOR ppfd)
3158 {
3159 ATLASSERT(m_hDC != NULL);
3160 return ::DescribePixelFormat(m_hDC, iPixelFormat, nBytes, ppfd);
3161 }
3162
3163 int GetPixelFormat() const
3164 {
3165 ATLASSERT(m_hDC != NULL);
3166 return ::GetPixelFormat(m_hDC);
3167 }
3168
3169 BOOL SetPixelFormat(int iPixelFormat, CONST PIXELFORMATDESCRIPTOR* ppfd)
3170 {
3171 ATLASSERT(m_hDC != NULL);
3172 return ::SetPixelFormat(m_hDC, iPixelFormat, ppfd);
3173 }
3174
3175 BOOL SwapBuffers()
3176 {
3177 ATLASSERT(m_hDC != NULL);
3178 return ::SwapBuffers(m_hDC);
3179 }
3180
3181 HGLRC wglCreateContext()
3182 {
3183 ATLASSERT(m_hDC != NULL);
3184 return ::wglCreateContext(m_hDC);
3185 }
3186
3187 HGLRC wglCreateLayerContext(int iLayerPlane)
3188 {
3189 ATLASSERT(m_hDC != NULL);
3190 return ::wglCreateLayerContext(m_hDC, iLayerPlane);
3191 }
3192
3193 BOOL wglMakeCurrent(HGLRC hglrc)
3194 {
3195 ATLASSERT(m_hDC != NULL);
3196 return ::wglMakeCurrent(m_hDC, hglrc);
3197 }
3198
3199 BOOL wglUseFontBitmaps(DWORD dwFirst, DWORD dwCount, DWORD listBase)
3200 {
3201 ATLASSERT(m_hDC != NULL);
3202 return ::wglUseFontBitmaps(m_hDC, dwFirst, dwCount, listBase);
3203 }
3204
3205 BOOL wglUseFontOutlines(DWORD dwFirst, DWORD dwCount, DWORD listBase, FL OAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf)
3206 {
3207 ATLASSERT(m_hDC != NULL);
3208 return ::wglUseFontOutlines(m_hDC, dwFirst, dwCount, listBase, d eviation, extrusion, format, lpgmf);
3209 }
3210
3211 BOOL wglDescribeLayerPlane(int iPixelFormat, int iLayerPlane, UINT nByte s, LPLAYERPLANEDESCRIPTOR plpd)
3212 {
3213 ATLASSERT(m_hDC != NULL);
3214 return ::wglDescribeLayerPlane(m_hDC, iPixelFormat, iLayerPlane, nBytes, plpd);
3215 }
3216
3217 int wglSetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, CONST COLORREF* pclr)
3218 {
3219 ATLASSERT(m_hDC != NULL);
3220 return ::wglSetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, c Entries, pclr);
3221 }
3222
3223 int wglGetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, COLORREF* pclr)
3224 {
3225 ATLASSERT(m_hDC != NULL);
3226 return ::wglGetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, c Entries, pclr);
3227 }
3228
3229 BOOL wglRealizeLayerPalette(int iLayerPlane, BOOL bRealize)
3230 {
3231 ATLASSERT(m_hDC != NULL);
3232 return ::wglRealizeLayerPalette(m_hDC, iLayerPlane, bRealize);
3233 }
3234
3235 BOOL wglSwapLayerBuffers(UINT uPlanes)
3236 {
3237 ATLASSERT(m_hDC != NULL);
3238 return ::wglSwapLayerBuffers(m_hDC, uPlanes);
3239 }
3240 #endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)
3241
3242 // New for Windows 2000 only
3243 #if (_WIN32_WINNT >= 0x0500)
3244 COLORREF GetDCPenColor() const
3245 {
3246 ATLASSERT(m_hDC != NULL);
3247 return ::GetDCPenColor(m_hDC);
3248 }
3249
3250 COLORREF SetDCPenColor(COLORREF clr)
3251 {
3252 ATLASSERT(m_hDC != NULL);
3253 return ::SetDCPenColor(m_hDC, clr);
3254 }
3255
3256 COLORREF GetDCBrushColor() const
3257 {
3258 ATLASSERT(m_hDC != NULL);
3259 return ::GetDCBrushColor(m_hDC);
3260 }
3261
3262 COLORREF SetDCBrushColor(COLORREF clr)
3263 {
3264 ATLASSERT(m_hDC != NULL);
3265 return ::SetDCBrushColor(m_hDC, clr);
3266 }
3267
3268 #ifndef _WIN32_WCE
3269 DWORD GetFontUnicodeRanges(LPGLYPHSET lpgs) const
3270 {
3271 ATLASSERT(m_hDC != NULL);
3272 return ::GetFontUnicodeRanges(m_hDC, lpgs);
3273 }
3274 #endif // !_WIN32_WCE
3275
3276 DWORD GetGlyphIndices(LPCTSTR lpstr, int cch, LPWORD pgi, DWORD dwFlags) const
3277 {
3278 ATLASSERT(m_hDC != NULL);
3279 return ::GetGlyphIndices(m_hDC, lpstr, cch, pgi, dwFlags);
3280 }
3281
3282 BOOL GetTextExtentPointI(LPWORD pgiIn, int cgi, LPSIZE lpSize) const
3283 {
3284 ATLASSERT(m_hDC != NULL);
3285 return ::GetTextExtentPointI(m_hDC, pgiIn, cgi, lpSize);
3286 }
3287
3288 BOOL GetTextExtentExPointI(LPWORD pgiIn, int cgi, int nMaxExtent, LPINT lpnFit, LPINT alpDx, LPSIZE lpSize) const
3289 {
3290 ATLASSERT(m_hDC != NULL);
3291 return ::GetTextExtentExPointI(m_hDC, pgiIn, cgi, nMaxExtent, lp nFit, alpDx, lpSize);
3292 }
3293
3294 BOOL GetCharWidthI(UINT giFirst, UINT cgi, LPWORD pgi, LPINT lpBuffer) c onst
3295 {
3296 ATLASSERT(m_hDC != NULL);
3297 return ::GetCharWidthI(m_hDC, giFirst, cgi, pgi, lpBuffer);
3298 }
3299
3300 BOOL GetCharABCWidthsI(UINT giFirst, UINT cgi, LPWORD pgi, LPABC lpabc) const
3301 {
3302 ATLASSERT(m_hDC != NULL);
3303 return ::GetCharABCWidthsI(m_hDC, giFirst, cgi, pgi, lpabc);
3304 }
3305 #endif // (_WIN32_WINNT >= 0x0500)
3306
3307 // New for Windows 2000 and Windows 98
3308 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE)
3309 BOOL ColorCorrectPalette(HPALETTE hPalette, DWORD dwFirstEntry, DWORD dw NumOfEntries)
3310 {
3311 ATLASSERT(m_hDC != NULL);
3312 return ::ColorCorrectPalette(m_hDC, hPalette, dwFirstEntry, dwNu mOfEntries);
3313 }
3314 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)
3315 };
3316
3317 typedef CDCT<false> CDCHandle;
3318 typedef CDCT<true> CDC;
3319
3320
3321 ///////////////////////////////////////////////////////////////////////////////
3322 // CDC Helpers
3323
3324 class CPaintDC : public CDC
3325 {
3326 public:
3327 // Data members
3328 HWND m_hWnd;
3329 PAINTSTRUCT m_ps;
3330
3331 // Constructor/destructor
3332 CPaintDC(HWND hWnd)
3333 {
3334 ATLASSERT(::IsWindow(hWnd));
3335 m_hWnd = hWnd;
3336 m_hDC = ::BeginPaint(hWnd, &m_ps);
3337 }
3338
3339 ~CPaintDC()
3340 {
3341 ATLASSERT(m_hDC != NULL);
3342 ATLASSERT(::IsWindow(m_hWnd));
3343 ::EndPaint(m_hWnd, &m_ps);
3344 Detach();
3345 }
3346 };
3347
3348 class CClientDC : public CDC
3349 {
3350 public:
3351 // Data members
3352 HWND m_hWnd;
3353
3354 // Constructor/destructor
3355 CClientDC(HWND hWnd)
3356 {
3357 ATLASSERT(hWnd == NULL || ::IsWindow(hWnd));
3358 m_hWnd = hWnd;
3359 m_hDC = ::GetDC(hWnd);
3360 }
3361
3362 ~CClientDC()
3363 {
3364 ATLASSERT(m_hDC != NULL);
3365 ::ReleaseDC(m_hWnd, Detach());
3366 }
3367 };
3368
3369 class CWindowDC : public CDC
3370 {
3371 public:
3372 // Data members
3373 HWND m_hWnd;
3374
3375 // Constructor/destructor
3376 CWindowDC(HWND hWnd)
3377 {
3378 ATLASSERT(hWnd == NULL || ::IsWindow(hWnd));
3379 m_hWnd = hWnd;
3380 m_hDC = ::GetWindowDC(hWnd);
3381 }
3382
3383 ~CWindowDC()
3384 {
3385 ATLASSERT(m_hDC != NULL);
3386 ::ReleaseDC(m_hWnd, Detach());
3387 }
3388 };
3389
3390 class CMemoryDC : public CDC
3391 {
3392 public:
3393 // Data members
3394 HDC m_hDCOriginal;
3395 RECT m_rcPaint;
3396 CBitmap m_bmp;
3397 HBITMAP m_hBmpOld;
3398
3399 // Constructor/destructor
3400 CMemoryDC(HDC hDC, RECT& rcPaint) : m_hDCOriginal(hDC), m_hBmpOld(NULL)
3401 {
3402 m_rcPaint = rcPaint;
3403 CreateCompatibleDC(m_hDCOriginal);
3404 ATLASSERT(m_hDC != NULL);
3405 m_bmp.CreateCompatibleBitmap(m_hDCOriginal, m_rcPaint.right - m_ rcPaint.left, m_rcPaint.bottom - m_rcPaint.top);
3406 ATLASSERT(m_bmp.m_hBitmap != NULL);
3407 m_hBmpOld = SelectBitmap(m_bmp);
3408 SetViewportOrg(-m_rcPaint.left, -m_rcPaint.top);
3409 }
3410
3411 ~CMemoryDC()
3412 {
3413 ::BitBlt(m_hDCOriginal, m_rcPaint.left, m_rcPaint.top, m_rcPaint .right - m_rcPaint.left, m_rcPaint.bottom - m_rcPaint.top, m_hDC, m_rcPaint.left , m_rcPaint.top, SRCCOPY);
3414 SelectBitmap(m_hBmpOld);
3415 }
3416 };
3417
3418
3419 ///////////////////////////////////////////////////////////////////////////////
3420 // Enhanced metafile support
3421
3422 #ifndef _WIN32_WCE
3423
3424 class CEnhMetaFileInfo
3425 {
3426 public:
3427 // Data members
3428 HENHMETAFILE m_hEMF;
3429 BYTE* m_pBits;
3430 TCHAR* m_pDesc;
3431 ENHMETAHEADER m_header;
3432 PIXELFORMATDESCRIPTOR m_pfd;
3433
3434 // Constructor/destructor
3435 CEnhMetaFileInfo(HENHMETAFILE hEMF) : m_pBits(NULL), m_pDesc(NULL), m_hE MF(hEMF)
3436 { }
3437
3438 ~CEnhMetaFileInfo()
3439 {
3440 delete [] m_pBits;
3441 delete [] m_pDesc;
3442 }
3443
3444 // Operations
3445 BYTE* GetEnhMetaFileBits()
3446 {
3447 ATLASSERT(m_hEMF != NULL);
3448 UINT nBytes = ::GetEnhMetaFileBits(m_hEMF, 0, NULL);
3449 delete [] m_pBits;
3450 m_pBits = NULL;
3451 ATLTRY(m_pBits = new BYTE[nBytes]);
3452 if (m_pBits != NULL)
3453 ::GetEnhMetaFileBits(m_hEMF, nBytes, m_pBits);
3454 return m_pBits;
3455 }
3456
3457 LPTSTR GetEnhMetaFileDescription()
3458 {
3459 ATLASSERT(m_hEMF != NULL);
3460 UINT nLen = ::GetEnhMetaFileDescription(m_hEMF, 0, NULL);
3461 delete [] m_pDesc;
3462 m_pDesc = NULL;
3463 ATLTRY(m_pDesc = new TCHAR[nLen]);
3464 if (m_pDesc != NULL)
3465 nLen = ::GetEnhMetaFileDescription(m_hEMF, nLen, m_pDesc );
3466 return m_pDesc;
3467 }
3468
3469 ENHMETAHEADER* GetEnhMetaFileHeader()
3470 {
3471 ATLASSERT(m_hEMF != NULL);
3472 memset(&m_header, 0, sizeof(m_header));
3473 m_header.iType = EMR_HEADER;
3474 m_header.nSize = sizeof(ENHMETAHEADER);
3475 UINT n = ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), & m_header);
3476 return (n != 0) ? &m_header : NULL;
3477 }
3478
3479 PIXELFORMATDESCRIPTOR* GetEnhMetaFilePixelFormat()
3480 {
3481 ATLASSERT(m_hEMF != NULL);
3482 memset(&m_pfd, 0, sizeof(m_pfd));
3483 UINT n = ::GetEnhMetaFilePixelFormat(m_hEMF, sizeof(m_pfd), &m_p fd);
3484 return (n != 0) ? &m_pfd : NULL;
3485 }
3486 };
3487
3488
3489 template <bool t_bManaged>
3490 class CEnhMetaFileT
3491 {
3492 public:
3493 // Data members
3494 HENHMETAFILE m_hEMF;
3495
3496 // Constructor/destructor
3497 CEnhMetaFileT(HENHMETAFILE hEMF = NULL) : m_hEMF(hEMF)
3498 {
3499 }
3500
3501 ~CEnhMetaFileT()
3502 {
3503 if(t_bManaged && m_hEMF != NULL)
3504 DeleteObject();
3505 }
3506
3507 // Operations
3508 CEnhMetaFileT<t_bManaged>& operator =(HENHMETAFILE hEMF)
3509 {
3510 Attach(hEMF);
3511 return *this;
3512 }
3513
3514 void Attach(HENHMETAFILE hEMF)
3515 {
3516 if(t_bManaged && m_hEMF != NULL && m_hEMF != hEMF)
3517 DeleteObject();
3518 m_hEMF = hEMF;
3519 }
3520
3521 HENHMETAFILE Detach()
3522 {
3523 HENHMETAFILE hEMF = m_hEMF;
3524 m_hEMF = NULL;
3525 return hEMF;
3526 }
3527
3528 operator HENHMETAFILE() const { return m_hEMF; }
3529
3530 bool IsNull() const { return (m_hEMF == NULL); }
3531
3532 BOOL DeleteObject()
3533 {
3534 ATLASSERT(m_hEMF != NULL);
3535 BOOL bRet = ::DeleteEnhMetaFile(m_hEMF);
3536 m_hEMF = NULL;
3537 return bRet;
3538 }
3539
3540 UINT GetEnhMetaFileBits(UINT cbBuffer, LPBYTE lpbBuffer) const
3541 {
3542 ATLASSERT(m_hEMF != NULL);
3543 return ::GetEnhMetaFileBits(m_hEMF, cbBuffer, lpbBuffer);
3544 }
3545
3546 UINT GetEnhMetaFileDescription(UINT cchBuffer, LPTSTR lpszDescription) c onst
3547 {
3548 ATLASSERT(m_hEMF != NULL);
3549 return ::GetEnhMetaFileDescription(m_hEMF, cchBuffer, lpszDescri ption);
3550 }
3551
3552 UINT GetEnhMetaFileHeader(LPENHMETAHEADER lpemh) const
3553 {
3554 ATLASSERT(m_hEMF != NULL);
3555 lpemh->iType = EMR_HEADER;
3556 lpemh->nSize = sizeof(ENHMETAHEADER);
3557 return ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), lpe mh);
3558 }
3559
3560 UINT GetEnhMetaFilePaletteEntries(UINT cEntries, LPPALETTEENTRY lppe) co nst
3561 {
3562 ATLASSERT(m_hEMF != NULL);
3563 return ::GetEnhMetaFilePaletteEntries(m_hEMF, cEntries, lppe);
3564 }
3565
3566 UINT GetEnhMetaFilePixelFormat(DWORD cbBuffer, PIXELFORMATDESCRIPTOR* pp fd) const
3567 {
3568 ATLASSERT(m_hEMF != NULL);
3569 return ::GetEnhMetaFilePixelFormat(m_hEMF, cbBuffer, ppfd);
3570 }
3571 };
3572
3573 typedef CEnhMetaFileT<false> CEnhMetaFileHandle;
3574 typedef CEnhMetaFileT<true> CEnhMetaFile;
3575
3576
3577 class CEnhMetaFileDC : public CDC
3578 {
3579 public:
3580 // Constructor/destructor
3581 CEnhMetaFileDC()
3582 {
3583 }
3584
3585 CEnhMetaFileDC(HDC hdc, LPCRECT lpRect)
3586 {
3587 Create(hdc, NULL, lpRect, NULL);
3588 ATLASSERT(m_hDC != NULL);
3589 }
3590
3591 CEnhMetaFileDC(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR l pDescription)
3592 {
3593 Create(hdcRef, lpFilename, lpRect, lpDescription);
3594 ATLASSERT(m_hDC != NULL);
3595 }
3596
3597 ~CEnhMetaFileDC()
3598 {
3599 HENHMETAFILE hEMF = Close();
3600 if (hEMF != NULL)
3601 ::DeleteEnhMetaFile(hEMF);
3602 }
3603
3604 // Operations
3605 void Create(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDe scription)
3606 {
3607 ATLASSERT(m_hDC == NULL);
3608 m_hDC = ::CreateEnhMetaFile(hdcRef, lpFilename, lpRect, lpDescri ption);
3609 }
3610
3611 HENHMETAFILE Close()
3612 {
3613 HENHMETAFILE hEMF = NULL;
3614 if (m_hDC != NULL)
3615 {
3616 hEMF = ::CloseEnhMetaFile(m_hDC);
3617 m_hDC = NULL;
3618 }
3619 return hEMF;
3620 }
3621 };
3622
3623 #endif // !_WIN32_WCE
3624
3625
3626 ///////////////////////////////////////////////////////////////////////////////
3627 // WinCE compatible clipboard CF_DIB format support functions
3628
3629 #ifndef _WTL_NO_DIB16
3630
3631 #define DIBINFO16_BITFIELDS { 31744, 992, 31 }
3632
3633 // DIBINFO16 - To avoid color table problems in WinCE we only create this type o f Dib
3634 struct DIBINFO16 // a BITMAPINFO with 2 additional color bitfields
3635 {
3636 BITMAPINFOHEADER bmiHeader;
3637 RGBQUAD bmiColors[3];
3638
3639 DIBINFO16(SIZE size)
3640 {
3641 BITMAPINFOHEADER bmih = { sizeof(BITMAPINFOHEADER), size.cx, siz e.cy,
3642 1, 16, BI_BITFIELDS, 2 * size.cx * siz e.cy , 0, 0, 3 };
3643 DWORD dw[3] = DIBINFO16_BITFIELDS ;
3644
3645 bmiHeader = bmih;
3646 memcpy(bmiColors, dw, 3 * sizeof(DWORD));
3647 }
3648 };
3649
3650
3651 // AtlxxxDibxxx minimal packed DIB implementation and helpers to copy and paste CF_DIB
3652
3653 inline bool AtlIsDib16(LPBITMAPINFOHEADER pbmih)
3654 {
3655 return (pbmih->biBitCount == 16) && (pbmih->biCompression == BI_BITFIELD S);
3656 }
3657
3658 inline int AtlGetDibColorTableSize(LPBITMAPINFOHEADER pbmih)
3659 {
3660 switch (pbmih->biBitCount)
3661 {
3662 case 2:
3663 case 4:
3664 case 8:
3665 return pbmih->biClrUsed ? pbmih->biClrUsed : 1 << pbmih- >biBitCount;
3666 case 24:
3667 break;
3668 case 16:
3669 case 32:
3670 return pbmih->biCompression == BI_BITFIELDS ? 3 : 0;
3671 default:
3672 ATLASSERT(FALSE); // should never come here
3673 }
3674
3675 return 0;
3676 }
3677
3678 inline int AtlGetDibNumColors(LPBITMAPINFOHEADER pbmih)
3679 {
3680 switch (pbmih->biBitCount)
3681 {
3682 case 2:
3683 case 4:
3684 case 8:
3685 if (pbmih->biClrUsed)
3686 return pbmih->biClrUsed;
3687 else
3688 break;
3689 case 16:
3690 if (pbmih->biCompression == BI_BITFIELDS )
3691 return 1 << 15;
3692 else
3693 break;
3694 case 24:
3695 break;
3696 case 32:
3697 if (pbmih->biCompression == BI_BITFIELDS )
3698 return 1 << 24;
3699 else
3700 break;
3701 default:
3702 ATLASSERT(FALSE);
3703 }
3704
3705 return 1 << pbmih->biBitCount;
3706 }
3707
3708 inline HBITMAP AtlGetDibBitmap(LPBITMAPINFO pbmi)
3709 {
3710 HBITMAP hbm = NULL;
3711 CDC dc(NULL);
3712 void * pBits = NULL;
3713
3714 LPBYTE pDibBits = (LPBYTE)pbmi + sizeof(BITMAPINFOHEADER) + AtlGetDibCol orTableSize(&pbmi->bmiHeader) * sizeof(RGBQUAD);
3715 if (hbm = CreateDIBSection(dc, pbmi, DIB_RGB_COLORS, &pBits, NULL, NULL) )
3716 memcpy(pBits, pDibBits, pbmi->bmiHeader.biSizeImage);
3717
3718 return hbm;
3719 }
3720
3721 inline HBITMAP AtlCopyBitmap(HBITMAP hbm , SIZE sizeDst, bool bAsBitmap = false)
3722 {
3723 CDC hdcSrc = CreateCompatibleDC(NULL);
3724 CDC hdcDst = CreateCompatibleDC(NULL);
3725
3726 CBitmapHandle hbmOld = NULL, hbmOld2 = NULL, bmSrc = hbm;
3727
3728 CBitmap bmNew = NULL;
3729
3730 SIZE sizeSrc = { 0 };
3731 bmSrc.GetSize(sizeSrc);
3732
3733 hbmOld = hdcSrc.SelectBitmap(bmSrc);
3734
3735 if (bAsBitmap)
3736 {
3737 bmNew.CreateCompatibleBitmap(hdcSrc, sizeDst.cx, sizeDst.cy);
3738 }
3739 else
3740 {
3741 DIBINFO16 dib16(sizeDst);
3742 LPVOID pBits = NULL;
3743 bmNew = CreateDIBSection(hdcDst, (const BITMAPINFO*)&dib16, DIB_ RGB_COLORS, &pBits, NULL, NULL);
3744 }
3745
3746 ATLASSERT(!bmNew.IsNull());
3747
3748 hbmOld2 = hdcDst.SelectBitmap(bmNew);
3749 BOOL bOK = FALSE;
3750
3751 if ((sizeDst.cx == sizeSrc.cx) && (sizeDst.cy == sizeSrc.cy))
3752 bOK = hdcDst.BitBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, SRCCOPY);
3753 else
3754 bOK = hdcDst.StretchBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, sizeSrc.cx, sizeSrc.cy, SRCCOPY);
3755
3756 hdcSrc.SelectBitmap(hbmOld);
3757 hdcDst.SelectBitmap(hbmOld2);
3758
3759 if (bOK == FALSE)
3760 bmNew.DeleteObject();
3761
3762 return bmNew.Detach();
3763 }
3764
3765 inline HLOCAL AtlCreatePackedDib16(HBITMAP hbm, SIZE size)
3766 {
3767 DIBSECTION ds = { 0 };
3768 LPBYTE pDib = NULL;
3769 bool bCopied = false;
3770
3771 bool bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds);
3772 if ((bOK == FALSE) || (ds.dsBm.bmBits == NULL) || (AtlIsDib16(&ds.dsBmih ) == FALSE) ||
3773 (ds.dsBmih.biWidth != size.cx ) || (ds.dsBmih.biHeight != size.cy ))
3774 {
3775 if ((hbm = AtlCopyBitmap(hbm, size)) != NULL)
3776 {
3777 bCopied = true;
3778 bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds);
3779 }
3780 else
3781 {
3782 bOK = FALSE;
3783 }
3784 }
3785
3786 if((bOK == TRUE) && (AtlIsDib16(&ds.dsBmih) == TRUE) && (ds.dsBm.bmBits != NULL))
3787 {
3788 pDib = (LPBYTE)LocalAlloc(LMEM_ZEROINIT, sizeof(DIBINFO16) + ds. dsBmih.biSizeImage);
3789 if (pDib != NULL)
3790 {
3791 memcpy(pDib , &ds.dsBmih, sizeof(DIBINFO16));
3792 memcpy(pDib + sizeof(DIBINFO16), ds.dsBm.bmBits, ds.dsBm ih.biSizeImage);
3793 }
3794 }
3795
3796 if (bCopied == true)
3797 DeleteObject(hbm);
3798
3799 return (HLOCAL)pDib;
3800 }
3801
3802 inline bool AtlSetClipboardDib16(HBITMAP hbm, SIZE size, HWND hWnd)
3803 {
3804 ATLASSERT(::IsWindow(hWnd));
3805 BOOL bOK = OpenClipboard(hWnd);
3806 if (bOK == TRUE)
3807 {
3808 if ((bOK = EmptyClipboard()) == TRUE)
3809 {
3810 HLOCAL hDib = AtlCreatePackedDib16(hbm, size);
3811 if (hDib != NULL)
3812 {
3813 bOK = SetClipboardData(CF_DIB, hDib) != NULL;
3814 if (bOK == FALSE)
3815 LocalFree(hDib);
3816 }
3817 else
3818 {
3819 bOK = FALSE;
3820 }
3821 }
3822 CloseClipboard();
3823 }
3824
3825 return bOK == TRUE;
3826 }
3827
3828 inline HBITMAP AtlGetClipboardDib(HWND hWnd)
3829 {
3830 ATLASSERT(::IsWindow(hWnd) == TRUE);
3831 HBITMAP hbm = NULL;
3832 if (OpenClipboard(hWnd) == TRUE)
3833 {
3834 LPBITMAPINFO pbmi = (LPBITMAPINFO)GetClipboardData(CF_DIB);
3835 if (pbmi != NULL)
3836 hbm = AtlGetDibBitmap(pbmi);
3837 CloseClipboard();
3838 }
3839
3840 return hbm;
3841 }
3842
3843 #endif // _WTL_NO_DIB16
3844
3845 }; // namespace WTL
3846
3847 #endif // __ATLGDI_H__
OLDNEW
« no previous file with comments | « third_party/wtl/include/atlframe.h ('k') | third_party/wtl/include/atlmisc.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698