1 // Windows Template Library - WTL version 8.0
\r
2 // Copyright (C) Microsoft Corporation. All rights reserved.
\r
4 // This file is a part of the Windows Template Library.
\r
5 // The use and distribution terms for this software are covered by the
\r
6 // Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)
\r
7 // which can be found in the file CPL.TXT at the root of this distribution.
\r
8 // By using this software in any fashion, you are agreeing to be bound by
\r
9 // the terms of this license. You must not remove this notice, or
\r
10 // any other, from this software.
\r
12 #ifndef __ATLGDI_H__
\r
13 #define __ATLGDI_H__
\r
18 #error ATL requires C++ compilation (use a .cpp suffix)
\r
21 #ifndef __ATLAPP_H__
\r
22 #error atlgdi.h requires atlapp.h to be included first
\r
26 // protect template members from windowsx.h macros
\r
27 #ifdef _INC_WINDOWSX
\r
35 #endif // _INC_WINDOWSX
\r
37 // required libraries
\r
38 #if !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE)
\r
39 #pragma comment(lib, "msimg32.lib")
\r
40 #endif // !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE)
\r
41 #if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)
\r
42 #pragma comment(lib, "opengl32.lib")
\r
43 #endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)
\r
46 ///////////////////////////////////////////////////////////////////////////////
\r
47 // Classes in this file:
\r
49 // CPenT<t_bManaged>
\r
50 // CBrushT<t_bManaged>
\r
52 // CFontT<t_bManaged>
\r
53 // CBitmapT<t_bManaged>
\r
54 // CPaletteT<t_bManaged>
\r
55 // CRgnT<t_bManaged>
\r
62 // CEnhMetaFileT<t_bManaged>
\r
65 // Global functions:
\r
66 // AtlGetBitmapResourceInfo()
\r
67 // AtlGetBitmapResourceBitsPerPixel()
\r
68 // AtlIsAlphaBitmapResource()
\r
70 // AtlGetDibColorTableSize()
\r
71 // AtlGetDibNumColors(),
\r
72 // AtlGetDibBitmap()
\r
74 // AtlCreatePackedDib16()
\r
75 // AtlSetClipboardDib16()
\r
76 // AtlGetClipboardDib()
\r
82 ///////////////////////////////////////////////////////////////////////////////
\r
83 // Bitmap resource helpers to extract bitmap information for a bitmap resource
\r
85 inline LPBITMAPINFOHEADER AtlGetBitmapResourceInfo(HMODULE hModule, ATL::_U_STRINGorID image)
\r
87 HRSRC hResource = ::FindResource(hModule, image.m_lpstr, RT_BITMAP);
\r
88 ATLASSERT(hResource != NULL);
\r
89 HGLOBAL hGlobal = ::LoadResource(hModule, hResource);
\r
90 ATLASSERT(hGlobal != NULL);
\r
91 LPBITMAPINFOHEADER pBitmapInfoHeader = (LPBITMAPINFOHEADER)::LockResource(hGlobal);
\r
92 ATLASSERT(pBitmapInfoHeader != NULL);
\r
93 return pBitmapInfoHeader;
\r
96 inline WORD AtlGetBitmapResourceBitsPerPixel(HMODULE hModule, ATL::_U_STRINGorID image)
\r
98 LPBITMAPINFOHEADER pBitmapInfoHeader = AtlGetBitmapResourceInfo(hModule, image);
\r
99 ATLASSERT(pBitmapInfoHeader != NULL);
\r
100 return pBitmapInfoHeader->biBitCount;
\r
103 inline WORD AtlGetBitmapResourceBitsPerPixel(ATL::_U_STRINGorID image)
\r
105 return AtlGetBitmapResourceBitsPerPixel(ModuleHelper::GetResourceInstance(), image);
\r
108 ///////////////////////////////////////////////////////////////////////////////
\r
109 // 32-bit (alpha channel) bitmap resource helper
\r
111 // Note: 32-bit (alpha channel) images work only on Windows XP with Common Controls version 6.
\r
112 // If you want your app to work on older version of Windows, load non-alpha images if Common
\r
113 // Controls version is less than 6.
\r
115 inline bool AtlIsAlphaBitmapResource(ATL::_U_STRINGorID image)
\r
117 return (AtlGetBitmapResourceBitsPerPixel(image) == 32);
\r
121 ///////////////////////////////////////////////////////////////////////////////
\r
124 template <bool t_bManaged>
\r
131 // Constructor/destructor/operators
\r
132 CPenT(HPEN hPen = NULL) : m_hPen(hPen)
\r
137 if(t_bManaged && m_hPen != NULL)
\r
141 CPenT<t_bManaged>& operator =(HPEN hPen)
\r
147 void Attach(HPEN hPen)
\r
149 if(t_bManaged && m_hPen != NULL && m_hPen != hPen)
\r
150 ::DeleteObject(m_hPen);
\r
156 HPEN hPen = m_hPen;
\r
161 operator HPEN() const { return m_hPen; }
\r
163 bool IsNull() const { return (m_hPen == NULL); }
\r
166 HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor)
\r
168 ATLASSERT(m_hPen == NULL);
\r
169 m_hPen = ::CreatePen(nPenStyle, nWidth, crColor);
\r
174 HPEN CreatePen(int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL)
\r
176 ATLASSERT(m_hPen == NULL);
\r
177 m_hPen = ::ExtCreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount, lpStyle);
\r
180 #endif // !_WIN32_WCE
\r
182 HPEN CreatePenIndirect(LPLOGPEN lpLogPen)
\r
184 ATLASSERT(m_hPen == NULL);
\r
185 m_hPen = ::CreatePenIndirect(lpLogPen);
\r
189 BOOL DeleteObject()
\r
191 ATLASSERT(m_hPen != NULL);
\r
192 BOOL bRet = ::DeleteObject(m_hPen);
\r
199 int GetLogPen(LOGPEN* pLogPen) const
\r
201 ATLASSERT(m_hPen != NULL);
\r
202 return ::GetObject(m_hPen, sizeof(LOGPEN), pLogPen);
\r
205 bool GetLogPen(LOGPEN& LogPen) const
\r
207 ATLASSERT(m_hPen != NULL);
\r
208 return (::GetObject(m_hPen, sizeof(LOGPEN), &LogPen) == sizeof(LOGPEN));
\r
212 int GetExtLogPen(EXTLOGPEN* pLogPen) const
\r
214 ATLASSERT(m_hPen != NULL);
\r
215 return ::GetObject(m_hPen, sizeof(EXTLOGPEN), pLogPen);
\r
218 bool GetExtLogPen(EXTLOGPEN& ExtLogPen) const
\r
220 ATLASSERT(m_hPen != NULL);
\r
221 return (::GetObject(m_hPen, sizeof(EXTLOGPEN), &ExtLogPen) == sizeof(EXTLOGPEN));
\r
223 #endif // !_WIN32_WCE
\r
226 typedef CPenT<false> CPenHandle;
\r
227 typedef CPenT<true> CPen;
\r
230 ///////////////////////////////////////////////////////////////////////////////
\r
233 template <bool t_bManaged>
\r
240 // Constructor/destructor/operators
\r
241 CBrushT(HBRUSH hBrush = NULL) : m_hBrush(hBrush)
\r
246 if(t_bManaged && m_hBrush != NULL)
\r
250 CBrushT<t_bManaged>& operator =(HBRUSH hBrush)
\r
256 void Attach(HBRUSH hBrush)
\r
258 if(t_bManaged && m_hBrush != NULL && m_hBrush != hBrush)
\r
259 ::DeleteObject(m_hBrush);
\r
265 HBRUSH hBrush = m_hBrush;
\r
270 operator HBRUSH() const { return m_hBrush; }
\r
272 bool IsNull() const { return (m_hBrush == NULL); }
\r
275 HBRUSH CreateSolidBrush(COLORREF crColor)
\r
277 ATLASSERT(m_hBrush == NULL);
\r
278 m_hBrush = ::CreateSolidBrush(crColor);
\r
283 HBRUSH CreateHatchBrush(int nIndex, COLORREF crColor)
\r
285 ATLASSERT(m_hBrush == NULL);
\r
286 m_hBrush = ::CreateHatchBrush(nIndex, crColor);
\r
289 #endif // !_WIN32_WCE
\r
291 #if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
\r
292 HBRUSH CreateBrushIndirect(const LOGBRUSH* lpLogBrush)
\r
294 ATLASSERT(m_hBrush == NULL);
\r
296 m_hBrush = ::CreateBrushIndirect(lpLogBrush);
\r
297 #else // CE specific
\r
298 m_hBrush = ATL::CreateBrushIndirect(lpLogBrush);
\r
299 #endif // _WIN32_WCE
\r
302 #endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
\r
304 HBRUSH CreatePatternBrush(HBITMAP hBitmap)
\r
306 ATLASSERT(m_hBrush == NULL);
\r
307 m_hBrush = ::CreatePatternBrush(hBitmap);
\r
311 HBRUSH CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage)
\r
313 ATLASSERT(hPackedDIB != NULL);
\r
314 const void* lpPackedDIB = GlobalLock(hPackedDIB);
\r
315 ATLASSERT(lpPackedDIB != NULL);
\r
316 m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage);
\r
317 GlobalUnlock(hPackedDIB);
\r
321 HBRUSH CreateDIBPatternBrush(const void* lpPackedDIB, UINT nUsage)
\r
323 ATLASSERT(m_hBrush == NULL);
\r
324 m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage);
\r
328 HBRUSH CreateSysColorBrush(int nIndex)
\r
330 ATLASSERT(m_hBrush == NULL);
\r
331 m_hBrush = ::GetSysColorBrush(nIndex);
\r
335 BOOL DeleteObject()
\r
337 ATLASSERT(m_hBrush != NULL);
\r
338 BOOL bRet = ::DeleteObject(m_hBrush);
\r
345 int GetLogBrush(LOGBRUSH* pLogBrush) const
\r
347 ATLASSERT(m_hBrush != NULL);
\r
348 return ::GetObject(m_hBrush, sizeof(LOGBRUSH), pLogBrush);
\r
351 bool GetLogBrush(LOGBRUSH& LogBrush) const
\r
353 ATLASSERT(m_hBrush != NULL);
\r
354 return (::GetObject(m_hBrush, sizeof(LOGBRUSH), &LogBrush) == sizeof(LOGBRUSH));
\r
358 typedef CBrushT<false> CBrushHandle;
\r
359 typedef CBrushT<true> CBrush;
\r
362 ///////////////////////////////////////////////////////////////////////////////
\r
365 class CLogFont : public LOGFONT
\r
370 memset(this, 0, sizeof(LOGFONT));
\r
373 CLogFont(const LOGFONT& lf)
\r
378 CLogFont(HFONT hFont)
\r
380 ATLASSERT(::GetObjectType(hFont) == OBJ_FONT);
\r
381 ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this);
\r
384 HFONT CreateFontIndirect()
\r
386 return ::CreateFontIndirect(this);
\r
391 lfWeight = FW_BOLD;
\r
394 bool IsBold() const
\r
396 return (lfWeight >= FW_BOLD);
\r
399 void MakeBolder(int iScale = 1)
\r
401 lfWeight += FW_BOLD * iScale;
\r
404 void MakeLarger(int iScale)
\r
407 lfHeight += iScale;
\r
409 lfHeight -= iScale;
\r
412 void SetHeight(LONG nPointSize, HDC hDC = NULL)
\r
414 // For MM_TEXT mapping mode
\r
415 lfHeight = -::MulDiv(nPointSize, ::GetDeviceCaps(hDC, LOGPIXELSY), 72);
\r
418 LONG GetHeight(HDC hDC = NULL) const
\r
420 // For MM_TEXT mapping mode
\r
421 return ::MulDiv(-lfHeight, 72, ::GetDeviceCaps(hDC, LOGPIXELSY));
\r
424 LONG GetDeciPointHeight(HDC hDC = NULL) const
\r
427 POINT ptOrg = { 0, 0 };
\r
428 ::DPtoLP(hDC, &ptOrg, 1);
\r
429 POINT pt = { 0, 0 };
\r
430 pt.y = abs(lfHeight) + ptOrg.y;
\r
431 ::LPtoDP(hDC,&pt,1);
\r
432 return ::MulDiv(pt.y, 720, ::GetDeviceCaps(hDC, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point
\r
433 #else // CE specific
\r
434 // DP and LP are always the same on CE
\r
435 return ::MulDiv(abs(lfHeight), 720, ::GetDeviceCaps(hDC, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point
\r
436 #endif // _WIN32_WCE
\r
439 void SetHeightFromDeciPoint(LONG nDeciPtHeight, HDC hDC = NULL)
\r
442 POINT pt = { 0, 0 };
\r
443 pt.y = ::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720); // 72 points/inch, 10 decipoints/point
\r
444 ::DPtoLP(hDC, &pt, 1);
\r
445 POINT ptOrg = { 0, 0 };
\r
446 ::DPtoLP(hDC, &ptOrg, 1);
\r
447 lfHeight = -abs(pt.y - ptOrg.y);
\r
448 #else // CE specific
\r
449 // DP and LP are always the same on CE
\r
450 lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720)); // 72 points/inch, 10 decipoints/point
\r
451 #endif // _WIN32_WCE
\r
455 void SetCaptionFont()
\r
457 NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
\r
458 ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0));
\r
459 Copy(&ncm.lfCaptionFont);
\r
464 NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
\r
465 ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0));
\r
466 Copy(&ncm.lfMenuFont);
\r
469 void SetStatusFont()
\r
471 NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
\r
472 ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0));
\r
473 Copy(&ncm.lfStatusFont);
\r
476 void SetMessageBoxFont()
\r
478 NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
\r
479 ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0));
\r
480 Copy(&ncm.lfMessageFont);
\r
482 #endif // !_WIN32_WCE
\r
484 void Copy(const LOGFONT* pLogFont)
\r
486 ATLASSERT(pLogFont != NULL);
\r
487 *(LOGFONT*)this = *pLogFont;
\r
490 CLogFont& operator =(const CLogFont& src)
\r
496 CLogFont& operator =(const LOGFONT& src)
\r
502 CLogFont& operator =(HFONT hFont)
\r
504 ATLASSERT(::GetObjectType(hFont) == OBJ_FONT);
\r
505 ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this);
\r
509 bool operator ==(const LOGFONT& logfont) const
\r
511 return(logfont.lfHeight == lfHeight &&
\r
512 logfont.lfWidth == lfWidth &&
\r
513 logfont.lfEscapement == lfEscapement &&
\r
514 logfont.lfOrientation == lfOrientation &&
\r
515 logfont.lfWeight == lfWeight &&
\r
516 logfont.lfItalic == lfItalic &&
\r
517 logfont.lfUnderline == lfUnderline &&
\r
518 logfont.lfStrikeOut == lfStrikeOut &&
\r
519 logfont.lfCharSet == lfCharSet &&
\r
520 logfont.lfOutPrecision == lfOutPrecision &&
\r
521 logfont.lfClipPrecision == lfClipPrecision &&
\r
522 logfont.lfQuality == lfQuality &&
\r
523 logfont.lfPitchAndFamily == lfPitchAndFamily &&
\r
524 lstrcmp(logfont.lfFaceName, lfFaceName) == 0);
\r
529 template <bool t_bManaged>
\r
536 // Constructor/destructor/operators
\r
537 CFontT(HFONT hFont = NULL) : m_hFont(hFont)
\r
542 if(t_bManaged && m_hFont != NULL)
\r
546 CFontT<t_bManaged>& operator =(HFONT hFont)
\r
552 void Attach(HFONT hFont)
\r
554 if(t_bManaged && m_hFont != NULL && m_hFont != hFont)
\r
555 ::DeleteObject(m_hFont);
\r
561 HFONT hFont = m_hFont;
\r
566 operator HFONT() const { return m_hFont; }
\r
568 bool IsNull() const { return (m_hFont == NULL); }
\r
571 HFONT CreateFontIndirect(const LOGFONT* lpLogFont)
\r
573 ATLASSERT(m_hFont == NULL);
\r
574 m_hFont = ::CreateFontIndirect(lpLogFont);
\r
578 #if !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500)
\r
579 HFONT CreateFontIndirectEx(CONST ENUMLOGFONTEXDV* penumlfex)
\r
581 ATLASSERT(m_hFont == NULL);
\r
582 m_hFont = ::CreateFontIndirectEx(penumlfex);
\r
585 #endif // !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500)
\r
587 #if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
\r
588 HFONT CreateFont(int nHeight, int nWidth, int nEscapement,
\r
589 int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline,
\r
590 BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision,
\r
591 BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily,
\r
592 LPCTSTR lpszFacename)
\r
594 ATLASSERT(m_hFont == NULL);
\r
596 m_hFont = ::CreateFont(nHeight, nWidth, nEscapement,
\r
597 nOrientation, nWeight, bItalic, bUnderline, cStrikeOut,
\r
598 nCharSet, nOutPrecision, nClipPrecision, nQuality,
\r
599 nPitchAndFamily, lpszFacename);
\r
600 #else // CE specific
\r
601 m_hFont = ATL::CreateFont(nHeight, nWidth, nEscapement,
\r
602 nOrientation, nWeight, bItalic, bUnderline, cStrikeOut,
\r
603 nCharSet, nOutPrecision, nClipPrecision, nQuality,
\r
604 nPitchAndFamily, lpszFacename);
\r
605 #endif // _WIN32_WCE
\r
608 #endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800)
\r
610 HFONT CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, HDC hDC = NULL, bool bBold = false, bool bItalic = false)
\r
612 LOGFONT logFont = { 0 };
\r
613 logFont.lfCharSet = DEFAULT_CHARSET;
\r
614 logFont.lfHeight = nPointSize;
\r
615 SecureHelper::strncpy_x(logFont.lfFaceName, _countof(logFont.lfFaceName), lpszFaceName, _TRUNCATE);
\r
618 logFont.lfWeight = FW_BOLD;
\r
620 logFont.lfItalic = (BYTE)TRUE;
\r
622 return CreatePointFontIndirect(&logFont, hDC);
\r
625 HFONT CreatePointFontIndirect(const LOGFONT* lpLogFont, HDC hDC = NULL)
\r
627 HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL);
\r
629 // convert nPointSize to logical units based on hDC
\r
630 LOGFONT logFont = *lpLogFont;
\r
632 POINT pt = { 0, 0 };
\r
633 pt.y = ::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720); // 72 points/inch, 10 decipoints/point
\r
634 ::DPtoLP(hDC1, &pt, 1);
\r
635 POINT ptOrg = { 0, 0 };
\r
636 ::DPtoLP(hDC1, &ptOrg, 1);
\r
637 logFont.lfHeight = -abs(pt.y - ptOrg.y);
\r
638 #else // CE specific
\r
639 // DP and LP are always the same on CE
\r
640 logFont.lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720)); // 72 points/inch, 10 decipoints/point
\r
641 #endif // _WIN32_WCE
\r
644 ::ReleaseDC(NULL, hDC1);
\r
646 return CreateFontIndirect(&logFont);
\r
649 BOOL DeleteObject()
\r
651 ATLASSERT(m_hFont != NULL);
\r
652 BOOL bRet = ::DeleteObject(m_hFont);
\r
659 int GetLogFont(LOGFONT* pLogFont) const
\r
661 ATLASSERT(m_hFont != NULL);
\r
662 return ::GetObject(m_hFont, sizeof(LOGFONT), pLogFont);
\r
665 bool GetLogFont(LOGFONT& LogFont) const
\r
667 ATLASSERT(m_hFont != NULL);
\r
668 return (::GetObject(m_hFont, sizeof(LOGFONT), &LogFont) == sizeof(LOGFONT));
\r
672 typedef CFontT<false> CFontHandle;
\r
673 typedef CFontT<true> CFont;
\r
676 ///////////////////////////////////////////////////////////////////////////////
\r
679 template <bool t_bManaged>
\r
686 // Constructor/destructor/operators
\r
687 CBitmapT(HBITMAP hBitmap = NULL) : m_hBitmap(hBitmap)
\r
692 if(t_bManaged && m_hBitmap != NULL)
\r
696 CBitmapT<t_bManaged>& operator =(HBITMAP hBitmap)
\r
702 void Attach(HBITMAP hBitmap)
\r
704 if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap)
\r
705 ::DeleteObject(m_hBitmap);
\r
706 m_hBitmap = hBitmap;
\r
711 HBITMAP hBitmap = m_hBitmap;
\r
716 operator HBITMAP() const { return m_hBitmap; }
\r
718 bool IsNull() const { return (m_hBitmap == NULL); }
\r
720 // Create and load methods
\r
721 HBITMAP LoadBitmap(ATL::_U_STRINGorID bitmap)
\r
723 ATLASSERT(m_hBitmap == NULL);
\r
724 m_hBitmap = ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr);
\r
728 HBITMAP LoadOEMBitmap(UINT nIDBitmap) // for OBM_/OCR_/OIC_
\r
730 ATLASSERT(m_hBitmap == NULL);
\r
731 m_hBitmap = ::LoadBitmap(NULL, MAKEINTRESOURCE(nIDBitmap));
\r
736 HBITMAP LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0)
\r
738 ATLASSERT(m_hBitmap == NULL);
\r
739 m_hBitmap = ::CreateMappedBitmap(ModuleHelper::GetResourceInstance(), nIDBitmap, (WORD)nFlags, lpColorMap, nMapSize);
\r
742 #endif // !_WIN32_WCE
\r
744 HBITMAP CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitsPerPixel, const void* lpBits)
\r
746 ATLASSERT(m_hBitmap == NULL);
\r
747 m_hBitmap = ::CreateBitmap(nWidth, nHeight, nPlanes, nBitsPerPixel, lpBits);
\r
752 HBITMAP CreateBitmapIndirect(LPBITMAP lpBitmap)
\r
754 ATLASSERT(m_hBitmap == NULL);
\r
755 m_hBitmap = ::CreateBitmapIndirect(lpBitmap);
\r
758 #endif // !_WIN32_WCE
\r
760 HBITMAP CreateCompatibleBitmap(HDC hDC, int nWidth, int nHeight)
\r
762 ATLASSERT(m_hBitmap == NULL);
\r
763 m_hBitmap = ::CreateCompatibleBitmap(hDC, nWidth, nHeight);
\r
768 HBITMAP CreateDiscardableBitmap(HDC hDC, int nWidth, int nHeight)
\r
770 ATLASSERT(m_hBitmap == NULL);
\r
771 m_hBitmap = ::CreateDiscardableBitmap(hDC, nWidth, nHeight);
\r
774 #endif // !_WIN32_WCE
\r
776 BOOL DeleteObject()
\r
778 ATLASSERT(m_hBitmap != NULL);
\r
779 BOOL bRet = ::DeleteObject(m_hBitmap);
\r
786 int GetBitmap(BITMAP* pBitMap) const
\r
788 ATLASSERT(m_hBitmap != NULL);
\r
789 return ::GetObject(m_hBitmap, sizeof(BITMAP), pBitMap);
\r
792 bool GetBitmap(BITMAP& bm) const
\r
794 ATLASSERT(m_hBitmap != NULL);
\r
795 return (::GetObject(m_hBitmap, sizeof(BITMAP), &bm) == sizeof(BITMAP));
\r
798 bool GetSize(SIZE& size) const
\r
800 ATLASSERT(m_hBitmap != NULL);
\r
802 if(!GetBitmap(&bm))
\r
804 size.cx = bm.bmWidth;
\r
805 size.cy = bm.bmHeight;
\r
810 DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const
\r
812 ATLASSERT(m_hBitmap != NULL);
\r
813 return ::GetBitmapBits(m_hBitmap, dwCount, lpBits);
\r
815 #endif // !_WIN32_WCE
\r
817 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
\r
818 DWORD SetBitmapBits(DWORD dwCount, const void* lpBits)
\r
820 ATLASSERT(m_hBitmap != NULL);
\r
821 return ::SetBitmapBits(m_hBitmap, dwCount, lpBits);
\r
823 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
\r
826 BOOL GetBitmapDimension(LPSIZE lpSize) const
\r
828 ATLASSERT(m_hBitmap != NULL);
\r
829 return ::GetBitmapDimensionEx(m_hBitmap, lpSize);
\r
832 BOOL SetBitmapDimension(int nWidth, int nHeight, LPSIZE lpSize = NULL)
\r
834 ATLASSERT(m_hBitmap != NULL);
\r
835 return ::SetBitmapDimensionEx(m_hBitmap, nWidth, nHeight, lpSize);
\r
839 HBITMAP CreateDIBitmap(HDC hDC, CONST BITMAPINFOHEADER* lpbmih, DWORD dwInit, CONST VOID* lpbInit, CONST BITMAPINFO* lpbmi, UINT uColorUse)
\r
841 ATLASSERT(m_hBitmap == NULL);
\r
842 m_hBitmap = ::CreateDIBitmap(hDC, lpbmih, dwInit, lpbInit, lpbmi, uColorUse);
\r
845 #endif // !_WIN32_WCE
\r
847 HBITMAP CreateDIBSection(HDC hDC, CONST BITMAPINFO* lpbmi, UINT uColorUse, VOID** ppvBits, HANDLE hSection, DWORD dwOffset)
\r
849 ATLASSERT(m_hBitmap == NULL);
\r
850 m_hBitmap = ::CreateDIBSection(hDC, lpbmi, uColorUse, ppvBits, hSection, dwOffset);
\r
855 int GetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, LPVOID lpvBits, LPBITMAPINFO lpbmi, UINT uColorUse) const
\r
857 ATLASSERT(m_hBitmap != NULL);
\r
858 return ::GetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse);
\r
861 int SetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse)
\r
863 ATLASSERT(m_hBitmap != NULL);
\r
864 return ::SetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse);
\r
866 #endif // !_WIN32_WCE
\r
869 typedef CBitmapT<false> CBitmapHandle;
\r
870 typedef CBitmapT<true> CBitmap;
\r
873 ///////////////////////////////////////////////////////////////////////////////
\r
876 template <bool t_bManaged>
\r
881 HPALETTE m_hPalette;
\r
883 // Constructor/destructor/operators
\r
884 CPaletteT(HPALETTE hPalette = NULL) : m_hPalette(hPalette)
\r
889 if(t_bManaged && m_hPalette != NULL)
\r
893 CPaletteT<t_bManaged>& operator =(HPALETTE hPalette)
\r
899 void Attach(HPALETTE hPalette)
\r
901 if(t_bManaged && m_hPalette != NULL && m_hPalette != hPalette)
\r
902 ::DeleteObject(m_hPalette);
\r
903 m_hPalette = hPalette;
\r
908 HPALETTE hPalette = m_hPalette;
\r
913 operator HPALETTE() const { return m_hPalette; }
\r
915 bool IsNull() const { return (m_hPalette == NULL); }
\r
918 HPALETTE CreatePalette(LPLOGPALETTE lpLogPalette)
\r
920 ATLASSERT(m_hPalette == NULL);
\r
921 m_hPalette = ::CreatePalette(lpLogPalette);
\r
926 HPALETTE CreateHalftonePalette(HDC hDC)
\r
928 ATLASSERT(m_hPalette == NULL);
\r
929 ATLASSERT(hDC != NULL);
\r
930 m_hPalette = ::CreateHalftonePalette(hDC);
\r
933 #endif // !_WIN32_WCE
\r
935 BOOL DeleteObject()
\r
937 ATLASSERT(m_hPalette != NULL);
\r
938 BOOL bRet = ::DeleteObject(m_hPalette);
\r
945 int GetEntryCount() const
\r
947 ATLASSERT(m_hPalette != NULL);
\r
949 ::GetObject(m_hPalette, sizeof(WORD), &nEntries);
\r
950 return (int)nEntries;
\r
953 UINT GetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) const
\r
955 ATLASSERT(m_hPalette != NULL);
\r
956 return ::GetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);
\r
959 UINT SetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors)
\r
961 ATLASSERT(m_hPalette != NULL);
\r
962 return ::SetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);
\r
967 void AnimatePalette(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors)
\r
969 ATLASSERT(m_hPalette != NULL);
\r
970 ::AnimatePalette(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors);
\r
973 BOOL ResizePalette(UINT nNumEntries)
\r
975 ATLASSERT(m_hPalette != NULL);
\r
976 return ::ResizePalette(m_hPalette, nNumEntries);
\r
978 #endif // !_WIN32_WCE
\r
980 UINT GetNearestPaletteIndex(COLORREF crColor) const
\r
982 ATLASSERT(m_hPalette != NULL);
\r
983 return ::GetNearestPaletteIndex(m_hPalette, crColor);
\r
987 typedef CPaletteT<false> CPaletteHandle;
\r
988 typedef CPaletteT<true> CPalette;
\r
991 ///////////////////////////////////////////////////////////////////////////////
\r
994 template <bool t_bManaged>
\r
1001 // Constructor/destructor/operators
\r
1002 CRgnT(HRGN hRgn = NULL) : m_hRgn(hRgn)
\r
1007 if(t_bManaged && m_hRgn != NULL)
\r
1011 CRgnT<t_bManaged>& operator =(HRGN hRgn)
\r
1017 void Attach(HRGN hRgn)
\r
1019 if(t_bManaged && m_hRgn != NULL && m_hRgn != hRgn)
\r
1020 ::DeleteObject(m_hRgn);
\r
1026 HRGN hRgn = m_hRgn;
\r
1031 operator HRGN() const { return m_hRgn; }
\r
1033 bool IsNull() const { return (m_hRgn == NULL); }
\r
1036 HRGN CreateRectRgn(int x1, int y1, int x2, int y2)
\r
1038 ATLASSERT(m_hRgn == NULL);
\r
1039 m_hRgn = ::CreateRectRgn(x1, y1, x2, y2);
\r
1043 HRGN CreateRectRgnIndirect(LPCRECT lpRect)
\r
1045 ATLASSERT(m_hRgn == NULL);
\r
1046 m_hRgn = ::CreateRectRgnIndirect(lpRect);
\r
1050 #ifndef _WIN32_WCE
\r
1051 HRGN CreateEllipticRgn(int x1, int y1, int x2, int y2)
\r
1053 ATLASSERT(m_hRgn == NULL);
\r
1054 m_hRgn = ::CreateEllipticRgn(x1, y1, x2, y2);
\r
1058 HRGN CreateEllipticRgnIndirect(LPCRECT lpRect)
\r
1060 ATLASSERT(m_hRgn == NULL);
\r
1061 m_hRgn = ::CreateEllipticRgnIndirect(lpRect);
\r
1065 HRGN CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode)
\r
1067 ATLASSERT(m_hRgn == NULL);
\r
1068 m_hRgn = ::CreatePolygonRgn(lpPoints, nCount, nMode);
\r
1072 HRGN CreatePolyPolygonRgn(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount, int nPolyFillMode)
\r
1074 ATLASSERT(m_hRgn == NULL);
\r
1075 m_hRgn = ::CreatePolyPolygonRgn(lpPoints, lpPolyCounts, nCount, nPolyFillMode);
\r
1079 HRGN CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3)
\r
1081 ATLASSERT(m_hRgn == NULL);
\r
1082 m_hRgn = ::CreateRoundRectRgn(x1, y1, x2, y2, x3, y3);
\r
1086 HRGN CreateFromPath(HDC hDC)
\r
1088 ATLASSERT(m_hRgn == NULL);
\r
1089 ATLASSERT(hDC != NULL);
\r
1090 m_hRgn = ::PathToRegion(hDC);
\r
1094 HRGN CreateFromData(const XFORM* lpXForm, int nCount, const RGNDATA* pRgnData)
\r
1096 ATLASSERT(m_hRgn == NULL);
\r
1097 m_hRgn = ::ExtCreateRegion(lpXForm, nCount, pRgnData);
\r
1100 #endif // !_WIN32_WCE
\r
1102 BOOL DeleteObject()
\r
1104 ATLASSERT(m_hRgn != NULL);
\r
1105 BOOL bRet = ::DeleteObject(m_hRgn);
\r
1112 void SetRectRgn(int x1, int y1, int x2, int y2)
\r
1114 ATLASSERT(m_hRgn != NULL);
\r
1115 ::SetRectRgn(m_hRgn, x1, y1, x2, y2);
\r
1118 void SetRectRgn(LPCRECT lpRect)
\r
1120 ATLASSERT(m_hRgn != NULL);
\r
1121 ::SetRectRgn(m_hRgn, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
\r
1124 int CombineRgn(HRGN hRgnSrc1, HRGN hRgnSrc2, int nCombineMode)
\r
1126 ATLASSERT(m_hRgn != NULL);
\r
1127 return ::CombineRgn(m_hRgn, hRgnSrc1, hRgnSrc2, nCombineMode);
\r
1130 int CombineRgn(HRGN hRgnSrc, int nCombineMode)
\r
1132 ATLASSERT(m_hRgn != NULL);
\r
1133 return ::CombineRgn(m_hRgn, m_hRgn, hRgnSrc, nCombineMode);
\r
1136 int CopyRgn(HRGN hRgnSrc)
\r
1138 ATLASSERT(m_hRgn != NULL);
\r
1139 return ::CombineRgn(m_hRgn, hRgnSrc, NULL, RGN_COPY);
\r
1142 BOOL EqualRgn(HRGN hRgn) const
\r
1144 ATLASSERT(m_hRgn != NULL);
\r
1145 return ::EqualRgn(m_hRgn, hRgn);
\r
1148 int OffsetRgn(int x, int y)
\r
1150 ATLASSERT(m_hRgn != NULL);
\r
1151 return ::OffsetRgn(m_hRgn, x, y);
\r
1154 int OffsetRgn(POINT point)
\r
1156 ATLASSERT(m_hRgn != NULL);
\r
1157 return ::OffsetRgn(m_hRgn, point.x, point.y);
\r
1160 int GetRgnBox(LPRECT lpRect) const
\r
1162 ATLASSERT(m_hRgn != NULL);
\r
1163 return ::GetRgnBox(m_hRgn, lpRect);
\r
1166 BOOL PtInRegion(int x, int y) const
\r
1168 ATLASSERT(m_hRgn != NULL);
\r
1169 return ::PtInRegion(m_hRgn, x, y);
\r
1172 BOOL PtInRegion(POINT point) const
\r
1174 ATLASSERT(m_hRgn != NULL);
\r
1175 return ::PtInRegion(m_hRgn, point.x, point.y);
\r
1178 BOOL RectInRegion(LPCRECT lpRect) const
\r
1180 ATLASSERT(m_hRgn != NULL);
\r
1181 return ::RectInRegion(m_hRgn, lpRect);
\r
1184 int GetRegionData(LPRGNDATA lpRgnData, int nDataSize) const
\r
1186 ATLASSERT(m_hRgn != NULL);
\r
1187 return (int)::GetRegionData(m_hRgn, nDataSize, lpRgnData);
\r
1191 typedef CRgnT<false> CRgnHandle;
\r
1192 typedef CRgnT<true> CRgn;
\r
1195 ///////////////////////////////////////////////////////////////////////////////
\r
1196 // CDC - The device context class
\r
1198 template <bool t_bManaged>
\r
1205 // Constructor/destructor/operators
\r
1206 CDCT(HDC hDC = NULL) : m_hDC(hDC)
\r
1212 if(t_bManaged && m_hDC != NULL)
\r
1213 ::DeleteDC(Detach());
\r
1216 CDCT<t_bManaged>& operator =(HDC hDC)
\r
1222 void Attach(HDC hDC)
\r
1224 if(t_bManaged && m_hDC != NULL && m_hDC != hDC)
\r
1225 ::DeleteDC(m_hDC);
\r
1236 operator HDC() const { return m_hDC; }
\r
1238 bool IsNull() const { return (m_hDC == NULL); }
\r
1241 #ifndef _WIN32_WCE
\r
1242 HWND WindowFromDC() const
\r
1244 ATLASSERT(m_hDC != NULL);
\r
1245 return ::WindowFromDC(m_hDC);
\r
1247 #endif // !_WIN32_WCE
\r
1249 CPenHandle GetCurrentPen() const
\r
1251 ATLASSERT(m_hDC != NULL);
\r
1252 return CPenHandle((HPEN)::GetCurrentObject(m_hDC, OBJ_PEN));
\r
1255 CBrushHandle GetCurrentBrush() const
\r
1257 ATLASSERT(m_hDC != NULL);
\r
1258 return CBrushHandle((HBRUSH)::GetCurrentObject(m_hDC, OBJ_BRUSH));
\r
1261 CPaletteHandle GetCurrentPalette() const
\r
1263 ATLASSERT(m_hDC != NULL);
\r
1264 return CPaletteHandle((HPALETTE)::GetCurrentObject(m_hDC, OBJ_PAL));
\r
1267 CFontHandle GetCurrentFont() const
\r
1269 ATLASSERT(m_hDC != NULL);
\r
1270 return CFontHandle((HFONT)::GetCurrentObject(m_hDC, OBJ_FONT));
\r
1273 CBitmapHandle GetCurrentBitmap() const
\r
1275 ATLASSERT(m_hDC != NULL);
\r
1276 return CBitmapHandle((HBITMAP)::GetCurrentObject(m_hDC, OBJ_BITMAP));
\r
1279 HDC CreateDC(LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName, LPCTSTR lpszOutput, const DEVMODE* lpInitData)
\r
1281 ATLASSERT(m_hDC == NULL);
\r
1282 m_hDC = ::CreateDC(lpszDriverName, lpszDeviceName, lpszOutput, lpInitData);
\r
1286 HDC CreateCompatibleDC(HDC hDC = NULL)
\r
1288 ATLASSERT(m_hDC == NULL);
\r
1289 m_hDC = ::CreateCompatibleDC(hDC);
\r
1297 BOOL bRet = ::DeleteDC(m_hDC);
\r
1303 // Device-Context Functions
\r
1306 ATLASSERT(m_hDC != NULL);
\r
1307 return ::SaveDC(m_hDC);
\r
1310 BOOL RestoreDC(int nSavedDC)
\r
1312 ATLASSERT(m_hDC != NULL);
\r
1313 return ::RestoreDC(m_hDC, nSavedDC);
\r
1316 int GetDeviceCaps(int nIndex) const
\r
1318 ATLASSERT(m_hDC != NULL);
\r
1319 return ::GetDeviceCaps(m_hDC, nIndex);
\r
1322 #ifndef _WIN32_WCE
\r
1323 UINT SetBoundsRect(LPCRECT lpRectBounds, UINT flags)
\r
1325 ATLASSERT(m_hDC != NULL);
\r
1326 return ::SetBoundsRect(m_hDC, lpRectBounds, flags);
\r
1329 UINT GetBoundsRect(LPRECT lpRectBounds, UINT flags) const
\r
1331 ATLASSERT(m_hDC != NULL);
\r
1332 return ::GetBoundsRect(m_hDC, lpRectBounds, flags);
\r
1335 BOOL ResetDC(const DEVMODE* lpDevMode)
\r
1337 ATLASSERT(m_hDC != NULL);
\r
1338 return ::ResetDC(m_hDC, lpDevMode) != NULL;
\r
1341 // Drawing-Tool Functions
\r
1342 BOOL GetBrushOrg(LPPOINT lpPoint) const
\r
1344 ATLASSERT(m_hDC != NULL);
\r
1345 return ::GetBrushOrgEx(m_hDC, lpPoint);
\r
1347 #endif // !_WIN32_WCE
\r
1349 BOOL SetBrushOrg(int x, int y, LPPOINT lpPoint = NULL)
\r
1351 ATLASSERT(m_hDC != NULL);
\r
1352 return ::SetBrushOrgEx(m_hDC, x, y, lpPoint);
\r
1355 BOOL SetBrushOrg(POINT point, LPPOINT lpPointRet = NULL)
\r
1357 ATLASSERT(m_hDC != NULL);
\r
1358 return ::SetBrushOrgEx(m_hDC, point.x, point.y, lpPointRet);
\r
1361 #ifndef _WIN32_WCE
\r
1362 int EnumObjects(int nObjectType, int (CALLBACK* lpfn)(LPVOID, LPARAM), LPARAM lpData)
\r
1364 ATLASSERT(m_hDC != NULL);
\r
1366 return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, lpData);
\r
1368 return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, (LPVOID)lpData);
\r
1371 #endif // !_WIN32_WCE
\r
1373 // Type-safe selection helpers
\r
1374 HPEN SelectPen(HPEN hPen)
\r
1376 ATLASSERT(m_hDC != NULL);
\r
1377 #ifndef _WIN32_WCE
\r
1378 ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN || ::GetObjectType(hPen) == OBJ_EXTPEN);
\r
1379 #else // CE specific
\r
1380 ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN);
\r
1381 #endif // _WIN32_WCE
\r
1382 return (HPEN)::SelectObject(m_hDC, hPen);
\r
1385 HBRUSH SelectBrush(HBRUSH hBrush)
\r
1387 ATLASSERT(m_hDC != NULL);
\r
1388 ATLASSERT(hBrush == NULL || ::GetObjectType(hBrush) == OBJ_BRUSH);
\r
1389 return (HBRUSH)::SelectObject(m_hDC, hBrush);
\r
1392 HFONT SelectFont(HFONT hFont)
\r
1394 ATLASSERT(m_hDC != NULL);
\r
1395 ATLASSERT(hFont == NULL || ::GetObjectType(hFont) == OBJ_FONT);
\r
1396 return (HFONT)::SelectObject(m_hDC, hFont);
\r
1399 HBITMAP SelectBitmap(HBITMAP hBitmap)
\r
1401 ATLASSERT(m_hDC != NULL);
\r
1402 ATLASSERT(hBitmap == NULL || ::GetObjectType(hBitmap) == OBJ_BITMAP);
\r
1403 return (HBITMAP)::SelectObject(m_hDC, hBitmap);
\r
1406 int SelectRgn(HRGN hRgn) // special return for regions
\r
1408 ATLASSERT(m_hDC != NULL);
\r
1409 ATLASSERT(hRgn == NULL || ::GetObjectType(hRgn) == OBJ_REGION);
\r
1410 return PtrToInt(::SelectObject(m_hDC, hRgn));
\r
1413 // Type-safe selection helpers for stock objects
\r
1414 HPEN SelectStockPen(int nPen)
\r
1416 ATLASSERT(m_hDC != NULL);
\r
1417 #if (_WIN32_WINNT >= 0x0500)
\r
1418 ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN || nPen == DC_PEN);
\r
1420 ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN);
\r
1421 #endif // !(_WIN32_WINNT >= 0x0500)
\r
1422 return SelectPen((HPEN)::GetStockObject(nPen));
\r
1425 HBRUSH SelectStockBrush(int nBrush)
\r
1427 #if (_WIN32_WINNT >= 0x0500)
\r
1428 ATLASSERT((nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH) || nBrush == DC_BRUSH);
\r
1430 ATLASSERT(nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH);
\r
1431 #endif // !(_WIN32_WINNT >= 0x0500)
\r
1432 return SelectBrush((HBRUSH)::GetStockObject(nBrush));
\r
1435 HFONT SelectStockFont(int nFont)
\r
1437 #ifndef _WIN32_WCE
\r
1438 ATLASSERT((nFont >= OEM_FIXED_FONT && nFont <= SYSTEM_FIXED_FONT) || nFont == DEFAULT_GUI_FONT);
\r
1439 #else // CE specific
\r
1440 ATLASSERT(nFont == SYSTEM_FONT);
\r
1441 #endif // _WIN32_WCE
\r
1442 return SelectFont((HFONT)::GetStockObject(nFont));
\r
1445 HPALETTE SelectStockPalette(int nPalette, BOOL bForceBackground)
\r
1447 ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supported
\r
1448 return SelectPalette((HPALETTE)::GetStockObject(nPalette), bForceBackground);
\r
1451 // Color and Color Palette Functions
\r
1452 COLORREF GetNearestColor(COLORREF crColor) const
\r
1454 ATLASSERT(m_hDC != NULL);
\r
1455 return ::GetNearestColor(m_hDC, crColor);
\r
1458 HPALETTE SelectPalette(HPALETTE hPalette, BOOL bForceBackground)
\r
1460 ATLASSERT(m_hDC != NULL);
\r
1462 return ::SelectPalette(m_hDC, hPalette, bForceBackground);
\r
1465 UINT RealizePalette()
\r
1467 ATLASSERT(m_hDC != NULL);
\r
1468 return ::RealizePalette(m_hDC);
\r
1471 #ifndef _WIN32_WCE
\r
1472 void UpdateColors()
\r
1474 ATLASSERT(m_hDC != NULL);
\r
1475 ::UpdateColors(m_hDC);
\r
1477 #endif // !_WIN32_WCE
\r
1479 // Drawing-Attribute Functions
\r
1480 COLORREF GetBkColor() const
\r
1482 ATLASSERT(m_hDC != NULL);
\r
1483 return ::GetBkColor(m_hDC);
\r
1486 int GetBkMode() const
\r
1488 ATLASSERT(m_hDC != NULL);
\r
1489 return ::GetBkMode(m_hDC);
\r
1492 #ifndef _WIN32_WCE
\r
1493 int GetPolyFillMode() const
\r
1495 ATLASSERT(m_hDC != NULL);
\r
1496 return ::GetPolyFillMode(m_hDC);
\r
1499 int GetROP2() const
\r
1501 ATLASSERT(m_hDC != NULL);
\r
1502 return ::GetROP2(m_hDC);
\r
1505 int GetStretchBltMode() const
\r
1507 ATLASSERT(m_hDC != NULL);
\r
1508 return ::GetStretchBltMode(m_hDC);
\r
1510 #endif // !_WIN32_WCE
\r
1512 COLORREF GetTextColor() const
\r
1514 ATLASSERT(m_hDC != NULL);
\r
1515 return ::GetTextColor(m_hDC);
\r
1518 COLORREF SetBkColor(COLORREF crColor)
\r
1520 ATLASSERT(m_hDC != NULL);
\r
1521 return ::SetBkColor(m_hDC, crColor);
\r
1524 int SetBkMode(int nBkMode)
\r
1526 ATLASSERT(m_hDC != NULL);
\r
1527 return ::SetBkMode(m_hDC, nBkMode);
\r
1530 #ifndef _WIN32_WCE
\r
1531 int SetPolyFillMode(int nPolyFillMode)
\r
1533 ATLASSERT(m_hDC != NULL);
\r
1534 return ::SetPolyFillMode(m_hDC, nPolyFillMode);
\r
1536 #endif // !_WIN32_WCE
\r
1538 int SetROP2(int nDrawMode)
\r
1540 ATLASSERT(m_hDC != NULL);
\r
1541 return ::SetROP2(m_hDC, nDrawMode);
\r
1544 #ifndef _WIN32_WCE
\r
1545 int SetStretchBltMode(int nStretchMode)
\r
1547 ATLASSERT(m_hDC != NULL);
\r
1548 return ::SetStretchBltMode(m_hDC, nStretchMode);
\r
1550 #endif // !_WIN32_WCE
\r
1552 COLORREF SetTextColor(COLORREF crColor)
\r
1554 ATLASSERT(m_hDC != NULL);
\r
1555 return ::SetTextColor(m_hDC, crColor);
\r
1558 #ifndef _WIN32_WCE
\r
1559 BOOL GetColorAdjustment(LPCOLORADJUSTMENT lpColorAdjust) const
\r
1561 ATLASSERT(m_hDC != NULL);
\r
1562 return ::GetColorAdjustment(m_hDC, lpColorAdjust);
\r
1565 BOOL SetColorAdjustment(const COLORADJUSTMENT* lpColorAdjust)
\r
1567 ATLASSERT(m_hDC != NULL);
\r
1568 return ::SetColorAdjustment(m_hDC, lpColorAdjust);
\r
1571 // Mapping Functions
\r
1572 int GetMapMode() const
\r
1574 ATLASSERT(m_hDC != NULL);
\r
1575 return ::GetMapMode(m_hDC);
\r
1578 BOOL GetViewportOrg(LPPOINT lpPoint) const
\r
1580 ATLASSERT(m_hDC != NULL);
\r
1581 return ::GetViewportOrgEx(m_hDC, lpPoint);
\r
1584 int SetMapMode(int nMapMode)
\r
1586 ATLASSERT(m_hDC != NULL);
\r
1587 return ::SetMapMode(m_hDC, nMapMode);
\r
1589 #endif // !_WIN32_WCE
\r
1591 // Viewport Origin
\r
1592 BOOL SetViewportOrg(int x, int y, LPPOINT lpPoint = NULL)
\r
1594 ATLASSERT(m_hDC != NULL);
\r
1595 return ::SetViewportOrgEx(m_hDC, x, y, lpPoint);
\r
1598 BOOL SetViewportOrg(POINT point, LPPOINT lpPointRet = NULL)
\r
1600 ATLASSERT(m_hDC != NULL);
\r
1601 return SetViewportOrg(point.x, point.y, lpPointRet);
\r
1604 #ifndef _WIN32_WCE
\r
1605 BOOL OffsetViewportOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL)
\r
1607 ATLASSERT(m_hDC != NULL);
\r
1608 return ::OffsetViewportOrgEx(m_hDC, nWidth, nHeight, lpPoint);
\r
1611 // Viewport Extent
\r
1612 BOOL GetViewportExt(LPSIZE lpSize) const
\r
1614 ATLASSERT(m_hDC != NULL);
\r
1615 return ::GetViewportExtEx(m_hDC, lpSize);
\r
1618 BOOL SetViewportExt(int x, int y, LPSIZE lpSize = NULL)
\r
1620 ATLASSERT(m_hDC != NULL);
\r
1621 return ::SetViewportExtEx(m_hDC, x, y, lpSize);
\r
1624 BOOL SetViewportExt(SIZE size, LPSIZE lpSizeRet = NULL)
\r
1626 ATLASSERT(m_hDC != NULL);
\r
1627 return SetViewportExt(size.cx, size.cy, lpSizeRet);
\r
1630 BOOL ScaleViewportExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL)
\r
1632 ATLASSERT(m_hDC != NULL);
\r
1633 return ::ScaleViewportExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize);
\r
1635 #endif // !_WIN32_WCE
\r
1638 #ifndef _WIN32_WCE
\r
1639 BOOL GetWindowOrg(LPPOINT lpPoint) const
\r
1641 ATLASSERT(m_hDC != NULL);
\r
1642 return ::GetWindowOrgEx(m_hDC, lpPoint);
\r
1645 BOOL SetWindowOrg(int x, int y, LPPOINT lpPoint = NULL)
\r
1647 ATLASSERT(m_hDC != NULL);
\r
1648 return ::SetWindowOrgEx(m_hDC, x, y, lpPoint);
\r
1651 BOOL SetWindowOrg(POINT point, LPPOINT lpPointRet = NULL)
\r
1653 ATLASSERT(m_hDC != NULL);
\r
1654 return SetWindowOrg(point.x, point.y, lpPointRet);
\r
1657 BOOL OffsetWindowOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL)
\r
1659 ATLASSERT(m_hDC != NULL);
\r
1660 return ::OffsetWindowOrgEx(m_hDC, nWidth, nHeight, lpPoint);
\r
1664 BOOL GetWindowExt(LPSIZE lpSize) const
\r
1666 ATLASSERT(m_hDC != NULL);
\r
1667 return ::GetWindowExtEx(m_hDC, lpSize);
\r
1670 BOOL SetWindowExt(int x, int y, LPSIZE lpSize = NULL)
\r
1672 ATLASSERT(m_hDC != NULL);
\r
1673 return ::SetWindowExtEx(m_hDC, x, y, lpSize);
\r
1676 BOOL SetWindowExt(SIZE size, LPSIZE lpSizeRet = NULL)
\r
1678 ATLASSERT(m_hDC != NULL);
\r
1679 return SetWindowExt(size.cx, size.cy, lpSizeRet);
\r
1682 BOOL ScaleWindowExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL)
\r
1684 ATLASSERT(m_hDC != NULL);
\r
1685 return ::ScaleWindowExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize);
\r
1688 // Coordinate Functions
\r
1689 BOOL DPtoLP(LPPOINT lpPoints, int nCount = 1) const
\r
1691 ATLASSERT(m_hDC != NULL);
\r
1692 return ::DPtoLP(m_hDC, lpPoints, nCount);
\r
1695 BOOL DPtoLP(LPRECT lpRect) const
\r
1697 ATLASSERT(m_hDC != NULL);
\r
1698 return ::DPtoLP(m_hDC, (LPPOINT)lpRect, 2);
\r
1701 BOOL DPtoLP(LPSIZE lpSize) const
\r
1703 SIZE sizeWinExt = { 0, 0 };
\r
1704 if(!GetWindowExt(&sizeWinExt))
\r
1706 SIZE sizeVpExt = { 0, 0 };
\r
1707 if(!GetViewportExt(&sizeVpExt))
\r
1709 lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeWinExt.cx), abs(sizeVpExt.cx));
\r
1710 lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeWinExt.cy), abs(sizeVpExt.cy));
\r
1714 BOOL LPtoDP(LPPOINT lpPoints, int nCount = 1) const
\r
1716 ATLASSERT(m_hDC != NULL);
\r
1717 return ::LPtoDP(m_hDC, lpPoints, nCount);
\r
1720 BOOL LPtoDP(LPRECT lpRect) const
\r
1722 ATLASSERT(m_hDC != NULL);
\r
1723 return ::LPtoDP(m_hDC, (LPPOINT)lpRect, 2);
\r
1726 BOOL LPtoDP(LPSIZE lpSize) const
\r
1728 SIZE sizeWinExt = { 0, 0 };
\r
1729 if(!GetWindowExt(&sizeWinExt))
\r
1731 SIZE sizeVpExt = { 0, 0 };
\r
1732 if(!GetViewportExt(&sizeVpExt))
\r
1734 lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeVpExt.cx), abs(sizeWinExt.cx));
\r
1735 lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeVpExt.cy), abs(sizeWinExt.cy));
\r
1739 // Special Coordinate Functions (useful for dealing with metafiles and OLE)
\r
1740 #define HIMETRIC_INCH 2540 // HIMETRIC units per inch
\r
1742 void DPtoHIMETRIC(LPSIZE lpSize) const
\r
1744 ATLASSERT(m_hDC != NULL);
\r
1746 if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT)
\r
1748 // when using a constrained map mode, map against physical inch
\r
1749 ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC);
\r
1751 ((CDCHandle*)this)->SetMapMode(nMapMode);
\r
1755 // map against logical inch for non-constrained mapping modes
\r
1756 int cxPerInch = GetDeviceCaps(LOGPIXELSX);
\r
1757 int cyPerInch = GetDeviceCaps(LOGPIXELSY);
\r
1758 ATLASSERT(cxPerInch != 0 && cyPerInch != 0);
\r
1759 lpSize->cx = ::MulDiv(lpSize->cx, HIMETRIC_INCH, cxPerInch);
\r
1760 lpSize->cy = ::MulDiv(lpSize->cy, HIMETRIC_INCH, cyPerInch);
\r
1764 void HIMETRICtoDP(LPSIZE lpSize) const
\r
1766 ATLASSERT(m_hDC != NULL);
\r
1768 if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT)
\r
1770 // when using a constrained map mode, map against physical inch
\r
1771 ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC);
\r
1773 ((CDCHandle*)this)->SetMapMode(nMapMode);
\r
1777 // map against logical inch for non-constrained mapping modes
\r
1778 int cxPerInch = GetDeviceCaps(LOGPIXELSX);
\r
1779 int cyPerInch = GetDeviceCaps(LOGPIXELSY);
\r
1780 ATLASSERT(cxPerInch != 0 && cyPerInch != 0);
\r
1781 lpSize->cx = ::MulDiv(lpSize->cx, cxPerInch, HIMETRIC_INCH);
\r
1782 lpSize->cy = ::MulDiv(lpSize->cy, cyPerInch, HIMETRIC_INCH);
\r
1786 void LPtoHIMETRIC(LPSIZE lpSize) const
\r
1789 DPtoHIMETRIC(lpSize);
\r
1792 void HIMETRICtoLP(LPSIZE lpSize) const
\r
1794 HIMETRICtoDP(lpSize);
\r
1797 #endif // !_WIN32_WCE
\r
1799 // Region Functions
\r
1800 BOOL FillRgn(HRGN hRgn, HBRUSH hBrush)
\r
1802 ATLASSERT(m_hDC != NULL);
\r
1803 return ::FillRgn(m_hDC, hRgn, hBrush);
\r
1806 #ifndef _WIN32_WCE
\r
1807 BOOL FrameRgn(HRGN hRgn, HBRUSH hBrush, int nWidth, int nHeight)
\r
1809 ATLASSERT(m_hDC != NULL);
\r
1810 return ::FrameRgn(m_hDC, hRgn, hBrush, nWidth, nHeight);
\r
1813 BOOL InvertRgn(HRGN hRgn)
\r
1815 ATLASSERT(m_hDC != NULL);
\r
1816 return ::InvertRgn(m_hDC, hRgn);
\r
1819 BOOL PaintRgn(HRGN hRgn)
\r
1821 ATLASSERT(m_hDC != NULL);
\r
1822 return ::PaintRgn(m_hDC, hRgn);
\r
1824 #endif // !_WIN32_WCE
\r
1826 // Clipping Functions
\r
1827 int GetClipBox(LPRECT lpRect) const
\r
1829 ATLASSERT(m_hDC != NULL);
\r
1830 return ::GetClipBox(m_hDC, lpRect);
\r
1833 int GetClipRgn(CRgn& region) const
\r
1835 ATLASSERT(m_hDC != NULL);
\r
1836 if(region.IsNull())
\r
1837 region.CreateRectRgn(0, 0, 0, 0);
\r
1839 int nRet = ::GetClipRgn(m_hDC, region);
\r
1841 region.DeleteObject();
\r
1846 #ifndef _WIN32_WCE
\r
1847 BOOL PtVisible(int x, int y) const
\r
1849 ATLASSERT(m_hDC != NULL);
\r
1850 return ::PtVisible(m_hDC, x, y);
\r
1853 BOOL PtVisible(POINT point) const
\r
1855 ATLASSERT(m_hDC != NULL);
\r
1856 return ::PtVisible(m_hDC, point.x, point.y);
\r
1858 #endif // !_WIN32_WCE
\r
1860 BOOL RectVisible(LPCRECT lpRect) const
\r
1862 ATLASSERT(m_hDC != NULL);
\r
1863 return ::RectVisible(m_hDC, lpRect);
\r
1866 int SelectClipRgn(HRGN hRgn)
\r
1868 ATLASSERT(m_hDC != NULL);
\r
1869 return ::SelectClipRgn(m_hDC, (HRGN)hRgn);
\r
1872 int ExcludeClipRect(int x1, int y1, int x2, int y2)
\r
1874 ATLASSERT(m_hDC != NULL);
\r
1875 return ::ExcludeClipRect(m_hDC, x1, y1, x2, y2);
\r
1878 int ExcludeClipRect(LPCRECT lpRect)
\r
1880 ATLASSERT(m_hDC != NULL);
\r
1881 return ::ExcludeClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
\r
1884 #ifndef _WIN32_WCE
\r
1885 int ExcludeUpdateRgn(HWND hWnd)
\r
1887 ATLASSERT(m_hDC != NULL);
\r
1888 return ::ExcludeUpdateRgn(m_hDC, hWnd);
\r
1890 #endif // !_WIN32_WCE
\r
1892 int IntersectClipRect(int x1, int y1, int x2, int y2)
\r
1894 ATLASSERT(m_hDC != NULL);
\r
1895 return ::IntersectClipRect(m_hDC, x1, y1, x2, y2);
\r
1898 int IntersectClipRect(LPCRECT lpRect)
\r
1900 ATLASSERT(m_hDC != NULL);
\r
1901 return ::IntersectClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
\r
1904 #ifndef _WIN32_WCE
\r
1905 int OffsetClipRgn(int x, int y)
\r
1907 ATLASSERT(m_hDC != NULL);
\r
1908 return ::OffsetClipRgn(m_hDC, x, y);
\r
1911 int OffsetClipRgn(SIZE size)
\r
1913 ATLASSERT(m_hDC != NULL);
\r
1914 return ::OffsetClipRgn(m_hDC, size.cx, size.cy);
\r
1917 int SelectClipRgn(HRGN hRgn, int nMode)
\r
1919 ATLASSERT(m_hDC != NULL);
\r
1920 return ::ExtSelectClipRgn(m_hDC, hRgn, nMode);
\r
1922 #endif // !_WIN32_WCE
\r
1924 // Line-Output Functions
\r
1925 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
\r
1926 BOOL GetCurrentPosition(LPPOINT lpPoint) const
\r
1928 ATLASSERT(m_hDC != NULL);
\r
1929 return ::GetCurrentPositionEx(m_hDC, lpPoint);
\r
1932 BOOL MoveTo(int x, int y, LPPOINT lpPoint = NULL)
\r
1934 ATLASSERT(m_hDC != NULL);
\r
1935 return ::MoveToEx(m_hDC, x, y, lpPoint);
\r
1938 BOOL MoveTo(POINT point, LPPOINT lpPointRet = NULL)
\r
1940 ATLASSERT(m_hDC != NULL);
\r
1941 return MoveTo(point.x, point.y, lpPointRet);
\r
1944 BOOL LineTo(int x, int y)
\r
1946 ATLASSERT(m_hDC != NULL);
\r
1947 return ::LineTo(m_hDC, x, y);
\r
1950 BOOL LineTo(POINT point)
\r
1952 ATLASSERT(m_hDC != NULL);
\r
1953 return LineTo(point.x, point.y);
\r
1955 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
\r
1957 #ifndef _WIN32_WCE
\r
1958 BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
\r
1960 ATLASSERT(m_hDC != NULL);
\r
1961 return ::Arc(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);
\r
1964 BOOL Arc(LPCRECT lpRect, POINT ptStart, POINT ptEnd)
\r
1966 ATLASSERT(m_hDC != NULL);
\r
1967 return ::Arc(m_hDC, lpRect->left, lpRect->top,
\r
1968 lpRect->right, lpRect->bottom, ptStart.x, ptStart.y,
\r
1969 ptEnd.x, ptEnd.y);
\r
1971 #endif // !_WIN32_WCE
\r
1973 BOOL Polyline(LPPOINT lpPoints, int nCount)
\r
1975 ATLASSERT(m_hDC != NULL);
\r
1976 return ::Polyline(m_hDC, lpPoints, nCount);
\r
1979 #ifndef _WIN32_WCE
\r
1980 BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweepAngle)
\r
1982 ATLASSERT(m_hDC != NULL);
\r
1983 return ::AngleArc(m_hDC, x, y, nRadius, fStartAngle, fSweepAngle);
\r
1986 BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
\r
1988 ATLASSERT(m_hDC != NULL);
\r
1989 return ::ArcTo(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);
\r
1992 BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd)
\r
1994 ATLASSERT(m_hDC != NULL);
\r
1995 return ArcTo(lpRect->left, lpRect->top, lpRect->right,
\r
1996 lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);
\r
1999 int GetArcDirection() const
\r
2001 ATLASSERT(m_hDC != NULL);
\r
2002 return ::GetArcDirection(m_hDC);
\r
2005 int SetArcDirection(int nArcDirection)
\r
2007 ATLASSERT(m_hDC != NULL);
\r
2008 return ::SetArcDirection(m_hDC, nArcDirection);
\r
2011 BOOL PolyDraw(const POINT* lpPoints, const BYTE* lpTypes, int nCount)
\r
2013 ATLASSERT(m_hDC != NULL);
\r
2014 return ::PolyDraw(m_hDC, lpPoints, lpTypes, nCount);
\r
2017 BOOL PolylineTo(const POINT* lpPoints, int nCount)
\r
2019 ATLASSERT(m_hDC != NULL);
\r
2020 return ::PolylineTo(m_hDC, lpPoints, nCount);
\r
2023 BOOL PolyPolyline(const POINT* lpPoints,
\r
2024 const DWORD* lpPolyPoints, int nCount)
\r
2026 ATLASSERT(m_hDC != NULL);
\r
2027 return ::PolyPolyline(m_hDC, lpPoints, lpPolyPoints, nCount);
\r
2030 BOOL PolyBezier(const POINT* lpPoints, int nCount)
\r
2032 ATLASSERT(m_hDC != NULL);
\r
2033 return ::PolyBezier(m_hDC, lpPoints, nCount);
\r
2036 BOOL PolyBezierTo(const POINT* lpPoints, int nCount)
\r
2038 ATLASSERT(m_hDC != NULL);
\r
2039 return ::PolyBezierTo(m_hDC, lpPoints, nCount);
\r
2041 #endif // !_WIN32_WCE
\r
2043 // Simple Drawing Functions
\r
2044 BOOL FillRect(LPCRECT lpRect, HBRUSH hBrush)
\r
2046 ATLASSERT(m_hDC != NULL);
\r
2047 return ::FillRect(m_hDC, lpRect, hBrush);
\r
2050 BOOL FillRect(LPCRECT lpRect, int nColorIndex)
\r
2052 ATLASSERT(m_hDC != NULL);
\r
2053 #ifndef _WIN32_WCE
\r
2054 return ::FillRect(m_hDC, lpRect, (HBRUSH)LongToPtr(nColorIndex + 1));
\r
2055 #else // CE specific
\r
2056 return ::FillRect(m_hDC, lpRect, ::GetSysColorBrush(nColorIndex));
\r
2057 #endif // _WIN32_WCE
\r
2060 #ifndef _WIN32_WCE
\r
2061 BOOL FrameRect(LPCRECT lpRect, HBRUSH hBrush)
\r
2063 ATLASSERT(m_hDC != NULL);
\r
2064 return ::FrameRect(m_hDC, lpRect, hBrush);
\r
2066 #endif // !_WIN32_WCE
\r
2068 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)
\r
2069 BOOL InvertRect(LPCRECT lpRect)
\r
2071 ATLASSERT(m_hDC != NULL);
\r
2072 return ::InvertRect(m_hDC, lpRect);
\r
2074 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)
\r
2076 BOOL DrawIcon(int x, int y, HICON hIcon)
\r
2078 ATLASSERT(m_hDC != NULL);
\r
2079 #ifndef _WIN32_WCE
\r
2080 return ::DrawIcon(m_hDC, x, y, hIcon);
\r
2081 #else // CE specific
\r
2082 return ::DrawIconEx(m_hDC, x, y, hIcon, 0, 0, 0, NULL, DI_NORMAL);
\r
2083 #endif // _WIN32_WCE
\r
2086 BOOL DrawIcon(POINT point, HICON hIcon)
\r
2088 ATLASSERT(m_hDC != NULL);
\r
2089 #ifndef _WIN32_WCE
\r
2090 return ::DrawIcon(m_hDC, point.x, point.y, hIcon);
\r
2091 #else // CE specific
\r
2092 return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, 0, 0, 0, NULL, DI_NORMAL);
\r
2093 #endif // _WIN32_WCE
\r
2096 BOOL DrawIconEx(int x, int y, HICON hIcon, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)
\r
2098 ATLASSERT(m_hDC != NULL);
\r
2099 return ::DrawIconEx(m_hDC, x, y, hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags);
\r
2102 BOOL DrawIconEx(POINT point, HICON hIcon, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL)
\r
2104 ATLASSERT(m_hDC != NULL);
\r
2105 return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags);
\r
2108 #ifndef _WIN32_WCE
\r
2109 BOOL DrawState(POINT pt, SIZE size, HBITMAP hBitmap, UINT nFlags, HBRUSH hBrush = NULL)
\r
2111 ATLASSERT(m_hDC != NULL);
\r
2112 return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hBitmap, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_BITMAP);
\r
2115 BOOL DrawState(POINT pt, SIZE size, HICON hIcon, UINT nFlags, HBRUSH hBrush = NULL)
\r
2117 ATLASSERT(m_hDC != NULL);
\r
2118 return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hIcon, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_ICON);
\r
2121 BOOL DrawState(POINT pt, SIZE size, LPCTSTR lpszText, UINT nFlags, BOOL bPrefixText = TRUE, int nTextLen = 0, HBRUSH hBrush = NULL)
\r
2123 ATLASSERT(m_hDC != NULL);
\r
2124 return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)lpszText, (WPARAM)nTextLen, pt.x, pt.y, size.cx, size.cy, nFlags | (bPrefixText ? DST_PREFIXTEXT : DST_TEXT));
\r
2127 BOOL DrawState(POINT pt, SIZE size, DRAWSTATEPROC lpDrawProc, LPARAM lData, UINT nFlags, HBRUSH hBrush = NULL)
\r
2129 ATLASSERT(m_hDC != NULL);
\r
2130 return ::DrawState(m_hDC, hBrush, lpDrawProc, lData, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_COMPLEX);
\r
2132 #endif // !_WIN32_WCE
\r
2134 // Ellipse and Polygon Functions
\r
2135 #ifndef _WIN32_WCE
\r
2136 BOOL Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
\r
2138 ATLASSERT(m_hDC != NULL);
\r
2139 return ::Chord(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);
\r
2142 BOOL Chord(LPCRECT lpRect, POINT ptStart, POINT ptEnd)
\r
2144 ATLASSERT(m_hDC != NULL);
\r
2145 return ::Chord(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);
\r
2147 #endif // !_WIN32_WCE
\r
2149 void DrawFocusRect(LPCRECT lpRect)
\r
2151 ATLASSERT(m_hDC != NULL);
\r
2152 ::DrawFocusRect(m_hDC, lpRect);
\r
2155 BOOL Ellipse(int x1, int y1, int x2, int y2)
\r
2157 ATLASSERT(m_hDC != NULL);
\r
2158 return ::Ellipse(m_hDC, x1, y1, x2, y2);
\r
2161 BOOL Ellipse(LPCRECT lpRect)
\r
2163 ATLASSERT(m_hDC != NULL);
\r
2164 return ::Ellipse(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
\r
2167 #ifndef _WIN32_WCE
\r
2168 BOOL Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
\r
2170 ATLASSERT(m_hDC != NULL);
\r
2171 return ::Pie(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4);
\r
2174 BOOL Pie(LPCRECT lpRect, POINT ptStart, POINT ptEnd)
\r
2176 ATLASSERT(m_hDC != NULL);
\r
2177 return ::Pie(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y);
\r
2179 #endif // !_WIN32_WCE
\r
2181 BOOL Polygon(LPPOINT lpPoints, int nCount)
\r
2183 ATLASSERT(m_hDC != NULL);
\r
2184 return ::Polygon(m_hDC, lpPoints, nCount);
\r
2187 #ifndef _WIN32_WCE
\r
2188 BOOL PolyPolygon(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount)
\r
2190 ATLASSERT(m_hDC != NULL);
\r
2191 return ::PolyPolygon(m_hDC, lpPoints, lpPolyCounts, nCount);
\r
2193 #endif // !_WIN32_WCE
\r
2195 BOOL Rectangle(int x1, int y1, int x2, int y2)
\r
2197 ATLASSERT(m_hDC != NULL);
\r
2198 return ::Rectangle(m_hDC, x1, y1, x2, y2);
\r
2201 BOOL Rectangle(LPCRECT lpRect)
\r
2203 ATLASSERT(m_hDC != NULL);
\r
2204 return ::Rectangle(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
\r
2207 BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3)
\r
2209 ATLASSERT(m_hDC != NULL);
\r
2210 return ::RoundRect(m_hDC, x1, y1, x2, y2, x3, y3);
\r
2213 BOOL RoundRect(LPCRECT lpRect, POINT point)
\r
2215 ATLASSERT(m_hDC != NULL);
\r
2216 return ::RoundRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, point.x, point.y);
\r
2219 // Bitmap Functions
\r
2220 BOOL PatBlt(int x, int y, int nWidth, int nHeight, DWORD dwRop)
\r
2222 ATLASSERT(m_hDC != NULL);
\r
2223 return ::PatBlt(m_hDC, x, y, nWidth, nHeight, dwRop);
\r
2226 BOOL BitBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC,
\r
2227 int xSrc, int ySrc, DWORD dwRop)
\r
2229 ATLASSERT(m_hDC != NULL);
\r
2230 return ::BitBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop);
\r
2233 BOOL StretchBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop)
\r
2235 ATLASSERT(m_hDC != NULL);
\r
2236 return ::StretchBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, dwRop);
\r
2239 COLORREF GetPixel(int x, int y) const
\r
2241 ATLASSERT(m_hDC != NULL);
\r
2242 return ::GetPixel(m_hDC, x, y);
\r
2245 COLORREF GetPixel(POINT point) const
\r
2247 ATLASSERT(m_hDC != NULL);
\r
2248 return ::GetPixel(m_hDC, point.x, point.y);
\r
2251 COLORREF SetPixel(int x, int y, COLORREF crColor)
\r
2253 ATLASSERT(m_hDC != NULL);
\r
2254 return ::SetPixel(m_hDC, x, y, crColor);
\r
2257 COLORREF SetPixel(POINT point, COLORREF crColor)
\r
2259 ATLASSERT(m_hDC != NULL);
\r
2260 return ::SetPixel(m_hDC, point.x, point.y, crColor);
\r
2263 #ifndef _WIN32_WCE
\r
2264 BOOL FloodFill(int x, int y, COLORREF crColor)
\r
2266 ATLASSERT(m_hDC != NULL);
\r
2267 return ::FloodFill(m_hDC, x, y, crColor);
\r
2270 BOOL ExtFloodFill(int x, int y, COLORREF crColor, UINT nFillType)
\r
2272 ATLASSERT(m_hDC != NULL);
\r
2273 return ::ExtFloodFill(m_hDC, x, y, crColor, nFillType);
\r
2275 #endif // !_WIN32_WCE
\r
2277 BOOL MaskBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, HBITMAP hMaskBitmap, int xMask, int yMask, DWORD dwRop)
\r
2279 ATLASSERT(m_hDC != NULL);
\r
2280 return ::MaskBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, hMaskBitmap, xMask, yMask, dwRop);
\r
2283 #ifndef _WIN32_WCE
\r
2284 BOOL PlgBlt(LPPOINT lpPoint, HDC hSrcDC, int xSrc, int ySrc, int nWidth, int nHeight, HBITMAP hMaskBitmap, int xMask, int yMask)
\r
2286 ATLASSERT(m_hDC != NULL);
\r
2287 return ::PlgBlt(m_hDC, lpPoint, hSrcDC, xSrc, ySrc, nWidth, nHeight, hMaskBitmap, xMask, yMask);
\r
2290 BOOL SetPixelV(int x, int y, COLORREF crColor)
\r
2292 ATLASSERT(m_hDC != NULL);
\r
2293 return ::SetPixelV(m_hDC, x, y, crColor);
\r
2296 BOOL SetPixelV(POINT point, COLORREF crColor)
\r
2298 ATLASSERT(m_hDC != NULL);
\r
2299 return ::SetPixelV(m_hDC, point.x, point.y, crColor);
\r
2301 #endif // !_WIN32_WCE
\r
2303 #if !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE)
\r
2304 #ifndef _WIN32_WCE
\r
2305 BOOL TransparentBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent)
\r
2307 ATLASSERT(m_hDC != NULL);
\r
2308 return ::TransparentBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent);
\r
2310 #else // CE specific
\r
2311 BOOL TransparentImage(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent)
\r
2313 ATLASSERT(m_hDC != NULL);
\r
2314 return ::TransparentImage(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent);
\r
2316 #endif // _WIN32_WCE
\r
2318 #if (!defined(_WIN32_WCE) || (_WIN32_WCE >= 420))
\r
2319 BOOL GradientFill(const PTRIVERTEX pVertices, DWORD nVertices, void* pMeshElements, DWORD nMeshElements, DWORD dwMode)
\r
2321 ATLASSERT(m_hDC != NULL);
\r
2322 return ::GradientFill(m_hDC, pVertices, nVertices, pMeshElements, nMeshElements, dwMode);
\r
2324 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420)
\r
2326 #if !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500)
\r
2327 BOOL AlphaBlend(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, BLENDFUNCTION bf)
\r
2329 ATLASSERT(m_hDC != NULL);
\r
2330 return ::AlphaBlend(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, bf);
\r
2332 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500)
\r
2333 #endif // !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE)
\r
2335 // Extra bitmap functions
\r
2336 // Helper function for painting a disabled toolbar or menu bitmap
\r
2337 // This function can take either an HBITMAP (for SS) or a DC with
\r
2338 // the bitmap already painted (for cmdbar)
\r
2339 BOOL DitherBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, HBITMAP hBitmap, int xSrc, int ySrc,
\r
2340 HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE),
\r
2341 HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT),
\r
2342 HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW))
\r
2344 ATLASSERT(m_hDC != NULL || hBitmap != NULL);
\r
2345 ATLASSERT(nWidth > 0 && nHeight > 0);
\r
2347 // Create a generic DC for all BitBlts
\r
2348 CDCHandle dc = (hSrcDC != NULL) ? hSrcDC : ::CreateCompatibleDC(m_hDC);
\r
2349 ATLASSERT(dc.m_hDC != NULL);
\r
2350 if(dc.m_hDC == NULL)
\r
2353 // Create a DC for the monochrome DIB section
\r
2354 CDC dcBW = ::CreateCompatibleDC(m_hDC);
\r
2355 ATLASSERT(dcBW.m_hDC != NULL);
\r
2356 if(dcBW.m_hDC == NULL)
\r
2358 if(hSrcDC == NULL)
\r
2363 // Create the monochrome DIB section with a black and white palette
\r
2364 struct RGBBWBITMAPINFO
\r
2366 BITMAPINFOHEADER bmiHeader;
\r
2367 RGBQUAD bmiColors[2];
\r
2370 RGBBWBITMAPINFO rgbBWBitmapInfo =
\r
2372 { sizeof(BITMAPINFOHEADER), nWidth, nHeight, 1, 1, BI_RGB, 0, 0, 0, 0, 0 },
\r
2373 { { 0x00, 0x00, 0x00, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x00 } }
\r
2377 CBitmap bmpBW = ::CreateDIBSection(dcBW, (LPBITMAPINFO)&rgbBWBitmapInfo, DIB_RGB_COLORS, &pbitsBW, NULL, 0);
\r
2378 ATLASSERT(bmpBW.m_hBitmap != NULL);
\r
2379 if(bmpBW.m_hBitmap == NULL)
\r
2381 if(hSrcDC == NULL)
\r
2386 // Attach the monochrome DIB section and the bitmap to the DCs
\r
2387 HBITMAP hbmOldBW = dcBW.SelectBitmap(bmpBW);
\r
2388 HBITMAP hbmOldDC = NULL;
\r
2389 if(hBitmap != NULL)
\r
2390 hbmOldDC = dc.SelectBitmap(hBitmap);
\r
2392 // Block: Dark gray removal: we want (128, 128, 128) pixels to become black and not white
\r
2394 CDC dcTemp1 = ::CreateCompatibleDC(m_hDC);
\r
2395 CDC dcTemp2 = ::CreateCompatibleDC(m_hDC);
\r
2397 bmpTemp1.CreateCompatibleBitmap(dc, nWidth, nHeight);
\r
2399 bmpTemp2.CreateBitmap(nWidth, nHeight, 1, 1, NULL);
\r
2400 HBITMAP hOldBmp1 = dcTemp1.SelectBitmap(bmpTemp1);
\r
2401 HBITMAP hOldBmp2 = dcTemp2.SelectBitmap(bmpTemp2);
\r
2402 // Let's copy our image, it will be altered
\r
2403 dcTemp1.BitBlt(0, 0, nWidth, nHeight, dc, xSrc, ySrc, SRCCOPY);
\r
2405 // All dark gray pixels will become white, the others black
\r
2406 dcTemp1.SetBkColor(RGB(128, 128, 128));
\r
2407 dcTemp2.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY);
\r
2408 // Do an XOR to set to black these white pixels
\r
2409 dcTemp1.BitBlt(0, 0, nWidth, nHeight, dcTemp2, 0, 0, SRCINVERT);
\r
2411 // BitBlt the bitmap into the monochrome DIB section
\r
2412 // The DIB section will do a true monochrome conversion
\r
2413 // The magenta background being closer to white will become white
\r
2414 dcBW.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY);
\r
2417 dcTemp1.SelectBitmap(hOldBmp1);
\r
2418 dcTemp2.SelectBitmap(hOldBmp2);
\r
2421 // Paint the destination rectangle using hBrushBackground
\r
2422 if(hBrushBackground != NULL)
\r
2424 RECT rc = { x, y, x + nWidth, y + nHeight };
\r
2425 FillRect(&rc, hBrushBackground);
\r
2428 // BitBlt the black bits in the monochrome bitmap into hBrush3DEffect color in the destination DC
\r
2429 // The magic ROP comes from the Charles Petzold's book
\r
2430 HBRUSH hOldBrush = SelectBrush(hBrush3DEffect);
\r
2431 BitBlt(x + 1, y + 1, nWidth, nHeight, dcBW, 0, 0, 0xB8074A);
\r
2433 // BitBlt the black bits in the monochrome bitmap into hBrushDisabledImage color in the destination DC
\r
2434 SelectBrush(hBrushDisabledImage);
\r
2435 BitBlt(x, y, nWidth, nHeight, dcBW, 0, 0, 0xB8074A);
\r
2437 SelectBrush(hOldBrush);
\r
2438 dcBW.SelectBitmap(hbmOldBW);
\r
2439 dc.SelectBitmap(hbmOldDC);
\r
2441 if(hSrcDC == NULL)
\r
2448 #ifndef _WIN32_WCE
\r
2449 BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount = -1)
\r
2451 ATLASSERT(m_hDC != NULL);
\r
2453 nCount = lstrlen(lpszString);
\r
2454 return ::TextOut(m_hDC, x, y, lpszString, nCount);
\r
2456 #endif // !_WIN32_WCE
\r
2458 BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount = -1, LPINT lpDxWidths = NULL)
\r
2460 ATLASSERT(m_hDC != NULL);
\r
2462 nCount = lstrlen(lpszString);
\r
2463 return ::ExtTextOut(m_hDC, x, y, nOptions, lpRect, lpszString, nCount, lpDxWidths);
\r
2466 #ifndef _WIN32_WCE
\r
2467 SIZE TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL, int nTabOrigin = 0)
\r
2469 ATLASSERT(m_hDC != NULL);
\r
2471 nCount = lstrlen(lpszString);
\r
2472 LONG lRes = ::TabbedTextOut(m_hDC, x, y, lpszString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin);
\r
2473 SIZE size = { GET_X_LPARAM(lRes), GET_Y_LPARAM(lRes) };
\r
2476 #endif // !_WIN32_WCE
\r
2478 int DrawText(LPCTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat)
\r
2480 ATLASSERT(m_hDC != NULL);
\r
2481 #ifndef _WIN32_WCE
\r
2482 ATLASSERT((uFormat & DT_MODIFYSTRING) == 0);
\r
2483 #endif // !_WIN32_WCE
\r
2484 return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat);
\r
2487 int DrawText(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat)
\r
2489 ATLASSERT(m_hDC != NULL);
\r
2490 return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat);
\r
2493 #ifndef _WIN32_WCE
\r
2494 int DrawTextEx(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat, LPDRAWTEXTPARAMS lpDTParams = NULL)
\r
2496 ATLASSERT(m_hDC != NULL);
\r
2497 return ::DrawTextEx(m_hDC, lpstrText, cchText, lpRect, uFormat, lpDTParams);
\r
2499 #endif // !_WIN32_WCE
\r
2501 #if (_WIN32_WINNT >= 0x0501)
\r
2502 int DrawShadowText(LPCWSTR lpstrText, int cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset)
\r
2504 ATLASSERT(m_hDC != NULL);
\r
2505 // This function is present only if comctl32.dll version 6 is loaded;
\r
2506 // we use LoadLibrary/GetProcAddress to allow apps compiled with
\r
2507 // _WIN32_WINNT >= 0x0501 to run on older Windows/CommCtrl
\r
2509 HMODULE hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll"));
\r
2510 ATLASSERT(hCommCtrlDLL != NULL);
\r
2511 if(hCommCtrlDLL != NULL)
\r
2513 typedef int (WINAPI *PFN_DrawShadowText)(HDC hDC, LPCWSTR lpstrText, UINT cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset);
\r
2514 PFN_DrawShadowText pfnDrawShadowText = (PFN_DrawShadowText)::GetProcAddress(hCommCtrlDLL, "DrawShadowText");
\r
2515 ATLASSERT(pfnDrawShadowText != NULL); // this function requires CommCtrl6
\r
2516 if(pfnDrawShadowText != NULL)
\r
2517 nRet = pfnDrawShadowText(m_hDC, lpstrText, cchText, lpRect, dwFlags, clrText, clrShadow, xOffset, yOffset);
\r
2518 ::FreeLibrary(hCommCtrlDLL);
\r
2522 #endif // (_WIN32_WINNT >= 0x0501)
\r
2524 BOOL GetTextExtent(LPCTSTR lpszString, int nCount, LPSIZE lpSize) const
\r
2526 ATLASSERT(m_hDC != NULL);
\r
2528 nCount = lstrlen(lpszString);
\r
2529 return ::GetTextExtentPoint32(m_hDC, lpszString, nCount, lpSize);
\r
2532 BOOL GetTextExtentExPoint(LPCTSTR lpszString, int cchString, LPSIZE lpSize, int nMaxExtent, LPINT lpnFit = NULL, LPINT alpDx = NULL)
\r
2534 ATLASSERT(m_hDC != NULL);
\r
2535 return ::GetTextExtentExPoint(m_hDC, lpszString, cchString, nMaxExtent, lpnFit, alpDx, lpSize);
\r
2538 #ifndef _WIN32_WCE
\r
2539 DWORD GetTabbedTextExtent(LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL) const
\r
2541 ATLASSERT(m_hDC != NULL);
\r
2543 nCount = lstrlen(lpszString);
\r
2544 return ::GetTabbedTextExtent(m_hDC, lpszString, nCount, nTabPositions, lpnTabStopPositions);
\r
2547 BOOL GrayString(HBRUSH hBrush, BOOL (CALLBACK* lpfnOutput)(HDC, LPARAM, int), LPARAM lpData, int nCount, int x, int y, int nWidth, int nHeight)
\r
2549 ATLASSERT(m_hDC != NULL);
\r
2550 return ::GrayString(m_hDC, hBrush, (GRAYSTRINGPROC)lpfnOutput, lpData, nCount, x, y, nWidth, nHeight);
\r
2552 #endif // !_WIN32_WCE
\r
2554 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
\r
2555 UINT GetTextAlign() const
\r
2557 ATLASSERT(m_hDC != NULL);
\r
2558 return ::GetTextAlign(m_hDC);
\r
2561 UINT SetTextAlign(UINT nFlags)
\r
2563 ATLASSERT(m_hDC != NULL);
\r
2564 return ::SetTextAlign(m_hDC, nFlags);
\r
2566 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
\r
2568 int GetTextFace(LPTSTR lpszFacename, int nCount) const
\r
2570 ATLASSERT(m_hDC != NULL);
\r
2571 return ::GetTextFace(m_hDC, nCount, lpszFacename);
\r
2574 int GetTextFaceLen() const
\r
2576 ATLASSERT(m_hDC != NULL);
\r
2577 return ::GetTextFace(m_hDC, 0, NULL);
\r
2580 #ifndef _ATL_NO_COM
\r
2581 #ifdef _OLEAUTO_H_
\r
2582 BOOL GetTextFace(BSTR& bstrFace) const
\r
2585 ATLASSERT(m_hDC != NULL);
\r
2586 ATLASSERT(bstrFace == NULL);
\r
2588 int nLen = GetTextFaceLen();
\r
2592 CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
\r
2593 LPTSTR lpszText = buff.Allocate(nLen);
\r
2594 if(lpszText == NULL)
\r
2597 if(!GetTextFace(lpszText, nLen))
\r
2600 bstrFace = ::SysAllocString(T2OLE(lpszText));
\r
2601 return (bstrFace != NULL) ? TRUE : FALSE;
\r
2604 #endif // !_ATL_NO_COM
\r
2606 #if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
\r
2607 int GetTextFace(_CSTRING_NS::CString& strFace) const
\r
2609 ATLASSERT(m_hDC != NULL);
\r
2611 int nLen = GetTextFaceLen();
\r
2615 LPTSTR lpstr = strFace.GetBufferSetLength(nLen);
\r
2618 int nRet = GetTextFace(lpstr, nLen);
\r
2619 strFace.ReleaseBuffer();
\r
2622 #endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
\r
2624 BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const
\r
2626 ATLASSERT(m_hDC != NULL);
\r
2627 return ::GetTextMetrics(m_hDC, lpMetrics);
\r
2630 #ifndef _WIN32_WCE
\r
2631 int SetTextJustification(int nBreakExtra, int nBreakCount)
\r
2633 ATLASSERT(m_hDC != NULL);
\r
2634 return ::SetTextJustification(m_hDC, nBreakExtra, nBreakCount);
\r
2637 int GetTextCharacterExtra() const
\r
2639 ATLASSERT(m_hDC != NULL);
\r
2640 return ::GetTextCharacterExtra(m_hDC);
\r
2643 int SetTextCharacterExtra(int nCharExtra)
\r
2645 ATLASSERT(m_hDC != NULL);
\r
2646 return ::SetTextCharacterExtra(m_hDC, nCharExtra);
\r
2648 #endif // !_WIN32_WCE
\r
2650 // Advanced Drawing
\r
2651 BOOL DrawEdge(LPRECT lpRect, UINT nEdge, UINT nFlags)
\r
2653 ATLASSERT(m_hDC != NULL);
\r
2654 return ::DrawEdge(m_hDC, lpRect, nEdge, nFlags);
\r
2657 BOOL DrawFrameControl(LPRECT lpRect, UINT nType, UINT nState)
\r
2659 ATLASSERT(m_hDC != NULL);
\r
2660 return ::DrawFrameControl(m_hDC, lpRect, nType, nState);
\r
2663 // Scrolling Functions
\r
2664 BOOL ScrollDC(int dx, int dy, LPCRECT lpRectScroll, LPCRECT lpRectClip, HRGN hRgnUpdate, LPRECT lpRectUpdate)
\r
2666 ATLASSERT(m_hDC != NULL);
\r
2667 return ::ScrollDC(m_hDC, dx, dy, lpRectScroll, lpRectClip, hRgnUpdate, lpRectUpdate);
\r
2671 #ifndef _WIN32_WCE
\r
2672 BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const
\r
2674 ATLASSERT(m_hDC != NULL);
\r
2675 return ::GetCharWidth(m_hDC, nFirstChar, nLastChar, lpBuffer);
\r
2678 // GetCharWidth32 is not supported under Win9x
\r
2679 BOOL GetCharWidth32(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const
\r
2681 ATLASSERT(m_hDC != NULL);
\r
2682 return ::GetCharWidth32(m_hDC, nFirstChar, nLastChar, lpBuffer);
\r
2685 DWORD SetMapperFlags(DWORD dwFlag)
\r
2687 ATLASSERT(m_hDC != NULL);
\r
2688 return ::SetMapperFlags(m_hDC, dwFlag);
\r
2691 BOOL GetAspectRatioFilter(LPSIZE lpSize) const
\r
2693 ATLASSERT(m_hDC != NULL);
\r
2694 return ::GetAspectRatioFilterEx(m_hDC, lpSize);
\r
2697 BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABC lpabc) const
\r
2699 ATLASSERT(m_hDC != NULL);
\r
2700 return ::GetCharABCWidths(m_hDC, nFirstChar, nLastChar, lpabc);
\r
2703 DWORD GetFontData(DWORD dwTable, DWORD dwOffset, LPVOID lpData, DWORD cbData) const
\r
2705 ATLASSERT(m_hDC != NULL);
\r
2706 return ::GetFontData(m_hDC, dwTable, dwOffset, lpData, cbData);
\r
2709 int GetKerningPairs(int nPairs, LPKERNINGPAIR lpkrnpair) const
\r
2711 ATLASSERT(m_hDC != NULL);
\r
2712 return ::GetKerningPairs(m_hDC, nPairs, lpkrnpair);
\r
2715 UINT GetOutlineTextMetrics(UINT cbData, LPOUTLINETEXTMETRIC lpotm) const
\r
2717 ATLASSERT(m_hDC != NULL);
\r
2718 return ::GetOutlineTextMetrics(m_hDC, cbData, lpotm);
\r
2721 DWORD GetGlyphOutline(UINT nChar, UINT nFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lpBuffer, const MAT2* lpmat2) const
\r
2723 ATLASSERT(m_hDC != NULL);
\r
2724 return ::GetGlyphOutline(m_hDC, nChar, nFormat, lpgm, cbBuffer, lpBuffer, lpmat2);
\r
2727 BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABCFLOAT lpABCF) const
\r
2729 ATLASSERT(m_hDC != NULL);
\r
2730 return ::GetCharABCWidthsFloat(m_hDC, nFirstChar, nLastChar, lpABCF);
\r
2733 BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, float* lpFloatBuffer) const
\r
2735 ATLASSERT(m_hDC != NULL);
\r
2736 return ::GetCharWidthFloat(m_hDC, nFirstChar, nLastChar, lpFloatBuffer);
\r
2738 #endif // !_WIN32_WCE
\r
2740 // Printer/Device Escape Functions
\r
2741 #ifndef _WIN32_WCE
\r
2742 int Escape(int nEscape, int nCount, LPCSTR lpszInData, LPVOID lpOutData)
\r
2744 ATLASSERT(m_hDC != NULL);
\r
2745 return ::Escape(m_hDC, nEscape, nCount, lpszInData, lpOutData);
\r
2747 #endif // !_WIN32_WCE
\r
2749 int Escape(int nEscape, int nInputSize, LPCSTR lpszInputData,
\r
2750 int nOutputSize, LPSTR lpszOutputData)
\r
2752 ATLASSERT(m_hDC != NULL);
\r
2753 return ::ExtEscape(m_hDC, nEscape, nInputSize, lpszInputData, nOutputSize, lpszOutputData);
\r
2756 #ifndef _WIN32_WCE
\r
2757 int DrawEscape(int nEscape, int nInputSize, LPCSTR lpszInputData)
\r
2759 ATLASSERT(m_hDC != NULL);
\r
2760 return ::DrawEscape(m_hDC, nEscape, nInputSize, lpszInputData);
\r
2762 #endif // !_WIN32_WCE
\r
2765 #if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc))
\r
2766 int StartDoc(LPCTSTR lpszDocName) // old Win3.0 version
\r
2768 DOCINFO di = { 0 };
\r
2769 di.cbSize = sizeof(DOCINFO);
\r
2770 di.lpszDocName = lpszDocName;
\r
2771 return StartDoc(&di);
\r
2774 int StartDoc(LPDOCINFO lpDocInfo)
\r
2776 ATLASSERT(m_hDC != NULL);
\r
2777 return ::StartDoc(m_hDC, lpDocInfo);
\r
2782 ATLASSERT(m_hDC != NULL);
\r
2783 return ::StartPage(m_hDC);
\r
2788 ATLASSERT(m_hDC != NULL);
\r
2789 return ::EndPage(m_hDC);
\r
2792 int SetAbortProc(BOOL (CALLBACK* lpfn)(HDC, int))
\r
2794 ATLASSERT(m_hDC != NULL);
\r
2795 return ::SetAbortProc(m_hDC, (ABORTPROC)lpfn);
\r
2800 ATLASSERT(m_hDC != NULL);
\r
2801 return ::AbortDoc(m_hDC);
\r
2806 ATLASSERT(m_hDC != NULL);
\r
2807 return ::EndDoc(m_hDC);
\r
2809 #endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc))
\r
2811 // MetaFile Functions
\r
2812 #ifndef _WIN32_WCE
\r
2813 BOOL PlayMetaFile(HMETAFILE hMF)
\r
2815 ATLASSERT(m_hDC != NULL);
\r
2816 if(::GetDeviceCaps(m_hDC, TECHNOLOGY) == DT_METAFILE)
\r
2818 // playing metafile in metafile, just use core windows API
\r
2819 return ::PlayMetaFile(m_hDC, hMF);
\r
2822 // for special playback, lParam == pDC
\r
2823 return ::EnumMetaFile(m_hDC, hMF, EnumMetaFileProc, (LPARAM)this);
\r
2826 BOOL PlayMetaFile(HENHMETAFILE hEnhMetaFile, LPCRECT lpBounds)
\r
2828 ATLASSERT(m_hDC != NULL);
\r
2829 return ::PlayEnhMetaFile(m_hDC, hEnhMetaFile, lpBounds);
\r
2832 BOOL AddMetaFileComment(UINT nDataSize, const BYTE* pCommentData) // can be used for enhanced metafiles only
\r
2834 ATLASSERT(m_hDC != NULL);
\r
2835 return ::GdiComment(m_hDC, nDataSize, pCommentData);
\r
2838 // Special handling for metafile playback
\r
2839 static int CALLBACK EnumMetaFileProc(HDC hDC, HANDLETABLE* pHandleTable, METARECORD* pMetaRec, int nHandles, LPARAM lParam)
\r
2841 CDCHandle* pDC = (CDCHandle*)lParam;
\r
2843 switch (pMetaRec->rdFunction)
\r
2845 case META_SETMAPMODE:
\r
2846 pDC->SetMapMode((int)(short)pMetaRec->rdParm[0]);
\r
2848 case META_SETWINDOWEXT:
\r
2849 pDC->SetWindowExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
\r
2851 case META_SETWINDOWORG:
\r
2852 pDC->SetWindowOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
\r
2854 case META_SETVIEWPORTEXT:
\r
2855 pDC->SetViewportExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
\r
2857 case META_SETVIEWPORTORG:
\r
2858 pDC->SetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
\r
2860 case META_SCALEWINDOWEXT:
\r
2861 pDC->ScaleWindowExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2],
\r
2862 (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
\r
2864 case META_SCALEVIEWPORTEXT:
\r
2865 pDC->ScaleViewportExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2],
\r
2866 (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
\r
2868 case META_OFFSETVIEWPORTORG:
\r
2869 pDC->OffsetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]);
\r
2874 case META_RESTOREDC:
\r
2875 pDC->RestoreDC((int)(short)pMetaRec->rdParm[0]);
\r
2877 case META_SETBKCOLOR:
\r
2878 pDC->SetBkColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]);
\r
2880 case META_SETTEXTCOLOR:
\r
2881 pDC->SetTextColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]);
\r
2884 // need to watch out for SelectObject(HFONT), for custom font mapping
\r
2885 case META_SELECTOBJECT:
\r
2887 HGDIOBJ hObject = pHandleTable->objectHandle[pMetaRec->rdParm[0]];
\r
2888 UINT nObjType = ::GetObjectType(hObject);
\r
2891 // object type is unknown, determine if it is a font
\r
2892 HFONT hStockFont = (HFONT)::GetStockObject(SYSTEM_FONT);
\r
2893 HFONT hFontOld = (HFONT)::SelectObject(pDC->m_hDC, hStockFont);
\r
2894 HGDIOBJ hObjOld = ::SelectObject(pDC->m_hDC, hObject);
\r
2895 if(hObjOld == hStockFont)
\r
2897 // got the stock object back, so must be selecting a font
\r
2898 pDC->SelectFont((HFONT)hObject);
\r
2899 break; // don't play the default record
\r
2903 // didn't get the stock object back, so restore everything
\r
2904 ::SelectObject(pDC->m_hDC, hFontOld);
\r
2905 ::SelectObject(pDC->m_hDC, hObjOld);
\r
2907 // and fall through to PlayMetaFileRecord...
\r
2909 else if(nObjType == OBJ_FONT)
\r
2911 // play back as CDCHandle::SelectFont(HFONT)
\r
2912 pDC->SelectFont((HFONT)hObject);
\r
2913 break; // don't play the default record
\r
2916 // fall through...
\r
2919 ::PlayMetaFileRecord(hDC, pHandleTable, pMetaRec, nHandles);
\r
2925 #endif // !_WIN32_WCE
\r
2928 #ifndef _WIN32_WCE
\r
2931 ATLASSERT(m_hDC != NULL);
\r
2932 return ::AbortPath(m_hDC);
\r
2937 ATLASSERT(m_hDC != NULL);
\r
2938 return ::BeginPath(m_hDC);
\r
2941 BOOL CloseFigure()
\r
2943 ATLASSERT(m_hDC != NULL);
\r
2944 return ::CloseFigure(m_hDC);
\r
2949 ATLASSERT(m_hDC != NULL);
\r
2950 return ::EndPath(m_hDC);
\r
2955 ATLASSERT(m_hDC != NULL);
\r
2956 return ::FillPath(m_hDC);
\r
2959 BOOL FlattenPath()
\r
2961 ATLASSERT(m_hDC != NULL);
\r
2962 return ::FlattenPath(m_hDC);
\r
2965 BOOL StrokeAndFillPath()
\r
2967 ATLASSERT(m_hDC != NULL);
\r
2968 return ::StrokeAndFillPath(m_hDC);
\r
2973 ATLASSERT(m_hDC != NULL);
\r
2974 return ::StrokePath(m_hDC);
\r
2979 ATLASSERT(m_hDC != NULL);
\r
2980 return ::WidenPath(m_hDC);
\r
2983 BOOL GetMiterLimit(PFLOAT pfMiterLimit) const
\r
2985 ATLASSERT(m_hDC != NULL);
\r
2986 return ::GetMiterLimit(m_hDC, pfMiterLimit);
\r
2989 BOOL SetMiterLimit(float fMiterLimit)
\r
2991 ATLASSERT(m_hDC != NULL);
\r
2992 return ::SetMiterLimit(m_hDC, fMiterLimit, NULL);
\r
2995 int GetPath(LPPOINT lpPoints, LPBYTE lpTypes, int nCount) const
\r
2997 ATLASSERT(m_hDC != NULL);
\r
2998 return ::GetPath(m_hDC, lpPoints, lpTypes, nCount);
\r
3001 BOOL SelectClipPath(int nMode)
\r
3003 ATLASSERT(m_hDC != NULL);
\r
3004 return ::SelectClipPath(m_hDC, nMode);
\r
3006 #endif // !_WIN32_WCE
\r
3008 // Misc Helper Functions
\r
3009 static CBrushHandle PASCAL GetHalftoneBrush()
\r
3011 HBRUSH halftoneBrush = NULL;
\r
3012 WORD grayPattern[8];
\r
3013 for(int i = 0; i < 8; i++)
\r
3014 grayPattern[i] = (WORD)(0x5555 << (i & 1));
\r
3015 HBITMAP grayBitmap = CreateBitmap(8, 8, 1, 1, &grayPattern);
\r
3016 if(grayBitmap != NULL)
\r
3018 halftoneBrush = ::CreatePatternBrush(grayBitmap);
\r
3019 DeleteObject(grayBitmap);
\r
3021 return CBrushHandle(halftoneBrush);
\r
3024 void DrawDragRect(LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast, HBRUSH hBrush = NULL, HBRUSH hBrushLast = NULL)
\r
3026 // first, determine the update region and select it
\r
3028 rgnOutside.CreateRectRgnIndirect(lpRect);
\r
3029 RECT rect = *lpRect;
\r
3030 ::InflateRect(&rect, -size.cx, -size.cy);
\r
3031 ::IntersectRect(&rect, &rect, lpRect);
\r
3033 rgnInside.CreateRectRgnIndirect(&rect);
\r
3035 rgnNew.CreateRectRgn(0, 0, 0, 0);
\r
3036 rgnNew.CombineRgn(rgnOutside, rgnInside, RGN_XOR);
\r
3038 HBRUSH hBrushOld = NULL;
\r
3039 CBrush brushHalftone;
\r
3040 if(hBrush == NULL)
\r
3041 brushHalftone = hBrush = CDCHandle::GetHalftoneBrush();
\r
3042 if(hBrushLast == NULL)
\r
3043 hBrushLast = hBrush;
\r
3047 if(lpRectLast != NULL)
\r
3049 // find difference between new region and old region
\r
3050 rgnLast.CreateRectRgn(0, 0, 0, 0);
\r
3051 rgnOutside.SetRectRgn(lpRectLast->left, lpRectLast->top, lpRectLast->right, lpRectLast->bottom);
\r
3052 rect = *lpRectLast;
\r
3053 ::InflateRect(&rect, -sizeLast.cx, -sizeLast.cy);
\r
3054 ::IntersectRect(&rect, &rect, lpRectLast);
\r
3055 rgnInside.SetRectRgn(rect.left, rect.top, rect.right, rect.bottom);
\r
3056 rgnLast.CombineRgn(rgnOutside, rgnInside, RGN_XOR);
\r
3058 // only diff them if brushes are the same
\r
3059 if(hBrush == hBrushLast)
\r
3061 rgnUpdate.CreateRectRgn(0, 0, 0, 0);
\r
3062 rgnUpdate.CombineRgn(rgnLast, rgnNew, RGN_XOR);
\r
3065 if(hBrush != hBrushLast && lpRectLast != NULL)
\r
3067 // brushes are different -- erase old region first
\r
3068 SelectClipRgn(rgnLast);
\r
3069 GetClipBox(&rect);
\r
3070 hBrushOld = SelectBrush(hBrushLast);
\r
3071 PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT);
\r
3072 SelectBrush(hBrushOld);
\r
3076 // draw into the update/new region
\r
3077 SelectClipRgn(rgnUpdate.IsNull() ? rgnNew : rgnUpdate);
\r
3078 GetClipBox(&rect);
\r
3079 hBrushOld = SelectBrush(hBrush);
\r
3080 PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT);
\r
3083 if(hBrushOld != NULL)
\r
3084 SelectBrush(hBrushOld);
\r
3085 SelectClipRgn(NULL);
\r
3088 void FillSolidRect(LPCRECT lpRect, COLORREF clr)
\r
3090 ATLASSERT(m_hDC != NULL);
\r
3092 COLORREF clrOld = ::SetBkColor(m_hDC, clr);
\r
3093 ATLASSERT(clrOld != CLR_INVALID);
\r
3094 if(clrOld != CLR_INVALID)
\r
3096 ::ExtTextOut(m_hDC, 0, 0, ETO_OPAQUE, lpRect, NULL, 0, NULL);
\r
3097 ::SetBkColor(m_hDC, clrOld);
\r
3101 void FillSolidRect(int x, int y, int cx, int cy, COLORREF clr)
\r
3103 ATLASSERT(m_hDC != NULL);
\r
3105 RECT rect = { x, y, x + cx, y + cy };
\r
3106 FillSolidRect(&rect, clr);
\r
3109 void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight)
\r
3111 Draw3dRect(lpRect->left, lpRect->top, lpRect->right - lpRect->left,
\r
3112 lpRect->bottom - lpRect->top, clrTopLeft, clrBottomRight);
\r
3115 void Draw3dRect(int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight)
\r
3117 FillSolidRect(x, y, cx - 1, 1, clrTopLeft);
\r
3118 FillSolidRect(x, y, 1, cy - 1, clrTopLeft);
\r
3119 FillSolidRect(x + cx, y, -1, cy, clrBottomRight);
\r
3120 FillSolidRect(x, y + cy, cx, -1, clrBottomRight);
\r
3124 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
\r
3125 int SetDIBitsToDevice(int x, int y, DWORD dwWidth, DWORD dwHeight, int xSrc, int ySrc, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse)
\r
3127 ATLASSERT(m_hDC != NULL);
\r
3128 return ::SetDIBitsToDevice(m_hDC, x, y, dwWidth, dwHeight, xSrc, ySrc, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse);
\r
3130 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410)
\r
3132 #if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
\r
3133 int StretchDIBits(int x, int y, int nWidth, int nHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse, DWORD dwRop)
\r
3135 ATLASSERT(m_hDC != NULL);
\r
3136 return ::StretchDIBits(m_hDC, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth, nSrcHeight, lpvBits, lpbmi, uColorUse, dwRop);
\r
3139 UINT GetDIBColorTable(UINT uStartIndex, UINT cEntries, RGBQUAD* pColors) const
\r
3141 ATLASSERT(m_hDC != NULL);
\r
3142 return ::GetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors);
\r
3145 UINT SetDIBColorTable(UINT uStartIndex, UINT cEntries, CONST RGBQUAD* pColors)
\r
3147 ATLASSERT(m_hDC != NULL);
\r
3148 return ::SetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors);
\r
3150 #endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400)
\r
3153 #if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)
\r
3154 int ChoosePixelFormat(CONST PIXELFORMATDESCRIPTOR* ppfd)
\r
3156 ATLASSERT(m_hDC != NULL);
\r
3157 return ::ChoosePixelFormat(m_hDC, ppfd);
\r
3160 int DescribePixelFormat(int iPixelFormat, UINT nBytes, LPPIXELFORMATDESCRIPTOR ppfd)
\r
3162 ATLASSERT(m_hDC != NULL);
\r
3163 return ::DescribePixelFormat(m_hDC, iPixelFormat, nBytes, ppfd);
\r
3166 int GetPixelFormat() const
\r
3168 ATLASSERT(m_hDC != NULL);
\r
3169 return ::GetPixelFormat(m_hDC);
\r
3172 BOOL SetPixelFormat(int iPixelFormat, CONST PIXELFORMATDESCRIPTOR* ppfd)
\r
3174 ATLASSERT(m_hDC != NULL);
\r
3175 return ::SetPixelFormat(m_hDC, iPixelFormat, ppfd);
\r
3178 BOOL SwapBuffers()
\r
3180 ATLASSERT(m_hDC != NULL);
\r
3181 return ::SwapBuffers(m_hDC);
\r
3184 HGLRC wglCreateContext()
\r
3186 ATLASSERT(m_hDC != NULL);
\r
3187 return ::wglCreateContext(m_hDC);
\r
3190 HGLRC wglCreateLayerContext(int iLayerPlane)
\r
3192 ATLASSERT(m_hDC != NULL);
\r
3193 return ::wglCreateLayerContext(m_hDC, iLayerPlane);
\r
3196 BOOL wglMakeCurrent(HGLRC hglrc)
\r
3198 ATLASSERT(m_hDC != NULL);
\r
3199 return ::wglMakeCurrent(m_hDC, hglrc);
\r
3202 BOOL wglUseFontBitmaps(DWORD dwFirst, DWORD dwCount, DWORD listBase)
\r
3204 ATLASSERT(m_hDC != NULL);
\r
3205 return ::wglUseFontBitmaps(m_hDC, dwFirst, dwCount, listBase);
\r
3208 BOOL wglUseFontOutlines(DWORD dwFirst, DWORD dwCount, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf)
\r
3210 ATLASSERT(m_hDC != NULL);
\r
3211 return ::wglUseFontOutlines(m_hDC, dwFirst, dwCount, listBase, deviation, extrusion, format, lpgmf);
\r
3214 BOOL wglDescribeLayerPlane(int iPixelFormat, int iLayerPlane, UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd)
\r
3216 ATLASSERT(m_hDC != NULL);
\r
3217 return ::wglDescribeLayerPlane(m_hDC, iPixelFormat, iLayerPlane, nBytes, plpd);
\r
3220 int wglSetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, CONST COLORREF* pclr)
\r
3222 ATLASSERT(m_hDC != NULL);
\r
3223 return ::wglSetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr);
\r
3226 int wglGetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, COLORREF* pclr)
\r
3228 ATLASSERT(m_hDC != NULL);
\r
3229 return ::wglGetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr);
\r
3232 BOOL wglRealizeLayerPalette(int iLayerPlane, BOOL bRealize)
\r
3234 ATLASSERT(m_hDC != NULL);
\r
3235 return ::wglRealizeLayerPalette(m_hDC, iLayerPlane, bRealize);
\r
3238 BOOL wglSwapLayerBuffers(UINT uPlanes)
\r
3240 ATLASSERT(m_hDC != NULL);
\r
3241 return ::wglSwapLayerBuffers(m_hDC, uPlanes);
\r
3243 #endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE)
\r
3245 // New for Windows 2000 only
\r
3246 #if (_WIN32_WINNT >= 0x0500)
\r
3247 COLORREF GetDCPenColor() const
\r
3249 ATLASSERT(m_hDC != NULL);
\r
3250 return ::GetDCPenColor(m_hDC);
\r
3253 COLORREF SetDCPenColor(COLORREF clr)
\r
3255 ATLASSERT(m_hDC != NULL);
\r
3256 return ::SetDCPenColor(m_hDC, clr);
\r
3259 COLORREF GetDCBrushColor() const
\r
3261 ATLASSERT(m_hDC != NULL);
\r
3262 return ::GetDCBrushColor(m_hDC);
\r
3265 COLORREF SetDCBrushColor(COLORREF clr)
\r
3267 ATLASSERT(m_hDC != NULL);
\r
3268 return ::SetDCBrushColor(m_hDC, clr);
\r
3271 #ifndef _WIN32_WCE
\r
3272 DWORD GetFontUnicodeRanges(LPGLYPHSET lpgs) const
\r
3274 ATLASSERT(m_hDC != NULL);
\r
3275 return ::GetFontUnicodeRanges(m_hDC, lpgs);
\r
3277 #endif // !_WIN32_WCE
\r
3279 DWORD GetGlyphIndices(LPCTSTR lpstr, int cch, LPWORD pgi, DWORD dwFlags) const
\r
3281 ATLASSERT(m_hDC != NULL);
\r
3282 return ::GetGlyphIndices(m_hDC, lpstr, cch, pgi, dwFlags);
\r
3285 BOOL GetTextExtentPointI(LPWORD pgiIn, int cgi, LPSIZE lpSize) const
\r
3287 ATLASSERT(m_hDC != NULL);
\r
3288 return ::GetTextExtentPointI(m_hDC, pgiIn, cgi, lpSize);
\r
3291 BOOL GetTextExtentExPointI(LPWORD pgiIn, int cgi, int nMaxExtent, LPINT lpnFit, LPINT alpDx, LPSIZE lpSize) const
\r
3293 ATLASSERT(m_hDC != NULL);
\r
3294 return ::GetTextExtentExPointI(m_hDC, pgiIn, cgi, nMaxExtent, lpnFit, alpDx, lpSize);
\r
3297 BOOL GetCharWidthI(UINT giFirst, UINT cgi, LPWORD pgi, LPINT lpBuffer) const
\r
3299 ATLASSERT(m_hDC != NULL);
\r
3300 return ::GetCharWidthI(m_hDC, giFirst, cgi, pgi, lpBuffer);
\r
3303 BOOL GetCharABCWidthsI(UINT giFirst, UINT cgi, LPWORD pgi, LPABC lpabc) const
\r
3305 ATLASSERT(m_hDC != NULL);
\r
3306 return ::GetCharABCWidthsI(m_hDC, giFirst, cgi, pgi, lpabc);
\r
3308 #endif // (_WIN32_WINNT >= 0x0500)
\r
3310 // New for Windows 2000 and Windows 98
\r
3311 #if (WINVER >= 0x0500) && !defined(_WIN32_WCE)
\r
3312 BOOL ColorCorrectPalette(HPALETTE hPalette, DWORD dwFirstEntry, DWORD dwNumOfEntries)
\r
3314 ATLASSERT(m_hDC != NULL);
\r
3315 return ::ColorCorrectPalette(m_hDC, hPalette, dwFirstEntry, dwNumOfEntries);
\r
3317 #endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE)
\r
3320 typedef CDCT<false> CDCHandle;
\r
3321 typedef CDCT<true> CDC;
\r
3324 ///////////////////////////////////////////////////////////////////////////////
\r
3327 class CPaintDC : public CDC
\r
3334 // Constructor/destructor
\r
3335 CPaintDC(HWND hWnd)
\r
3337 ATLASSERT(::IsWindow(hWnd));
\r
3339 m_hDC = ::BeginPaint(hWnd, &m_ps);
\r
3344 ATLASSERT(m_hDC != NULL);
\r
3345 ATLASSERT(::IsWindow(m_hWnd));
\r
3346 ::EndPaint(m_hWnd, &m_ps);
\r
3351 class CClientDC : public CDC
\r
3357 // Constructor/destructor
\r
3358 CClientDC(HWND hWnd)
\r
3360 ATLASSERT(hWnd == NULL || ::IsWindow(hWnd));
\r
3362 m_hDC = ::GetDC(hWnd);
\r
3367 ATLASSERT(m_hDC != NULL);
\r
3368 ::ReleaseDC(m_hWnd, Detach());
\r
3372 class CWindowDC : public CDC
\r
3378 // Constructor/destructor
\r
3379 CWindowDC(HWND hWnd)
\r
3381 ATLASSERT(hWnd == NULL || ::IsWindow(hWnd));
\r
3383 m_hDC = ::GetWindowDC(hWnd);
\r
3388 ATLASSERT(m_hDC != NULL);
\r
3389 ::ReleaseDC(m_hWnd, Detach());
\r
3393 class CMemoryDC : public CDC
\r
3397 HDC m_hDCOriginal;
\r
3400 HBITMAP m_hBmpOld;
\r
3402 // Constructor/destructor
\r
3403 CMemoryDC(HDC hDC, RECT& rcPaint) : m_hDCOriginal(hDC), m_hBmpOld(NULL)
\r
3405 m_rcPaint = rcPaint;
\r
3406 CreateCompatibleDC(m_hDCOriginal);
\r
3407 ATLASSERT(m_hDC != NULL);
\r
3408 m_bmp.CreateCompatibleBitmap(m_hDCOriginal, m_rcPaint.right - m_rcPaint.left, m_rcPaint.bottom - m_rcPaint.top);
\r
3409 ATLASSERT(m_bmp.m_hBitmap != NULL);
\r
3410 m_hBmpOld = SelectBitmap(m_bmp);
\r
3411 SetViewportOrg(-m_rcPaint.left, -m_rcPaint.top);
\r
3416 ::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);
\r
3417 SelectBitmap(m_hBmpOld);
\r
3422 ///////////////////////////////////////////////////////////////////////////////
\r
3423 // Enhanced metafile support
\r
3425 #ifndef _WIN32_WCE
\r
3427 class CEnhMetaFileInfo
\r
3431 HENHMETAFILE m_hEMF;
\r
3434 ENHMETAHEADER m_header;
\r
3435 PIXELFORMATDESCRIPTOR m_pfd;
\r
3437 // Constructor/destructor
\r
3438 CEnhMetaFileInfo(HENHMETAFILE hEMF) : m_pBits(NULL), m_pDesc(NULL), m_hEMF(hEMF)
\r
3441 ~CEnhMetaFileInfo()
\r
3443 delete [] m_pBits;
\r
3444 delete [] m_pDesc;
\r
3448 BYTE* GetEnhMetaFileBits()
\r
3450 ATLASSERT(m_hEMF != NULL);
\r
3451 UINT nBytes = ::GetEnhMetaFileBits(m_hEMF, 0, NULL);
\r
3452 delete [] m_pBits;
\r
3454 ATLTRY(m_pBits = new BYTE[nBytes]);
\r
3455 if (m_pBits != NULL)
\r
3456 ::GetEnhMetaFileBits(m_hEMF, nBytes, m_pBits);
\r
3460 LPTSTR GetEnhMetaFileDescription()
\r
3462 ATLASSERT(m_hEMF != NULL);
\r
3463 UINT nLen = ::GetEnhMetaFileDescription(m_hEMF, 0, NULL);
\r
3464 delete [] m_pDesc;
\r
3466 ATLTRY(m_pDesc = new TCHAR[nLen]);
\r
3467 if (m_pDesc != NULL)
\r
3468 nLen = ::GetEnhMetaFileDescription(m_hEMF, nLen, m_pDesc);
\r
3472 ENHMETAHEADER* GetEnhMetaFileHeader()
\r
3474 ATLASSERT(m_hEMF != NULL);
\r
3475 memset(&m_header, 0, sizeof(m_header));
\r
3476 m_header.iType = EMR_HEADER;
\r
3477 m_header.nSize = sizeof(ENHMETAHEADER);
\r
3478 UINT n = ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), &m_header);
\r
3479 return (n != 0) ? &m_header : NULL;
\r
3482 PIXELFORMATDESCRIPTOR* GetEnhMetaFilePixelFormat()
\r
3484 ATLASSERT(m_hEMF != NULL);
\r
3485 memset(&m_pfd, 0, sizeof(m_pfd));
\r
3486 UINT n = ::GetEnhMetaFilePixelFormat(m_hEMF, sizeof(m_pfd), &m_pfd);
\r
3487 return (n != 0) ? &m_pfd : NULL;
\r
3492 template <bool t_bManaged>
\r
3493 class CEnhMetaFileT
\r
3497 HENHMETAFILE m_hEMF;
\r
3499 // Constructor/destructor
\r
3500 CEnhMetaFileT(HENHMETAFILE hEMF = NULL) : m_hEMF(hEMF)
\r
3506 if(t_bManaged && m_hEMF != NULL)
\r
3511 CEnhMetaFileT<t_bManaged>& operator =(HENHMETAFILE hEMF)
\r
3517 void Attach(HENHMETAFILE hEMF)
\r
3519 if(t_bManaged && m_hEMF != NULL && m_hEMF != hEMF)
\r
3524 HENHMETAFILE Detach()
\r
3526 HENHMETAFILE hEMF = m_hEMF;
\r
3531 operator HENHMETAFILE() const { return m_hEMF; }
\r
3533 bool IsNull() const { return (m_hEMF == NULL); }
\r
3535 BOOL DeleteObject()
\r
3537 ATLASSERT(m_hEMF != NULL);
\r
3538 BOOL bRet = ::DeleteEnhMetaFile(m_hEMF);
\r
3543 UINT GetEnhMetaFileBits(UINT cbBuffer, LPBYTE lpbBuffer) const
\r
3545 ATLASSERT(m_hEMF != NULL);
\r
3546 return ::GetEnhMetaFileBits(m_hEMF, cbBuffer, lpbBuffer);
\r
3549 UINT GetEnhMetaFileDescription(UINT cchBuffer, LPTSTR lpszDescription) const
\r
3551 ATLASSERT(m_hEMF != NULL);
\r
3552 return ::GetEnhMetaFileDescription(m_hEMF, cchBuffer, lpszDescription);
\r
3555 UINT GetEnhMetaFileHeader(LPENHMETAHEADER lpemh) const
\r
3557 ATLASSERT(m_hEMF != NULL);
\r
3558 lpemh->iType = EMR_HEADER;
\r
3559 lpemh->nSize = sizeof(ENHMETAHEADER);
\r
3560 return ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), lpemh);
\r
3563 UINT GetEnhMetaFilePaletteEntries(UINT cEntries, LPPALETTEENTRY lppe) const
\r
3565 ATLASSERT(m_hEMF != NULL);
\r
3566 return ::GetEnhMetaFilePaletteEntries(m_hEMF, cEntries, lppe);
\r
3569 UINT GetEnhMetaFilePixelFormat(DWORD cbBuffer, PIXELFORMATDESCRIPTOR* ppfd) const
\r
3571 ATLASSERT(m_hEMF != NULL);
\r
3572 return ::GetEnhMetaFilePixelFormat(m_hEMF, cbBuffer, ppfd);
\r
3576 typedef CEnhMetaFileT<false> CEnhMetaFileHandle;
\r
3577 typedef CEnhMetaFileT<true> CEnhMetaFile;
\r
3580 class CEnhMetaFileDC : public CDC
\r
3583 // Constructor/destructor
\r
3588 CEnhMetaFileDC(HDC hdc, LPCRECT lpRect)
\r
3590 Create(hdc, NULL, lpRect, NULL);
\r
3591 ATLASSERT(m_hDC != NULL);
\r
3594 CEnhMetaFileDC(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription)
\r
3596 Create(hdcRef, lpFilename, lpRect, lpDescription);
\r
3597 ATLASSERT(m_hDC != NULL);
\r
3602 HENHMETAFILE hEMF = Close();
\r
3604 ::DeleteEnhMetaFile(hEMF);
\r
3608 void Create(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription)
\r
3610 ATLASSERT(m_hDC == NULL);
\r
3611 m_hDC = ::CreateEnhMetaFile(hdcRef, lpFilename, lpRect, lpDescription);
\r
3614 HENHMETAFILE Close()
\r
3616 HENHMETAFILE hEMF = NULL;
\r
3617 if (m_hDC != NULL)
\r
3619 hEMF = ::CloseEnhMetaFile(m_hDC);
\r
3626 #endif // !_WIN32_WCE
\r
3629 ///////////////////////////////////////////////////////////////////////////////
\r
3630 // WinCE compatible clipboard CF_DIB format support functions
\r
3632 #ifndef _WTL_NO_DIB16
\r
3634 #define DIBINFO16_BITFIELDS { 31744, 992, 31 }
\r
3636 // DIBINFO16 - To avoid color table problems in WinCE we only create this type of Dib
\r
3637 struct DIBINFO16 // a BITMAPINFO with 2 additional color bitfields
\r
3639 BITMAPINFOHEADER bmiHeader;
\r
3640 RGBQUAD bmiColors[3];
\r
3642 DIBINFO16(SIZE size)
\r
3644 BITMAPINFOHEADER bmih = { sizeof(BITMAPINFOHEADER), size.cx, size.cy,
\r
3645 1, 16, BI_BITFIELDS, 2 * size.cx * size.cy , 0, 0, 3 };
\r
3646 DWORD dw[3] = DIBINFO16_BITFIELDS ;
\r
3649 memcpy(bmiColors, dw, 3 * sizeof(DWORD));
\r
3654 // AtlxxxDibxxx minimal packed DIB implementation and helpers to copy and paste CF_DIB
\r
3656 inline bool AtlIsDib16(LPBITMAPINFOHEADER pbmih)
\r
3658 return (pbmih->biBitCount == 16) && (pbmih->biCompression == BI_BITFIELDS);
\r
3661 inline int AtlGetDibColorTableSize(LPBITMAPINFOHEADER pbmih)
\r
3663 switch (pbmih->biBitCount)
\r
3668 return pbmih->biClrUsed ? pbmih->biClrUsed : 1 << pbmih->biBitCount;
\r
3673 return pbmih->biCompression == BI_BITFIELDS ? 3 : 0;
\r
3675 ATLASSERT(FALSE); // should never come here
\r
3681 inline int AtlGetDibNumColors(LPBITMAPINFOHEADER pbmih)
\r
3683 switch (pbmih->biBitCount)
\r
3688 if (pbmih->biClrUsed)
\r
3689 return pbmih->biClrUsed;
\r
3693 if (pbmih->biCompression == BI_BITFIELDS )
\r
3700 if (pbmih->biCompression == BI_BITFIELDS )
\r
3708 return 1 << pbmih->biBitCount;
\r
3711 inline HBITMAP AtlGetDibBitmap(LPBITMAPINFO pbmi)
\r
3713 HBITMAP hbm = NULL;
\r
3715 void * pBits = NULL;
\r
3717 LPBYTE pDibBits = (LPBYTE)pbmi + sizeof(BITMAPINFOHEADER) + AtlGetDibColorTableSize(&pbmi->bmiHeader) * sizeof(RGBQUAD);
\r
3718 if (hbm = CreateDIBSection(dc, pbmi, DIB_RGB_COLORS, &pBits, NULL, NULL))
\r
3719 memcpy(pBits, pDibBits, pbmi->bmiHeader.biSizeImage);
\r
3724 inline HBITMAP AtlCopyBitmap(HBITMAP hbm , SIZE sizeDst, bool bAsBitmap = false)
\r
3726 CDC hdcSrc = CreateCompatibleDC(NULL);
\r
3727 CDC hdcDst = CreateCompatibleDC(NULL);
\r
3729 CBitmapHandle hbmOld = NULL, hbmOld2 = NULL, bmSrc = hbm;
\r
3731 CBitmap bmNew = NULL;
\r
3733 SIZE sizeSrc = { 0 };
\r
3734 bmSrc.GetSize(sizeSrc);
\r
3736 hbmOld = hdcSrc.SelectBitmap(bmSrc);
\r
3740 bmNew.CreateCompatibleBitmap(hdcSrc, sizeDst.cx, sizeDst.cy);
\r
3744 DIBINFO16 dib16(sizeDst);
\r
3745 LPVOID pBits = NULL;
\r
3746 bmNew = CreateDIBSection(hdcDst, (const BITMAPINFO*)&dib16, DIB_RGB_COLORS, &pBits, NULL, NULL);
\r
3749 ATLASSERT(!bmNew.IsNull());
\r
3751 hbmOld2 = hdcDst.SelectBitmap(bmNew);
\r
3754 if ((sizeDst.cx == sizeSrc.cx) && (sizeDst.cy == sizeSrc.cy))
\r
3755 bOK = hdcDst.BitBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, SRCCOPY);
\r
3757 bOK = hdcDst.StretchBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, sizeSrc.cx, sizeSrc.cy, SRCCOPY);
\r
3759 hdcSrc.SelectBitmap(hbmOld);
\r
3760 hdcDst.SelectBitmap(hbmOld2);
\r
3763 bmNew.DeleteObject();
\r
3765 return bmNew.Detach();
\r
3768 inline HLOCAL AtlCreatePackedDib16(HBITMAP hbm, SIZE size)
\r
3770 DIBSECTION ds = { 0 };
\r
3771 LPBYTE pDib = NULL;
\r
3772 bool bCopied = false;
\r
3774 bool bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds);
\r
3775 if ((bOK == FALSE) || (ds.dsBm.bmBits == NULL) || (AtlIsDib16(&ds.dsBmih) == FALSE) ||
\r
3776 (ds.dsBmih.biWidth != size.cx ) || (ds.dsBmih.biHeight != size.cy ))
\r
3778 if ((hbm = AtlCopyBitmap(hbm, size)) != NULL)
\r
3781 bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds);
\r
3789 if((bOK == TRUE) && (AtlIsDib16(&ds.dsBmih) == TRUE) && (ds.dsBm.bmBits != NULL))
\r
3791 pDib = (LPBYTE)LocalAlloc(LMEM_ZEROINIT, sizeof(DIBINFO16) + ds.dsBmih.biSizeImage);
\r
3794 memcpy(pDib , &ds.dsBmih, sizeof(DIBINFO16));
\r
3795 memcpy(pDib + sizeof(DIBINFO16), ds.dsBm.bmBits, ds.dsBmih.biSizeImage);
\r
3799 if (bCopied == true)
\r
3800 DeleteObject(hbm);
\r
3802 return (HLOCAL)pDib;
\r
3805 inline bool AtlSetClipboardDib16(HBITMAP hbm, SIZE size, HWND hWnd)
\r
3807 ATLASSERT(::IsWindow(hWnd));
\r
3808 BOOL bOK = OpenClipboard(hWnd);
\r
3811 if ((bOK = EmptyClipboard()) == TRUE)
\r
3813 HLOCAL hDib = AtlCreatePackedDib16(hbm, size);
\r
3816 bOK = SetClipboardData(CF_DIB, hDib) != NULL;
\r
3817 if (bOK == FALSE)
\r
3828 return bOK == TRUE;
\r
3831 inline HBITMAP AtlGetClipboardDib(HWND hWnd)
\r
3833 ATLASSERT(::IsWindow(hWnd) == TRUE);
\r
3834 HBITMAP hbm = NULL;
\r
3835 if (OpenClipboard(hWnd) == TRUE)
\r
3837 LPBITMAPINFO pbmi = (LPBITMAPINFO)GetClipboardData(CF_DIB);
\r
3839 hbm = AtlGetDibBitmap(pbmi);
\r
3846 #endif // _WTL_NO_DIB16
\r
3848 }; // namespace WTL
\r
3850 #endif // __ATLGDI_H__
\r