Index: third_party/wtl/include/atlgdi.h |
diff --git a/third_party/wtl/include/atlgdi.h b/third_party/wtl/include/atlgdi.h |
deleted file mode 100644 |
index 510f1e7436f336434c9f02ddc8c37f06e3115ce3..0000000000000000000000000000000000000000 |
--- a/third_party/wtl/include/atlgdi.h |
+++ /dev/null |
@@ -1,3847 +0,0 @@ |
-// Windows Template Library - WTL version 8.0 |
-// Copyright (C) Microsoft Corporation. All rights reserved. |
-// |
-// This file is a part of the Windows Template Library. |
-// The use and distribution terms for this software are covered by the |
-// Microsoft Permissive License (Ms-PL) which can be found in the file |
-// Ms-PL.txt at the root of this distribution. |
- |
-#ifndef __ATLGDI_H__ |
-#define __ATLGDI_H__ |
- |
-#pragma once |
- |
-#ifndef __cplusplus |
- #error ATL requires C++ compilation (use a .cpp suffix) |
-#endif |
- |
-#ifndef __ATLAPP_H__ |
- #error atlgdi.h requires atlapp.h to be included first |
-#endif |
- |
- |
-// protect template members from windowsx.h macros |
-#ifdef _INC_WINDOWSX |
- #undef CopyRgn |
- #undef CreateBrush |
- #undef CreatePen |
- #undef SelectBrush |
- #undef SelectPen |
- #undef SelectFont |
- #undef SelectBitmap |
-#endif // _INC_WINDOWSX |
- |
-// required libraries |
-#if !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE) |
- #pragma comment(lib, "msimg32.lib") |
-#endif // !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE) |
-#if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) |
- #pragma comment(lib, "opengl32.lib") |
-#endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// Classes in this file: |
-// |
-// CPenT<t_bManaged> |
-// CBrushT<t_bManaged> |
-// CLogFont |
-// CFontT<t_bManaged> |
-// CBitmapT<t_bManaged> |
-// CPaletteT<t_bManaged> |
-// CRgnT<t_bManaged> |
-// CDCT<t_bManaged> |
-// CPaintDC |
-// CClientDC |
-// CWindowDC |
-// CMemoryDC |
-// CEnhMetaFileInfo |
-// CEnhMetaFileT<t_bManaged> |
-// CEnhMetaFileDC |
-// |
-// Global functions: |
-// AtlGetBitmapResourceInfo() |
-// AtlGetBitmapResourceBitsPerPixel() |
-// AtlIsAlphaBitmapResource() |
-// AtlIsDib16() |
-// AtlGetDibColorTableSize() |
-// AtlGetDibNumColors(), |
-// AtlGetDibBitmap() |
-// AtlCopyBitmap() |
-// AtlCreatePackedDib16() |
-// AtlSetClipboardDib16() |
-// AtlGetClipboardDib() |
- |
- |
-namespace WTL |
-{ |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// Bitmap resource helpers to extract bitmap information for a bitmap resource |
- |
-inline LPBITMAPINFOHEADER AtlGetBitmapResourceInfo(HMODULE hModule, ATL::_U_STRINGorID image) |
-{ |
- HRSRC hResource = ::FindResource(hModule, image.m_lpstr, RT_BITMAP); |
- ATLASSERT(hResource != NULL); |
- HGLOBAL hGlobal = ::LoadResource(hModule, hResource); |
- ATLASSERT(hGlobal != NULL); |
- LPBITMAPINFOHEADER pBitmapInfoHeader = (LPBITMAPINFOHEADER)::LockResource(hGlobal); |
- ATLASSERT(pBitmapInfoHeader != NULL); |
- return pBitmapInfoHeader; |
-} |
- |
-inline WORD AtlGetBitmapResourceBitsPerPixel(HMODULE hModule, ATL::_U_STRINGorID image) |
-{ |
- LPBITMAPINFOHEADER pBitmapInfoHeader = AtlGetBitmapResourceInfo(hModule, image); |
- ATLASSERT(pBitmapInfoHeader != NULL); |
- return pBitmapInfoHeader->biBitCount; |
-} |
- |
-inline WORD AtlGetBitmapResourceBitsPerPixel(ATL::_U_STRINGorID image) |
-{ |
- return AtlGetBitmapResourceBitsPerPixel(ModuleHelper::GetResourceInstance(), image); |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// 32-bit (alpha channel) bitmap resource helper |
- |
-// Note: 32-bit (alpha channel) images work only on Windows XP with Common Controls version 6. |
-// If you want your app to work on older version of Windows, load non-alpha images if Common |
-// Controls version is less than 6. |
- |
-inline bool AtlIsAlphaBitmapResource(ATL::_U_STRINGorID image) |
-{ |
- return (AtlGetBitmapResourceBitsPerPixel(image) == 32); |
-} |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// CPen |
- |
-template <bool t_bManaged> |
-class CPenT |
-{ |
-public: |
-// Data members |
- HPEN m_hPen; |
- |
-// Constructor/destructor/operators |
- CPenT(HPEN hPen = NULL) : m_hPen(hPen) |
- { } |
- |
- ~CPenT() |
- { |
- if(t_bManaged && m_hPen != NULL) |
- DeleteObject(); |
- } |
- |
- CPenT<t_bManaged>& operator =(HPEN hPen) |
- { |
- Attach(hPen); |
- return *this; |
- } |
- |
- void Attach(HPEN hPen) |
- { |
- if(t_bManaged && m_hPen != NULL && m_hPen != hPen) |
- ::DeleteObject(m_hPen); |
- m_hPen = hPen; |
- } |
- |
- HPEN Detach() |
- { |
- HPEN hPen = m_hPen; |
- m_hPen = NULL; |
- return hPen; |
- } |
- |
- operator HPEN() const { return m_hPen; } |
- |
- bool IsNull() const { return (m_hPen == NULL); } |
- |
-// Create methods |
- HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor) |
- { |
- ATLASSERT(m_hPen == NULL); |
- m_hPen = ::CreatePen(nPenStyle, nWidth, crColor); |
- return m_hPen; |
- } |
- |
-#ifndef _WIN32_WCE |
- HPEN CreatePen(int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL) |
- { |
- ATLASSERT(m_hPen == NULL); |
- m_hPen = ::ExtCreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount, lpStyle); |
- return m_hPen; |
- } |
-#endif // !_WIN32_WCE |
- |
- HPEN CreatePenIndirect(LPLOGPEN lpLogPen) |
- { |
- ATLASSERT(m_hPen == NULL); |
- m_hPen = ::CreatePenIndirect(lpLogPen); |
- return m_hPen; |
- } |
- |
- BOOL DeleteObject() |
- { |
- ATLASSERT(m_hPen != NULL); |
- BOOL bRet = ::DeleteObject(m_hPen); |
- if(bRet) |
- m_hPen = NULL; |
- return bRet; |
- } |
- |
-// Attributes |
- int GetLogPen(LOGPEN* pLogPen) const |
- { |
- ATLASSERT(m_hPen != NULL); |
- return ::GetObject(m_hPen, sizeof(LOGPEN), pLogPen); |
- } |
- |
- bool GetLogPen(LOGPEN& LogPen) const |
- { |
- ATLASSERT(m_hPen != NULL); |
- return (::GetObject(m_hPen, sizeof(LOGPEN), &LogPen) == sizeof(LOGPEN)); |
- } |
- |
-#ifndef _WIN32_WCE |
- int GetExtLogPen(EXTLOGPEN* pLogPen) const |
- { |
- ATLASSERT(m_hPen != NULL); |
- return ::GetObject(m_hPen, sizeof(EXTLOGPEN), pLogPen); |
- } |
- |
- bool GetExtLogPen(EXTLOGPEN& ExtLogPen) const |
- { |
- ATLASSERT(m_hPen != NULL); |
- return (::GetObject(m_hPen, sizeof(EXTLOGPEN), &ExtLogPen) == sizeof(EXTLOGPEN)); |
- } |
-#endif // !_WIN32_WCE |
-}; |
- |
-typedef CPenT<false> CPenHandle; |
-typedef CPenT<true> CPen; |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// CBrush |
- |
-template <bool t_bManaged> |
-class CBrushT |
-{ |
-public: |
-// Data members |
- HBRUSH m_hBrush; |
- |
-// Constructor/destructor/operators |
- CBrushT(HBRUSH hBrush = NULL) : m_hBrush(hBrush) |
- { } |
- |
- ~CBrushT() |
- { |
- if(t_bManaged && m_hBrush != NULL) |
- DeleteObject(); |
- } |
- |
- CBrushT<t_bManaged>& operator =(HBRUSH hBrush) |
- { |
- Attach(hBrush); |
- return *this; |
- } |
- |
- void Attach(HBRUSH hBrush) |
- { |
- if(t_bManaged && m_hBrush != NULL && m_hBrush != hBrush) |
- ::DeleteObject(m_hBrush); |
- m_hBrush = hBrush; |
- } |
- |
- HBRUSH Detach() |
- { |
- HBRUSH hBrush = m_hBrush; |
- m_hBrush = NULL; |
- return hBrush; |
- } |
- |
- operator HBRUSH() const { return m_hBrush; } |
- |
- bool IsNull() const { return (m_hBrush == NULL); } |
- |
-// Create methods |
- HBRUSH CreateSolidBrush(COLORREF crColor) |
- { |
- ATLASSERT(m_hBrush == NULL); |
- m_hBrush = ::CreateSolidBrush(crColor); |
- return m_hBrush; |
- } |
- |
-#ifndef _WIN32_WCE |
- HBRUSH CreateHatchBrush(int nIndex, COLORREF crColor) |
- { |
- ATLASSERT(m_hBrush == NULL); |
- m_hBrush = ::CreateHatchBrush(nIndex, crColor); |
- return m_hBrush; |
- } |
-#endif // !_WIN32_WCE |
- |
-#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) |
- HBRUSH CreateBrushIndirect(const LOGBRUSH* lpLogBrush) |
- { |
- ATLASSERT(m_hBrush == NULL); |
-#ifndef _WIN32_WCE |
- m_hBrush = ::CreateBrushIndirect(lpLogBrush); |
-#else // CE specific |
- m_hBrush = ATL::CreateBrushIndirect(lpLogBrush); |
-#endif // _WIN32_WCE |
- return m_hBrush; |
- } |
-#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) |
- |
- HBRUSH CreatePatternBrush(HBITMAP hBitmap) |
- { |
- ATLASSERT(m_hBrush == NULL); |
- m_hBrush = ::CreatePatternBrush(hBitmap); |
- return m_hBrush; |
- } |
- |
- HBRUSH CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage) |
- { |
- ATLASSERT(hPackedDIB != NULL); |
- const void* lpPackedDIB = GlobalLock(hPackedDIB); |
- ATLASSERT(lpPackedDIB != NULL); |
- m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage); |
- GlobalUnlock(hPackedDIB); |
- return m_hBrush; |
- } |
- |
- HBRUSH CreateDIBPatternBrush(const void* lpPackedDIB, UINT nUsage) |
- { |
- ATLASSERT(m_hBrush == NULL); |
- m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage); |
- return m_hBrush; |
- } |
- |
- HBRUSH CreateSysColorBrush(int nIndex) |
- { |
- ATLASSERT(m_hBrush == NULL); |
- m_hBrush = ::GetSysColorBrush(nIndex); |
- return m_hBrush; |
- } |
- |
- BOOL DeleteObject() |
- { |
- ATLASSERT(m_hBrush != NULL); |
- BOOL bRet = ::DeleteObject(m_hBrush); |
- if(bRet) |
- m_hBrush = NULL; |
- return bRet; |
- } |
- |
-// Attributes |
- int GetLogBrush(LOGBRUSH* pLogBrush) const |
- { |
- ATLASSERT(m_hBrush != NULL); |
- return ::GetObject(m_hBrush, sizeof(LOGBRUSH), pLogBrush); |
- } |
- |
- bool GetLogBrush(LOGBRUSH& LogBrush) const |
- { |
- ATLASSERT(m_hBrush != NULL); |
- return (::GetObject(m_hBrush, sizeof(LOGBRUSH), &LogBrush) == sizeof(LOGBRUSH)); |
- } |
-}; |
- |
-typedef CBrushT<false> CBrushHandle; |
-typedef CBrushT<true> CBrush; |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// CFont |
- |
-class CLogFont : public LOGFONT |
-{ |
-public: |
- CLogFont() |
- { |
- memset(this, 0, sizeof(LOGFONT)); |
- } |
- |
- CLogFont(const LOGFONT& lf) |
- { |
- Copy(&lf); |
- } |
- |
- CLogFont(HFONT hFont) |
- { |
- ATLASSERT(::GetObjectType(hFont) == OBJ_FONT); |
- ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this); |
- } |
- |
- HFONT CreateFontIndirect() |
- { |
- return ::CreateFontIndirect(this); |
- } |
- |
- void SetBold() |
- { |
- lfWeight = FW_BOLD; |
- } |
- |
- bool IsBold() const |
- { |
- return (lfWeight >= FW_BOLD); |
- } |
- |
- void MakeBolder(int iScale = 1) |
- { |
- lfWeight += FW_BOLD * iScale; |
- } |
- |
- void MakeLarger(int iScale) |
- { |
- if(lfHeight > 0) |
- lfHeight += iScale; |
- else |
- lfHeight -= iScale; |
- } |
- |
- void SetHeight(LONG nPointSize, HDC hDC = NULL) |
- { |
- // For MM_TEXT mapping mode |
- lfHeight = -::MulDiv(nPointSize, ::GetDeviceCaps(hDC, LOGPIXELSY), 72); |
- } |
- |
- LONG GetHeight(HDC hDC = NULL) const |
- { |
- // For MM_TEXT mapping mode |
- return ::MulDiv(-lfHeight, 72, ::GetDeviceCaps(hDC, LOGPIXELSY)); |
- } |
- |
- LONG GetDeciPointHeight(HDC hDC = NULL) const |
- { |
-#ifndef _WIN32_WCE |
- POINT ptOrg = { 0, 0 }; |
- ::DPtoLP(hDC, &ptOrg, 1); |
- POINT pt = { 0, 0 }; |
- pt.y = abs(lfHeight) + ptOrg.y; |
- ::LPtoDP(hDC,&pt,1); |
- return ::MulDiv(pt.y, 720, ::GetDeviceCaps(hDC, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point |
-#else // CE specific |
- // DP and LP are always the same on CE |
- return ::MulDiv(abs(lfHeight), 720, ::GetDeviceCaps(hDC, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point |
-#endif // _WIN32_WCE |
- } |
- |
- void SetHeightFromDeciPoint(LONG nDeciPtHeight, HDC hDC = NULL) |
- { |
-#ifndef _WIN32_WCE |
- POINT pt = { 0, 0 }; |
- pt.y = ::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720); // 72 points/inch, 10 decipoints/point |
- ::DPtoLP(hDC, &pt, 1); |
- POINT ptOrg = { 0, 0 }; |
- ::DPtoLP(hDC, &ptOrg, 1); |
- lfHeight = -abs(pt.y - ptOrg.y); |
-#else // CE specific |
- // DP and LP are always the same on CE |
- lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC, LOGPIXELSY), nDeciPtHeight, 720)); // 72 points/inch, 10 decipoints/point |
-#endif // _WIN32_WCE |
- } |
- |
-#ifndef _WIN32_WCE |
- void SetCaptionFont() |
- { |
- NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; |
- ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); |
- Copy(&ncm.lfCaptionFont); |
- } |
- |
- void SetMenuFont() |
- { |
- NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; |
- ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); |
- Copy(&ncm.lfMenuFont); |
- } |
- |
- void SetStatusFont() |
- { |
- NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; |
- ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); |
- Copy(&ncm.lfStatusFont); |
- } |
- |
- void SetMessageBoxFont() |
- { |
- NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; |
- ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); |
- Copy(&ncm.lfMessageFont); |
- } |
-#endif // !_WIN32_WCE |
- |
- void Copy(const LOGFONT* pLogFont) |
- { |
- ATLASSERT(pLogFont != NULL); |
- *(LOGFONT*)this = *pLogFont; |
- } |
- |
- CLogFont& operator =(const CLogFont& src) |
- { |
- Copy(&src); |
- return *this; |
- } |
- |
- CLogFont& operator =(const LOGFONT& src) |
- { |
- Copy(&src); |
- return *this; |
- } |
- |
- CLogFont& operator =(HFONT hFont) |
- { |
- ATLASSERT(::GetObjectType(hFont) == OBJ_FONT); |
- ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this); |
- return *this; |
- } |
- |
- bool operator ==(const LOGFONT& logfont) const |
- { |
- return(logfont.lfHeight == lfHeight && |
- logfont.lfWidth == lfWidth && |
- logfont.lfEscapement == lfEscapement && |
- logfont.lfOrientation == lfOrientation && |
- logfont.lfWeight == lfWeight && |
- logfont.lfItalic == lfItalic && |
- logfont.lfUnderline == lfUnderline && |
- logfont.lfStrikeOut == lfStrikeOut && |
- logfont.lfCharSet == lfCharSet && |
- logfont.lfOutPrecision == lfOutPrecision && |
- logfont.lfClipPrecision == lfClipPrecision && |
- logfont.lfQuality == lfQuality && |
- logfont.lfPitchAndFamily == lfPitchAndFamily && |
- lstrcmp(logfont.lfFaceName, lfFaceName) == 0); |
- } |
-}; |
- |
- |
-template <bool t_bManaged> |
-class CFontT |
-{ |
-public: |
-// Data members |
- HFONT m_hFont; |
- |
-// Constructor/destructor/operators |
- CFontT(HFONT hFont = NULL) : m_hFont(hFont) |
- { } |
- |
- ~CFontT() |
- { |
- if(t_bManaged && m_hFont != NULL) |
- DeleteObject(); |
- } |
- |
- CFontT<t_bManaged>& operator =(HFONT hFont) |
- { |
- Attach(hFont); |
- return *this; |
- } |
- |
- void Attach(HFONT hFont) |
- { |
- if(t_bManaged && m_hFont != NULL && m_hFont != hFont) |
- ::DeleteObject(m_hFont); |
- m_hFont = hFont; |
- } |
- |
- HFONT Detach() |
- { |
- HFONT hFont = m_hFont; |
- m_hFont = NULL; |
- return hFont; |
- } |
- |
- operator HFONT() const { return m_hFont; } |
- |
- bool IsNull() const { return (m_hFont == NULL); } |
- |
-// Create methods |
- HFONT CreateFontIndirect(const LOGFONT* lpLogFont) |
- { |
- ATLASSERT(m_hFont == NULL); |
- m_hFont = ::CreateFontIndirect(lpLogFont); |
- return m_hFont; |
- } |
- |
-#if !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500) |
- HFONT CreateFontIndirectEx(CONST ENUMLOGFONTEXDV* penumlfex) |
- { |
- ATLASSERT(m_hFont == NULL); |
- m_hFont = ::CreateFontIndirectEx(penumlfex); |
- return m_hFont; |
- } |
-#endif // !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500) |
- |
-#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) |
- HFONT CreateFont(int nHeight, int nWidth, int nEscapement, |
- int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, |
- BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, |
- BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, |
- LPCTSTR lpszFacename) |
- { |
- ATLASSERT(m_hFont == NULL); |
-#ifndef _WIN32_WCE |
- m_hFont = ::CreateFont(nHeight, nWidth, nEscapement, |
- nOrientation, nWeight, bItalic, bUnderline, cStrikeOut, |
- nCharSet, nOutPrecision, nClipPrecision, nQuality, |
- nPitchAndFamily, lpszFacename); |
-#else // CE specific |
- m_hFont = ATL::CreateFont(nHeight, nWidth, nEscapement, |
- nOrientation, nWeight, bItalic, bUnderline, cStrikeOut, |
- nCharSet, nOutPrecision, nClipPrecision, nQuality, |
- nPitchAndFamily, lpszFacename); |
-#endif // _WIN32_WCE |
- return m_hFont; |
- } |
-#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) |
- |
- HFONT CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, HDC hDC = NULL, bool bBold = false, bool bItalic = false) |
- { |
- LOGFONT logFont = { 0 }; |
- logFont.lfCharSet = DEFAULT_CHARSET; |
- logFont.lfHeight = nPointSize; |
- SecureHelper::strncpy_x(logFont.lfFaceName, _countof(logFont.lfFaceName), lpszFaceName, _TRUNCATE); |
- |
- if(bBold) |
- logFont.lfWeight = FW_BOLD; |
- if(bItalic) |
- logFont.lfItalic = (BYTE)TRUE; |
- |
- return CreatePointFontIndirect(&logFont, hDC); |
- } |
- |
- HFONT CreatePointFontIndirect(const LOGFONT* lpLogFont, HDC hDC = NULL) |
- { |
- HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL); |
- |
- // convert nPointSize to logical units based on hDC |
- LOGFONT logFont = *lpLogFont; |
-#ifndef _WIN32_WCE |
- POINT pt = { 0, 0 }; |
- pt.y = ::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720); // 72 points/inch, 10 decipoints/point |
- ::DPtoLP(hDC1, &pt, 1); |
- POINT ptOrg = { 0, 0 }; |
- ::DPtoLP(hDC1, &ptOrg, 1); |
- logFont.lfHeight = -abs(pt.y - ptOrg.y); |
-#else // CE specific |
- // DP and LP are always the same on CE |
- logFont.lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720)); // 72 points/inch, 10 decipoints/point |
-#endif // _WIN32_WCE |
- |
- if(hDC == NULL) |
- ::ReleaseDC(NULL, hDC1); |
- |
- return CreateFontIndirect(&logFont); |
- } |
- |
- BOOL DeleteObject() |
- { |
- ATLASSERT(m_hFont != NULL); |
- BOOL bRet = ::DeleteObject(m_hFont); |
- if(bRet) |
- m_hFont = NULL; |
- return bRet; |
- } |
- |
-// Attributes |
- int GetLogFont(LOGFONT* pLogFont) const |
- { |
- ATLASSERT(m_hFont != NULL); |
- return ::GetObject(m_hFont, sizeof(LOGFONT), pLogFont); |
- } |
- |
- bool GetLogFont(LOGFONT& LogFont) const |
- { |
- ATLASSERT(m_hFont != NULL); |
- return (::GetObject(m_hFont, sizeof(LOGFONT), &LogFont) == sizeof(LOGFONT)); |
- } |
-}; |
- |
-typedef CFontT<false> CFontHandle; |
-typedef CFontT<true> CFont; |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// CBitmap |
- |
-template <bool t_bManaged> |
-class CBitmapT |
-{ |
-public: |
-// Data members |
- HBITMAP m_hBitmap; |
- |
-// Constructor/destructor/operators |
- CBitmapT(HBITMAP hBitmap = NULL) : m_hBitmap(hBitmap) |
- { } |
- |
- ~CBitmapT() |
- { |
- if(t_bManaged && m_hBitmap != NULL) |
- DeleteObject(); |
- } |
- |
- CBitmapT<t_bManaged>& operator =(HBITMAP hBitmap) |
- { |
- Attach(hBitmap); |
- return *this; |
- } |
- |
- void Attach(HBITMAP hBitmap) |
- { |
- if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap) |
- ::DeleteObject(m_hBitmap); |
- m_hBitmap = hBitmap; |
- } |
- |
- HBITMAP Detach() |
- { |
- HBITMAP hBitmap = m_hBitmap; |
- m_hBitmap = NULL; |
- return hBitmap; |
- } |
- |
- operator HBITMAP() const { return m_hBitmap; } |
- |
- bool IsNull() const { return (m_hBitmap == NULL); } |
- |
-// Create and load methods |
- HBITMAP LoadBitmap(ATL::_U_STRINGorID bitmap) |
- { |
- ATLASSERT(m_hBitmap == NULL); |
- m_hBitmap = ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr); |
- return m_hBitmap; |
- } |
- |
- HBITMAP LoadOEMBitmap(UINT nIDBitmap) // for OBM_/OCR_/OIC_ |
- { |
- ATLASSERT(m_hBitmap == NULL); |
- m_hBitmap = ::LoadBitmap(NULL, MAKEINTRESOURCE(nIDBitmap)); |
- return m_hBitmap; |
- } |
- |
-#ifndef _WIN32_WCE |
- HBITMAP LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0) |
- { |
- ATLASSERT(m_hBitmap == NULL); |
- m_hBitmap = ::CreateMappedBitmap(ModuleHelper::GetResourceInstance(), nIDBitmap, (WORD)nFlags, lpColorMap, nMapSize); |
- return m_hBitmap; |
- } |
-#endif // !_WIN32_WCE |
- |
- HBITMAP CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitsPerPixel, const void* lpBits) |
- { |
- ATLASSERT(m_hBitmap == NULL); |
- m_hBitmap = ::CreateBitmap(nWidth, nHeight, nPlanes, nBitsPerPixel, lpBits); |
- return m_hBitmap; |
- } |
- |
-#ifndef _WIN32_WCE |
- HBITMAP CreateBitmapIndirect(LPBITMAP lpBitmap) |
- { |
- ATLASSERT(m_hBitmap == NULL); |
- m_hBitmap = ::CreateBitmapIndirect(lpBitmap); |
- return m_hBitmap; |
- } |
-#endif // !_WIN32_WCE |
- |
- HBITMAP CreateCompatibleBitmap(HDC hDC, int nWidth, int nHeight) |
- { |
- ATLASSERT(m_hBitmap == NULL); |
- m_hBitmap = ::CreateCompatibleBitmap(hDC, nWidth, nHeight); |
- return m_hBitmap; |
- } |
- |
-#ifndef _WIN32_WCE |
- HBITMAP CreateDiscardableBitmap(HDC hDC, int nWidth, int nHeight) |
- { |
- ATLASSERT(m_hBitmap == NULL); |
- m_hBitmap = ::CreateDiscardableBitmap(hDC, nWidth, nHeight); |
- return m_hBitmap; |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL DeleteObject() |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- BOOL bRet = ::DeleteObject(m_hBitmap); |
- if(bRet) |
- m_hBitmap = NULL; |
- return bRet; |
- } |
- |
-// Attributes |
- int GetBitmap(BITMAP* pBitMap) const |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- return ::GetObject(m_hBitmap, sizeof(BITMAP), pBitMap); |
- } |
- |
- bool GetBitmap(BITMAP& bm) const |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- return (::GetObject(m_hBitmap, sizeof(BITMAP), &bm) == sizeof(BITMAP)); |
- } |
- |
- bool GetSize(SIZE& size) const |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- BITMAP bm = { 0 }; |
- if(!GetBitmap(&bm)) |
- return false; |
- size.cx = bm.bmWidth; |
- size.cy = bm.bmHeight; |
- return true; |
- } |
- |
-#ifndef _WIN32_WCE |
- DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- return ::GetBitmapBits(m_hBitmap, dwCount, lpBits); |
- } |
-#endif // !_WIN32_WCE |
- |
-#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) |
- DWORD SetBitmapBits(DWORD dwCount, const void* lpBits) |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- return ::SetBitmapBits(m_hBitmap, dwCount, lpBits); |
- } |
-#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) |
- |
-#ifndef _WIN32_WCE |
- BOOL GetBitmapDimension(LPSIZE lpSize) const |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- return ::GetBitmapDimensionEx(m_hBitmap, lpSize); |
- } |
- |
- BOOL SetBitmapDimension(int nWidth, int nHeight, LPSIZE lpSize = NULL) |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- return ::SetBitmapDimensionEx(m_hBitmap, nWidth, nHeight, lpSize); |
- } |
- |
-// DIB support |
- HBITMAP CreateDIBitmap(HDC hDC, CONST BITMAPINFOHEADER* lpbmih, DWORD dwInit, CONST VOID* lpbInit, CONST BITMAPINFO* lpbmi, UINT uColorUse) |
- { |
- ATLASSERT(m_hBitmap == NULL); |
- m_hBitmap = ::CreateDIBitmap(hDC, lpbmih, dwInit, lpbInit, lpbmi, uColorUse); |
- return m_hBitmap; |
- } |
-#endif // !_WIN32_WCE |
- |
- HBITMAP CreateDIBSection(HDC hDC, CONST BITMAPINFO* lpbmi, UINT uColorUse, VOID** ppvBits, HANDLE hSection, DWORD dwOffset) |
- { |
- ATLASSERT(m_hBitmap == NULL); |
- m_hBitmap = ::CreateDIBSection(hDC, lpbmi, uColorUse, ppvBits, hSection, dwOffset); |
- return m_hBitmap; |
- } |
- |
-#ifndef _WIN32_WCE |
- int GetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, LPVOID lpvBits, LPBITMAPINFO lpbmi, UINT uColorUse) const |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- return ::GetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse); |
- } |
- |
- int SetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse) |
- { |
- ATLASSERT(m_hBitmap != NULL); |
- return ::SetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse); |
- } |
-#endif // !_WIN32_WCE |
-}; |
- |
-typedef CBitmapT<false> CBitmapHandle; |
-typedef CBitmapT<true> CBitmap; |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// CPalette |
- |
-template <bool t_bManaged> |
-class CPaletteT |
-{ |
-public: |
-// Data members |
- HPALETTE m_hPalette; |
- |
-// Constructor/destructor/operators |
- CPaletteT(HPALETTE hPalette = NULL) : m_hPalette(hPalette) |
- { } |
- |
- ~CPaletteT() |
- { |
- if(t_bManaged && m_hPalette != NULL) |
- DeleteObject(); |
- } |
- |
- CPaletteT<t_bManaged>& operator =(HPALETTE hPalette) |
- { |
- Attach(hPalette); |
- return *this; |
- } |
- |
- void Attach(HPALETTE hPalette) |
- { |
- if(t_bManaged && m_hPalette != NULL && m_hPalette != hPalette) |
- ::DeleteObject(m_hPalette); |
- m_hPalette = hPalette; |
- } |
- |
- HPALETTE Detach() |
- { |
- HPALETTE hPalette = m_hPalette; |
- m_hPalette = NULL; |
- return hPalette; |
- } |
- |
- operator HPALETTE() const { return m_hPalette; } |
- |
- bool IsNull() const { return (m_hPalette == NULL); } |
- |
-// Create methods |
- HPALETTE CreatePalette(LPLOGPALETTE lpLogPalette) |
- { |
- ATLASSERT(m_hPalette == NULL); |
- m_hPalette = ::CreatePalette(lpLogPalette); |
- return m_hPalette; |
- } |
- |
-#ifndef _WIN32_WCE |
- HPALETTE CreateHalftonePalette(HDC hDC) |
- { |
- ATLASSERT(m_hPalette == NULL); |
- ATLASSERT(hDC != NULL); |
- m_hPalette = ::CreateHalftonePalette(hDC); |
- return m_hPalette; |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL DeleteObject() |
- { |
- ATLASSERT(m_hPalette != NULL); |
- BOOL bRet = ::DeleteObject(m_hPalette); |
- if(bRet) |
- m_hPalette = NULL; |
- return bRet; |
- } |
- |
-// Attributes |
- int GetEntryCount() const |
- { |
- ATLASSERT(m_hPalette != NULL); |
- WORD nEntries = 0; |
- ::GetObject(m_hPalette, sizeof(WORD), &nEntries); |
- return (int)nEntries; |
- } |
- |
- UINT GetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) const |
- { |
- ATLASSERT(m_hPalette != NULL); |
- return ::GetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors); |
- } |
- |
- UINT SetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) |
- { |
- ATLASSERT(m_hPalette != NULL); |
- return ::SetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors); |
- } |
- |
-// Operations |
-#ifndef _WIN32_WCE |
- void AnimatePalette(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) |
- { |
- ATLASSERT(m_hPalette != NULL); |
- ::AnimatePalette(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors); |
- } |
- |
- BOOL ResizePalette(UINT nNumEntries) |
- { |
- ATLASSERT(m_hPalette != NULL); |
- return ::ResizePalette(m_hPalette, nNumEntries); |
- } |
-#endif // !_WIN32_WCE |
- |
- UINT GetNearestPaletteIndex(COLORREF crColor) const |
- { |
- ATLASSERT(m_hPalette != NULL); |
- return ::GetNearestPaletteIndex(m_hPalette, crColor); |
- } |
-}; |
- |
-typedef CPaletteT<false> CPaletteHandle; |
-typedef CPaletteT<true> CPalette; |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// CRgn |
- |
-template <bool t_bManaged> |
-class CRgnT |
-{ |
-public: |
-// Data members |
- HRGN m_hRgn; |
- |
-// Constructor/destructor/operators |
- CRgnT(HRGN hRgn = NULL) : m_hRgn(hRgn) |
- { } |
- |
- ~CRgnT() |
- { |
- if(t_bManaged && m_hRgn != NULL) |
- DeleteObject(); |
- } |
- |
- CRgnT<t_bManaged>& operator =(HRGN hRgn) |
- { |
- Attach(hRgn); |
- return *this; |
- } |
- |
- void Attach(HRGN hRgn) |
- { |
- if(t_bManaged && m_hRgn != NULL && m_hRgn != hRgn) |
- ::DeleteObject(m_hRgn); |
- m_hRgn = hRgn; |
- } |
- |
- HRGN Detach() |
- { |
- HRGN hRgn = m_hRgn; |
- m_hRgn = NULL; |
- return hRgn; |
- } |
- |
- operator HRGN() const { return m_hRgn; } |
- |
- bool IsNull() const { return (m_hRgn == NULL); } |
- |
-// Create methods |
- HRGN CreateRectRgn(int x1, int y1, int x2, int y2) |
- { |
- ATLASSERT(m_hRgn == NULL); |
- m_hRgn = ::CreateRectRgn(x1, y1, x2, y2); |
- return m_hRgn; |
- } |
- |
- HRGN CreateRectRgnIndirect(LPCRECT lpRect) |
- { |
- ATLASSERT(m_hRgn == NULL); |
- m_hRgn = ::CreateRectRgnIndirect(lpRect); |
- return m_hRgn; |
- } |
- |
-#ifndef _WIN32_WCE |
- HRGN CreateEllipticRgn(int x1, int y1, int x2, int y2) |
- { |
- ATLASSERT(m_hRgn == NULL); |
- m_hRgn = ::CreateEllipticRgn(x1, y1, x2, y2); |
- return m_hRgn; |
- } |
- |
- HRGN CreateEllipticRgnIndirect(LPCRECT lpRect) |
- { |
- ATLASSERT(m_hRgn == NULL); |
- m_hRgn = ::CreateEllipticRgnIndirect(lpRect); |
- return m_hRgn; |
- } |
- |
- HRGN CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode) |
- { |
- ATLASSERT(m_hRgn == NULL); |
- m_hRgn = ::CreatePolygonRgn(lpPoints, nCount, nMode); |
- return m_hRgn; |
- } |
- |
- HRGN CreatePolyPolygonRgn(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount, int nPolyFillMode) |
- { |
- ATLASSERT(m_hRgn == NULL); |
- m_hRgn = ::CreatePolyPolygonRgn(lpPoints, lpPolyCounts, nCount, nPolyFillMode); |
- return m_hRgn; |
- } |
- |
- HRGN CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3) |
- { |
- ATLASSERT(m_hRgn == NULL); |
- m_hRgn = ::CreateRoundRectRgn(x1, y1, x2, y2, x3, y3); |
- return m_hRgn; |
- } |
- |
- HRGN CreateFromPath(HDC hDC) |
- { |
- ATLASSERT(m_hRgn == NULL); |
- ATLASSERT(hDC != NULL); |
- m_hRgn = ::PathToRegion(hDC); |
- return m_hRgn; |
- } |
- |
- HRGN CreateFromData(const XFORM* lpXForm, int nCount, const RGNDATA* pRgnData) |
- { |
- ATLASSERT(m_hRgn == NULL); |
- m_hRgn = ::ExtCreateRegion(lpXForm, nCount, pRgnData); |
- return m_hRgn; |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL DeleteObject() |
- { |
- ATLASSERT(m_hRgn != NULL); |
- BOOL bRet = ::DeleteObject(m_hRgn); |
- if(bRet) |
- m_hRgn = NULL; |
- return bRet; |
- } |
- |
-// Operations |
- void SetRectRgn(int x1, int y1, int x2, int y2) |
- { |
- ATLASSERT(m_hRgn != NULL); |
- ::SetRectRgn(m_hRgn, x1, y1, x2, y2); |
- } |
- |
- void SetRectRgn(LPCRECT lpRect) |
- { |
- ATLASSERT(m_hRgn != NULL); |
- ::SetRectRgn(m_hRgn, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); |
- } |
- |
- int CombineRgn(HRGN hRgnSrc1, HRGN hRgnSrc2, int nCombineMode) |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::CombineRgn(m_hRgn, hRgnSrc1, hRgnSrc2, nCombineMode); |
- } |
- |
- int CombineRgn(HRGN hRgnSrc, int nCombineMode) |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::CombineRgn(m_hRgn, m_hRgn, hRgnSrc, nCombineMode); |
- } |
- |
- int CopyRgn(HRGN hRgnSrc) |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::CombineRgn(m_hRgn, hRgnSrc, NULL, RGN_COPY); |
- } |
- |
- BOOL EqualRgn(HRGN hRgn) const |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::EqualRgn(m_hRgn, hRgn); |
- } |
- |
- int OffsetRgn(int x, int y) |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::OffsetRgn(m_hRgn, x, y); |
- } |
- |
- int OffsetRgn(POINT point) |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::OffsetRgn(m_hRgn, point.x, point.y); |
- } |
- |
- int GetRgnBox(LPRECT lpRect) const |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::GetRgnBox(m_hRgn, lpRect); |
- } |
- |
- BOOL PtInRegion(int x, int y) const |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::PtInRegion(m_hRgn, x, y); |
- } |
- |
- BOOL PtInRegion(POINT point) const |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::PtInRegion(m_hRgn, point.x, point.y); |
- } |
- |
- BOOL RectInRegion(LPCRECT lpRect) const |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return ::RectInRegion(m_hRgn, lpRect); |
- } |
- |
- int GetRegionData(LPRGNDATA lpRgnData, int nDataSize) const |
- { |
- ATLASSERT(m_hRgn != NULL); |
- return (int)::GetRegionData(m_hRgn, nDataSize, lpRgnData); |
- } |
-}; |
- |
-typedef CRgnT<false> CRgnHandle; |
-typedef CRgnT<true> CRgn; |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// CDC - The device context class |
- |
-template <bool t_bManaged> |
-class CDCT |
-{ |
-public: |
-// Data members |
- HDC m_hDC; |
- |
-// Constructor/destructor/operators |
- CDCT(HDC hDC = NULL) : m_hDC(hDC) |
- { |
- } |
- |
- ~CDCT() |
- { |
- if(t_bManaged && m_hDC != NULL) |
- ::DeleteDC(Detach()); |
- } |
- |
- CDCT<t_bManaged>& operator =(HDC hDC) |
- { |
- Attach(hDC); |
- return *this; |
- } |
- |
- void Attach(HDC hDC) |
- { |
- if(t_bManaged && m_hDC != NULL && m_hDC != hDC) |
- ::DeleteDC(m_hDC); |
- m_hDC = hDC; |
- } |
- |
- HDC Detach() |
- { |
- HDC hDC = m_hDC; |
- m_hDC = NULL; |
- return hDC; |
- } |
- |
- operator HDC() const { return m_hDC; } |
- |
- bool IsNull() const { return (m_hDC == NULL); } |
- |
-// Operations |
-#ifndef _WIN32_WCE |
- HWND WindowFromDC() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::WindowFromDC(m_hDC); |
- } |
-#endif // !_WIN32_WCE |
- |
- CPenHandle GetCurrentPen() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return CPenHandle((HPEN)::GetCurrentObject(m_hDC, OBJ_PEN)); |
- } |
- |
- CBrushHandle GetCurrentBrush() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return CBrushHandle((HBRUSH)::GetCurrentObject(m_hDC, OBJ_BRUSH)); |
- } |
- |
- CPaletteHandle GetCurrentPalette() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return CPaletteHandle((HPALETTE)::GetCurrentObject(m_hDC, OBJ_PAL)); |
- } |
- |
- CFontHandle GetCurrentFont() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return CFontHandle((HFONT)::GetCurrentObject(m_hDC, OBJ_FONT)); |
- } |
- |
- CBitmapHandle GetCurrentBitmap() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return CBitmapHandle((HBITMAP)::GetCurrentObject(m_hDC, OBJ_BITMAP)); |
- } |
- |
- HDC CreateDC(LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName, LPCTSTR lpszOutput, const DEVMODE* lpInitData) |
- { |
- ATLASSERT(m_hDC == NULL); |
- m_hDC = ::CreateDC(lpszDriverName, lpszDeviceName, lpszOutput, lpInitData); |
- return m_hDC; |
- } |
- |
- HDC CreateCompatibleDC(HDC hDC = NULL) |
- { |
- ATLASSERT(m_hDC == NULL); |
- m_hDC = ::CreateCompatibleDC(hDC); |
- return m_hDC; |
- } |
- |
- BOOL DeleteDC() |
- { |
- if(m_hDC == NULL) |
- return FALSE; |
- BOOL bRet = ::DeleteDC(m_hDC); |
- if(bRet) |
- m_hDC = NULL; |
- return bRet; |
- } |
- |
-// Device-Context Functions |
- int SaveDC() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SaveDC(m_hDC); |
- } |
- |
- BOOL RestoreDC(int nSavedDC) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::RestoreDC(m_hDC, nSavedDC); |
- } |
- |
- int GetDeviceCaps(int nIndex) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetDeviceCaps(m_hDC, nIndex); |
- } |
- |
-#ifndef _WIN32_WCE |
- UINT SetBoundsRect(LPCRECT lpRectBounds, UINT flags) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetBoundsRect(m_hDC, lpRectBounds, flags); |
- } |
- |
- UINT GetBoundsRect(LPRECT lpRectBounds, UINT flags) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetBoundsRect(m_hDC, lpRectBounds, flags); |
- } |
- |
- BOOL ResetDC(const DEVMODE* lpDevMode) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ResetDC(m_hDC, lpDevMode) != NULL; |
- } |
- |
-// Drawing-Tool Functions |
- BOOL GetBrushOrg(LPPOINT lpPoint) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetBrushOrgEx(m_hDC, lpPoint); |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL SetBrushOrg(int x, int y, LPPOINT lpPoint = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetBrushOrgEx(m_hDC, x, y, lpPoint); |
- } |
- |
- BOOL SetBrushOrg(POINT point, LPPOINT lpPointRet = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetBrushOrgEx(m_hDC, point.x, point.y, lpPointRet); |
- } |
- |
-#ifndef _WIN32_WCE |
- int EnumObjects(int nObjectType, int (CALLBACK* lpfn)(LPVOID, LPARAM), LPARAM lpData) |
- { |
- ATLASSERT(m_hDC != NULL); |
-#ifdef STRICT |
- return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, lpData); |
-#else |
- return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, (LPVOID)lpData); |
-#endif |
- } |
-#endif // !_WIN32_WCE |
- |
-// Type-safe selection helpers |
- HPEN SelectPen(HPEN hPen) |
- { |
- ATLASSERT(m_hDC != NULL); |
-#ifndef _WIN32_WCE |
- ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN || ::GetObjectType(hPen) == OBJ_EXTPEN); |
-#else // CE specific |
- ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN); |
-#endif // _WIN32_WCE |
- return (HPEN)::SelectObject(m_hDC, hPen); |
- } |
- |
- HBRUSH SelectBrush(HBRUSH hBrush) |
- { |
- ATLASSERT(m_hDC != NULL); |
- ATLASSERT(hBrush == NULL || ::GetObjectType(hBrush) == OBJ_BRUSH); |
- return (HBRUSH)::SelectObject(m_hDC, hBrush); |
- } |
- |
- HFONT SelectFont(HFONT hFont) |
- { |
- ATLASSERT(m_hDC != NULL); |
- ATLASSERT(hFont == NULL || ::GetObjectType(hFont) == OBJ_FONT); |
- return (HFONT)::SelectObject(m_hDC, hFont); |
- } |
- |
- HBITMAP SelectBitmap(HBITMAP hBitmap) |
- { |
- ATLASSERT(m_hDC != NULL); |
- ATLASSERT(hBitmap == NULL || ::GetObjectType(hBitmap) == OBJ_BITMAP); |
- return (HBITMAP)::SelectObject(m_hDC, hBitmap); |
- } |
- |
- int SelectRgn(HRGN hRgn) // special return for regions |
- { |
- ATLASSERT(m_hDC != NULL); |
- ATLASSERT(hRgn == NULL || ::GetObjectType(hRgn) == OBJ_REGION); |
- return PtrToInt(::SelectObject(m_hDC, hRgn)); |
- } |
- |
-// Type-safe selection helpers for stock objects |
- HPEN SelectStockPen(int nPen) |
- { |
- ATLASSERT(m_hDC != NULL); |
-#if (_WIN32_WINNT >= 0x0500) |
- ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN || nPen == DC_PEN); |
-#else |
- ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN); |
-#endif // !(_WIN32_WINNT >= 0x0500) |
- return SelectPen((HPEN)::GetStockObject(nPen)); |
- } |
- |
- HBRUSH SelectStockBrush(int nBrush) |
- { |
-#if (_WIN32_WINNT >= 0x0500) |
- ATLASSERT((nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH) || nBrush == DC_BRUSH); |
-#else |
- ATLASSERT(nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH); |
-#endif // !(_WIN32_WINNT >= 0x0500) |
- return SelectBrush((HBRUSH)::GetStockObject(nBrush)); |
- } |
- |
- HFONT SelectStockFont(int nFont) |
- { |
-#ifndef _WIN32_WCE |
- ATLASSERT((nFont >= OEM_FIXED_FONT && nFont <= SYSTEM_FIXED_FONT) || nFont == DEFAULT_GUI_FONT); |
-#else // CE specific |
- ATLASSERT(nFont == SYSTEM_FONT); |
-#endif // _WIN32_WCE |
- return SelectFont((HFONT)::GetStockObject(nFont)); |
- } |
- |
- HPALETTE SelectStockPalette(int nPalette, BOOL bForceBackground) |
- { |
- ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supported |
- return SelectPalette((HPALETTE)::GetStockObject(nPalette), bForceBackground); |
- } |
- |
-// Color and Color Palette Functions |
- COLORREF GetNearestColor(COLORREF crColor) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetNearestColor(m_hDC, crColor); |
- } |
- |
- HPALETTE SelectPalette(HPALETTE hPalette, BOOL bForceBackground) |
- { |
- ATLASSERT(m_hDC != NULL); |
- |
- return ::SelectPalette(m_hDC, hPalette, bForceBackground); |
- } |
- |
- UINT RealizePalette() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::RealizePalette(m_hDC); |
- } |
- |
-#ifndef _WIN32_WCE |
- void UpdateColors() |
- { |
- ATLASSERT(m_hDC != NULL); |
- ::UpdateColors(m_hDC); |
- } |
-#endif // !_WIN32_WCE |
- |
-// Drawing-Attribute Functions |
- COLORREF GetBkColor() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetBkColor(m_hDC); |
- } |
- |
- int GetBkMode() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetBkMode(m_hDC); |
- } |
- |
-#ifndef _WIN32_WCE |
- int GetPolyFillMode() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetPolyFillMode(m_hDC); |
- } |
- |
- int GetROP2() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetROP2(m_hDC); |
- } |
- |
- int GetStretchBltMode() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetStretchBltMode(m_hDC); |
- } |
-#endif // !_WIN32_WCE |
- |
- COLORREF GetTextColor() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetTextColor(m_hDC); |
- } |
- |
- COLORREF SetBkColor(COLORREF crColor) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetBkColor(m_hDC, crColor); |
- } |
- |
- int SetBkMode(int nBkMode) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetBkMode(m_hDC, nBkMode); |
- } |
- |
-#ifndef _WIN32_WCE |
- int SetPolyFillMode(int nPolyFillMode) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetPolyFillMode(m_hDC, nPolyFillMode); |
- } |
-#endif // !_WIN32_WCE |
- |
- int SetROP2(int nDrawMode) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetROP2(m_hDC, nDrawMode); |
- } |
- |
-#ifndef _WIN32_WCE |
- int SetStretchBltMode(int nStretchMode) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetStretchBltMode(m_hDC, nStretchMode); |
- } |
-#endif // !_WIN32_WCE |
- |
- COLORREF SetTextColor(COLORREF crColor) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetTextColor(m_hDC, crColor); |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL GetColorAdjustment(LPCOLORADJUSTMENT lpColorAdjust) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetColorAdjustment(m_hDC, lpColorAdjust); |
- } |
- |
- BOOL SetColorAdjustment(const COLORADJUSTMENT* lpColorAdjust) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetColorAdjustment(m_hDC, lpColorAdjust); |
- } |
- |
-// Mapping Functions |
- int GetMapMode() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetMapMode(m_hDC); |
- } |
- |
- BOOL GetViewportOrg(LPPOINT lpPoint) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetViewportOrgEx(m_hDC, lpPoint); |
- } |
- |
- int SetMapMode(int nMapMode) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetMapMode(m_hDC, nMapMode); |
- } |
-#endif // !_WIN32_WCE |
- |
- // Viewport Origin |
- BOOL SetViewportOrg(int x, int y, LPPOINT lpPoint = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetViewportOrgEx(m_hDC, x, y, lpPoint); |
- } |
- |
- BOOL SetViewportOrg(POINT point, LPPOINT lpPointRet = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return SetViewportOrg(point.x, point.y, lpPointRet); |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL OffsetViewportOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::OffsetViewportOrgEx(m_hDC, nWidth, nHeight, lpPoint); |
- } |
- |
- // Viewport Extent |
- BOOL GetViewportExt(LPSIZE lpSize) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetViewportExtEx(m_hDC, lpSize); |
- } |
- |
- BOOL SetViewportExt(int x, int y, LPSIZE lpSize = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetViewportExtEx(m_hDC, x, y, lpSize); |
- } |
- |
- BOOL SetViewportExt(SIZE size, LPSIZE lpSizeRet = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return SetViewportExt(size.cx, size.cy, lpSizeRet); |
- } |
- |
- BOOL ScaleViewportExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ScaleViewportExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize); |
- } |
-#endif // !_WIN32_WCE |
- |
- // Window Origin |
-#ifndef _WIN32_WCE |
- BOOL GetWindowOrg(LPPOINT lpPoint) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetWindowOrgEx(m_hDC, lpPoint); |
- } |
- |
- BOOL SetWindowOrg(int x, int y, LPPOINT lpPoint = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetWindowOrgEx(m_hDC, x, y, lpPoint); |
- } |
- |
- BOOL SetWindowOrg(POINT point, LPPOINT lpPointRet = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return SetWindowOrg(point.x, point.y, lpPointRet); |
- } |
- |
- BOOL OffsetWindowOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::OffsetWindowOrgEx(m_hDC, nWidth, nHeight, lpPoint); |
- } |
- |
- // Window extent |
- BOOL GetWindowExt(LPSIZE lpSize) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetWindowExtEx(m_hDC, lpSize); |
- } |
- |
- BOOL SetWindowExt(int x, int y, LPSIZE lpSize = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetWindowExtEx(m_hDC, x, y, lpSize); |
- } |
- |
- BOOL SetWindowExt(SIZE size, LPSIZE lpSizeRet = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return SetWindowExt(size.cx, size.cy, lpSizeRet); |
- } |
- |
- BOOL ScaleWindowExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ScaleWindowExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize); |
- } |
- |
-// Coordinate Functions |
- BOOL DPtoLP(LPPOINT lpPoints, int nCount = 1) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DPtoLP(m_hDC, lpPoints, nCount); |
- } |
- |
- BOOL DPtoLP(LPRECT lpRect) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DPtoLP(m_hDC, (LPPOINT)lpRect, 2); |
- } |
- |
- BOOL DPtoLP(LPSIZE lpSize) const |
- { |
- SIZE sizeWinExt = { 0, 0 }; |
- if(!GetWindowExt(&sizeWinExt)) |
- return FALSE; |
- SIZE sizeVpExt = { 0, 0 }; |
- if(!GetViewportExt(&sizeVpExt)) |
- return FALSE; |
- lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeWinExt.cx), abs(sizeVpExt.cx)); |
- lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeWinExt.cy), abs(sizeVpExt.cy)); |
- return TRUE; |
- } |
- |
- BOOL LPtoDP(LPPOINT lpPoints, int nCount = 1) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::LPtoDP(m_hDC, lpPoints, nCount); |
- } |
- |
- BOOL LPtoDP(LPRECT lpRect) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::LPtoDP(m_hDC, (LPPOINT)lpRect, 2); |
- } |
- |
- BOOL LPtoDP(LPSIZE lpSize) const |
- { |
- SIZE sizeWinExt = { 0, 0 }; |
- if(!GetWindowExt(&sizeWinExt)) |
- return FALSE; |
- SIZE sizeVpExt = { 0, 0 }; |
- if(!GetViewportExt(&sizeVpExt)) |
- return FALSE; |
- lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeVpExt.cx), abs(sizeWinExt.cx)); |
- lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeVpExt.cy), abs(sizeWinExt.cy)); |
- return TRUE; |
- } |
- |
-// Special Coordinate Functions (useful for dealing with metafiles and OLE) |
- #define HIMETRIC_INCH 2540 // HIMETRIC units per inch |
- |
- void DPtoHIMETRIC(LPSIZE lpSize) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- int nMapMode; |
- if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT) |
- { |
- // when using a constrained map mode, map against physical inch |
- ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC); |
- DPtoLP(lpSize); |
- ((CDCHandle*)this)->SetMapMode(nMapMode); |
- } |
- else |
- { |
- // map against logical inch for non-constrained mapping modes |
- int cxPerInch = GetDeviceCaps(LOGPIXELSX); |
- int cyPerInch = GetDeviceCaps(LOGPIXELSY); |
- ATLASSERT(cxPerInch != 0 && cyPerInch != 0); |
- lpSize->cx = ::MulDiv(lpSize->cx, HIMETRIC_INCH, cxPerInch); |
- lpSize->cy = ::MulDiv(lpSize->cy, HIMETRIC_INCH, cyPerInch); |
- } |
- } |
- |
- void HIMETRICtoDP(LPSIZE lpSize) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- int nMapMode; |
- if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT) |
- { |
- // when using a constrained map mode, map against physical inch |
- ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC); |
- LPtoDP(lpSize); |
- ((CDCHandle*)this)->SetMapMode(nMapMode); |
- } |
- else |
- { |
- // map against logical inch for non-constrained mapping modes |
- int cxPerInch = GetDeviceCaps(LOGPIXELSX); |
- int cyPerInch = GetDeviceCaps(LOGPIXELSY); |
- ATLASSERT(cxPerInch != 0 && cyPerInch != 0); |
- lpSize->cx = ::MulDiv(lpSize->cx, cxPerInch, HIMETRIC_INCH); |
- lpSize->cy = ::MulDiv(lpSize->cy, cyPerInch, HIMETRIC_INCH); |
- } |
- } |
- |
- void LPtoHIMETRIC(LPSIZE lpSize) const |
- { |
- LPtoDP(lpSize); |
- DPtoHIMETRIC(lpSize); |
- } |
- |
- void HIMETRICtoLP(LPSIZE lpSize) const |
- { |
- HIMETRICtoDP(lpSize); |
- DPtoLP(lpSize); |
- } |
-#endif // !_WIN32_WCE |
- |
-// Region Functions |
- BOOL FillRgn(HRGN hRgn, HBRUSH hBrush) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::FillRgn(m_hDC, hRgn, hBrush); |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL FrameRgn(HRGN hRgn, HBRUSH hBrush, int nWidth, int nHeight) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::FrameRgn(m_hDC, hRgn, hBrush, nWidth, nHeight); |
- } |
- |
- BOOL InvertRgn(HRGN hRgn) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::InvertRgn(m_hDC, hRgn); |
- } |
- |
- BOOL PaintRgn(HRGN hRgn) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PaintRgn(m_hDC, hRgn); |
- } |
-#endif // !_WIN32_WCE |
- |
-// Clipping Functions |
- int GetClipBox(LPRECT lpRect) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetClipBox(m_hDC, lpRect); |
- } |
- |
- int GetClipRgn(CRgn& region) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- if(region.IsNull()) |
- region.CreateRectRgn(0, 0, 0, 0); |
- |
- int nRet = ::GetClipRgn(m_hDC, region); |
- if(nRet != 1) |
- region.DeleteObject(); |
- |
- return nRet; |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL PtVisible(int x, int y) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PtVisible(m_hDC, x, y); |
- } |
- |
- BOOL PtVisible(POINT point) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PtVisible(m_hDC, point.x, point.y); |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL RectVisible(LPCRECT lpRect) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::RectVisible(m_hDC, lpRect); |
- } |
- |
- int SelectClipRgn(HRGN hRgn) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SelectClipRgn(m_hDC, (HRGN)hRgn); |
- } |
- |
- int ExcludeClipRect(int x1, int y1, int x2, int y2) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ExcludeClipRect(m_hDC, x1, y1, x2, y2); |
- } |
- |
- int ExcludeClipRect(LPCRECT lpRect) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ExcludeClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); |
- } |
- |
-#ifndef _WIN32_WCE |
- int ExcludeUpdateRgn(HWND hWnd) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ExcludeUpdateRgn(m_hDC, hWnd); |
- } |
-#endif // !_WIN32_WCE |
- |
- int IntersectClipRect(int x1, int y1, int x2, int y2) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::IntersectClipRect(m_hDC, x1, y1, x2, y2); |
- } |
- |
- int IntersectClipRect(LPCRECT lpRect) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::IntersectClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); |
- } |
- |
-#ifndef _WIN32_WCE |
- int OffsetClipRgn(int x, int y) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::OffsetClipRgn(m_hDC, x, y); |
- } |
- |
- int OffsetClipRgn(SIZE size) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::OffsetClipRgn(m_hDC, size.cx, size.cy); |
- } |
- |
- int SelectClipRgn(HRGN hRgn, int nMode) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ExtSelectClipRgn(m_hDC, hRgn, nMode); |
- } |
-#endif // !_WIN32_WCE |
- |
-// Line-Output Functions |
-#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) |
- BOOL GetCurrentPosition(LPPOINT lpPoint) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetCurrentPositionEx(m_hDC, lpPoint); |
- } |
- |
- BOOL MoveTo(int x, int y, LPPOINT lpPoint = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::MoveToEx(m_hDC, x, y, lpPoint); |
- } |
- |
- BOOL MoveTo(POINT point, LPPOINT lpPointRet = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return MoveTo(point.x, point.y, lpPointRet); |
- } |
- |
- BOOL LineTo(int x, int y) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::LineTo(m_hDC, x, y); |
- } |
- |
- BOOL LineTo(POINT point) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return LineTo(point.x, point.y); |
- } |
-#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) |
- |
-#ifndef _WIN32_WCE |
- BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Arc(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); |
- } |
- |
- BOOL Arc(LPCRECT lpRect, POINT ptStart, POINT ptEnd) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Arc(m_hDC, lpRect->left, lpRect->top, |
- lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, |
- ptEnd.x, ptEnd.y); |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL Polyline(LPPOINT lpPoints, int nCount) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Polyline(m_hDC, lpPoints, nCount); |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweepAngle) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::AngleArc(m_hDC, x, y, nRadius, fStartAngle, fSweepAngle); |
- } |
- |
- BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ArcTo(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); |
- } |
- |
- BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ArcTo(lpRect->left, lpRect->top, lpRect->right, |
- lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); |
- } |
- |
- int GetArcDirection() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetArcDirection(m_hDC); |
- } |
- |
- int SetArcDirection(int nArcDirection) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetArcDirection(m_hDC, nArcDirection); |
- } |
- |
- BOOL PolyDraw(const POINT* lpPoints, const BYTE* lpTypes, int nCount) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PolyDraw(m_hDC, lpPoints, lpTypes, nCount); |
- } |
- |
- BOOL PolylineTo(const POINT* lpPoints, int nCount) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PolylineTo(m_hDC, lpPoints, nCount); |
- } |
- |
- BOOL PolyPolyline(const POINT* lpPoints, |
- const DWORD* lpPolyPoints, int nCount) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PolyPolyline(m_hDC, lpPoints, lpPolyPoints, nCount); |
- } |
- |
- BOOL PolyBezier(const POINT* lpPoints, int nCount) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PolyBezier(m_hDC, lpPoints, nCount); |
- } |
- |
- BOOL PolyBezierTo(const POINT* lpPoints, int nCount) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PolyBezierTo(m_hDC, lpPoints, nCount); |
- } |
-#endif // !_WIN32_WCE |
- |
-// Simple Drawing Functions |
- BOOL FillRect(LPCRECT lpRect, HBRUSH hBrush) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::FillRect(m_hDC, lpRect, hBrush); |
- } |
- |
- BOOL FillRect(LPCRECT lpRect, int nColorIndex) |
- { |
- ATLASSERT(m_hDC != NULL); |
-#ifndef _WIN32_WCE |
- return ::FillRect(m_hDC, lpRect, (HBRUSH)LongToPtr(nColorIndex + 1)); |
-#else // CE specific |
- return ::FillRect(m_hDC, lpRect, ::GetSysColorBrush(nColorIndex)); |
-#endif // _WIN32_WCE |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL FrameRect(LPCRECT lpRect, HBRUSH hBrush) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::FrameRect(m_hDC, lpRect, hBrush); |
- } |
-#endif // !_WIN32_WCE |
- |
-#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) |
- BOOL InvertRect(LPCRECT lpRect) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::InvertRect(m_hDC, lpRect); |
- } |
-#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) |
- |
- BOOL DrawIcon(int x, int y, HICON hIcon) |
- { |
- ATLASSERT(m_hDC != NULL); |
-#ifndef _WIN32_WCE |
- return ::DrawIcon(m_hDC, x, y, hIcon); |
-#else // CE specific |
- return ::DrawIconEx(m_hDC, x, y, hIcon, 0, 0, 0, NULL, DI_NORMAL); |
-#endif // _WIN32_WCE |
- } |
- |
- BOOL DrawIcon(POINT point, HICON hIcon) |
- { |
- ATLASSERT(m_hDC != NULL); |
-#ifndef _WIN32_WCE |
- return ::DrawIcon(m_hDC, point.x, point.y, hIcon); |
-#else // CE specific |
- return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, 0, 0, 0, NULL, DI_NORMAL); |
-#endif // _WIN32_WCE |
- } |
- |
- BOOL DrawIconEx(int x, int y, HICON hIcon, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawIconEx(m_hDC, x, y, hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); |
- } |
- |
- BOOL DrawIconEx(POINT point, HICON hIcon, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL DrawState(POINT pt, SIZE size, HBITMAP hBitmap, UINT nFlags, HBRUSH hBrush = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hBitmap, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_BITMAP); |
- } |
- |
- BOOL DrawState(POINT pt, SIZE size, HICON hIcon, UINT nFlags, HBRUSH hBrush = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hIcon, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_ICON); |
- } |
- |
- BOOL DrawState(POINT pt, SIZE size, LPCTSTR lpszText, UINT nFlags, BOOL bPrefixText = TRUE, int nTextLen = 0, HBRUSH hBrush = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)lpszText, (WPARAM)nTextLen, pt.x, pt.y, size.cx, size.cy, nFlags | (bPrefixText ? DST_PREFIXTEXT : DST_TEXT)); |
- } |
- |
- BOOL DrawState(POINT pt, SIZE size, DRAWSTATEPROC lpDrawProc, LPARAM lData, UINT nFlags, HBRUSH hBrush = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawState(m_hDC, hBrush, lpDrawProc, lData, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_COMPLEX); |
- } |
-#endif // !_WIN32_WCE |
- |
-// Ellipse and Polygon Functions |
-#ifndef _WIN32_WCE |
- BOOL Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Chord(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); |
- } |
- |
- BOOL Chord(LPCRECT lpRect, POINT ptStart, POINT ptEnd) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Chord(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); |
- } |
-#endif // !_WIN32_WCE |
- |
- void DrawFocusRect(LPCRECT lpRect) |
- { |
- ATLASSERT(m_hDC != NULL); |
- ::DrawFocusRect(m_hDC, lpRect); |
- } |
- |
- BOOL Ellipse(int x1, int y1, int x2, int y2) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Ellipse(m_hDC, x1, y1, x2, y2); |
- } |
- |
- BOOL Ellipse(LPCRECT lpRect) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Ellipse(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Pie(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); |
- } |
- |
- BOOL Pie(LPCRECT lpRect, POINT ptStart, POINT ptEnd) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Pie(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL Polygon(LPPOINT lpPoints, int nCount) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Polygon(m_hDC, lpPoints, nCount); |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL PolyPolygon(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PolyPolygon(m_hDC, lpPoints, lpPolyCounts, nCount); |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL Rectangle(int x1, int y1, int x2, int y2) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Rectangle(m_hDC, x1, y1, x2, y2); |
- } |
- |
- BOOL Rectangle(LPCRECT lpRect) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Rectangle(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); |
- } |
- |
- BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::RoundRect(m_hDC, x1, y1, x2, y2, x3, y3); |
- } |
- |
- BOOL RoundRect(LPCRECT lpRect, POINT point) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::RoundRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, point.x, point.y); |
- } |
- |
-// Bitmap Functions |
- BOOL PatBlt(int x, int y, int nWidth, int nHeight, DWORD dwRop) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PatBlt(m_hDC, x, y, nWidth, nHeight, dwRop); |
- } |
- |
- BOOL BitBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, |
- int xSrc, int ySrc, DWORD dwRop) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::BitBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop); |
- } |
- |
- BOOL StretchBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::StretchBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, dwRop); |
- } |
- |
- COLORREF GetPixel(int x, int y) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetPixel(m_hDC, x, y); |
- } |
- |
- COLORREF GetPixel(POINT point) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetPixel(m_hDC, point.x, point.y); |
- } |
- |
- COLORREF SetPixel(int x, int y, COLORREF crColor) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetPixel(m_hDC, x, y, crColor); |
- } |
- |
- COLORREF SetPixel(POINT point, COLORREF crColor) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetPixel(m_hDC, point.x, point.y, crColor); |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL FloodFill(int x, int y, COLORREF crColor) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::FloodFill(m_hDC, x, y, crColor); |
- } |
- |
- BOOL ExtFloodFill(int x, int y, COLORREF crColor, UINT nFillType) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ExtFloodFill(m_hDC, x, y, crColor, nFillType); |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL MaskBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, HBITMAP hMaskBitmap, int xMask, int yMask, DWORD dwRop) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::MaskBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, hMaskBitmap, xMask, yMask, dwRop); |
- } |
- |
-#ifndef _WIN32_WCE |
- BOOL PlgBlt(LPPOINT lpPoint, HDC hSrcDC, int xSrc, int ySrc, int nWidth, int nHeight, HBITMAP hMaskBitmap, int xMask, int yMask) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PlgBlt(m_hDC, lpPoint, hSrcDC, xSrc, ySrc, nWidth, nHeight, hMaskBitmap, xMask, yMask); |
- } |
- |
- BOOL SetPixelV(int x, int y, COLORREF crColor) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetPixelV(m_hDC, x, y, crColor); |
- } |
- |
- BOOL SetPixelV(POINT point, COLORREF crColor) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetPixelV(m_hDC, point.x, point.y, crColor); |
- } |
-#endif // !_WIN32_WCE |
- |
-#if !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE) |
-#ifndef _WIN32_WCE |
- BOOL TransparentBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::TransparentBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent); |
- } |
-#else // CE specific |
- BOOL TransparentImage(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::TransparentImage(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent); |
- } |
-#endif // _WIN32_WCE |
- |
-#if (!defined(_WIN32_WCE) || (_WIN32_WCE >= 420)) |
- BOOL GradientFill(const PTRIVERTEX pVertices, DWORD nVertices, void* pMeshElements, DWORD nMeshElements, DWORD dwMode) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GradientFill(m_hDC, pVertices, nVertices, pMeshElements, nMeshElements, dwMode); |
- } |
-#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) |
- |
-#if !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500) |
- BOOL AlphaBlend(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, BLENDFUNCTION bf) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::AlphaBlend(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, bf); |
- } |
-#endif // !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500) |
-#endif // !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE) |
- |
-// Extra bitmap functions |
- // Helper function for painting a disabled toolbar or menu bitmap |
- // This function can take either an HBITMAP (for SS) or a DC with |
- // the bitmap already painted (for cmdbar) |
- BOOL DitherBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, HBITMAP hBitmap, int xSrc, int ySrc, |
- HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE), |
- HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT), |
- HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW)) |
- { |
- ATLASSERT(m_hDC != NULL || hBitmap != NULL); |
- ATLASSERT(nWidth > 0 && nHeight > 0); |
- |
- // Create a generic DC for all BitBlts |
- CDCHandle dc = (hSrcDC != NULL) ? hSrcDC : ::CreateCompatibleDC(m_hDC); |
- ATLASSERT(dc.m_hDC != NULL); |
- if(dc.m_hDC == NULL) |
- return FALSE; |
- |
- // Create a DC for the monochrome DIB section |
- CDC dcBW = ::CreateCompatibleDC(m_hDC); |
- ATLASSERT(dcBW.m_hDC != NULL); |
- if(dcBW.m_hDC == NULL) |
- { |
- if(hSrcDC == NULL) |
- dc.DeleteDC(); |
- return FALSE; |
- } |
- |
- // Create the monochrome DIB section with a black and white palette |
- struct RGBBWBITMAPINFO |
- { |
- BITMAPINFOHEADER bmiHeader; |
- RGBQUAD bmiColors[2]; |
- }; |
- |
- RGBBWBITMAPINFO rgbBWBitmapInfo = |
- { |
- { sizeof(BITMAPINFOHEADER), nWidth, nHeight, 1, 1, BI_RGB, 0, 0, 0, 0, 0 }, |
- { { 0x00, 0x00, 0x00, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x00 } } |
- }; |
- |
- VOID* pbitsBW; |
- CBitmap bmpBW = ::CreateDIBSection(dcBW, (LPBITMAPINFO)&rgbBWBitmapInfo, DIB_RGB_COLORS, &pbitsBW, NULL, 0); |
- ATLASSERT(bmpBW.m_hBitmap != NULL); |
- if(bmpBW.m_hBitmap == NULL) |
- { |
- if(hSrcDC == NULL) |
- dc.DeleteDC(); |
- return FALSE; |
- } |
- |
- // Attach the monochrome DIB section and the bitmap to the DCs |
- HBITMAP hbmOldBW = dcBW.SelectBitmap(bmpBW); |
- HBITMAP hbmOldDC = NULL; |
- if(hBitmap != NULL) |
- hbmOldDC = dc.SelectBitmap(hBitmap); |
- |
- // Block: Dark gray removal: we want (128, 128, 128) pixels to become black and not white |
- { |
- CDC dcTemp1 = ::CreateCompatibleDC(m_hDC); |
- CDC dcTemp2 = ::CreateCompatibleDC(m_hDC); |
- CBitmap bmpTemp1; |
- bmpTemp1.CreateCompatibleBitmap(dc, nWidth, nHeight); |
- CBitmap bmpTemp2; |
- bmpTemp2.CreateBitmap(nWidth, nHeight, 1, 1, NULL); |
- HBITMAP hOldBmp1 = dcTemp1.SelectBitmap(bmpTemp1); |
- HBITMAP hOldBmp2 = dcTemp2.SelectBitmap(bmpTemp2); |
- // Let's copy our image, it will be altered |
- dcTemp1.BitBlt(0, 0, nWidth, nHeight, dc, xSrc, ySrc, SRCCOPY); |
- |
- // All dark gray pixels will become white, the others black |
- dcTemp1.SetBkColor(RGB(128, 128, 128)); |
- dcTemp2.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY); |
- // Do an XOR to set to black these white pixels |
- dcTemp1.BitBlt(0, 0, nWidth, nHeight, dcTemp2, 0, 0, SRCINVERT); |
- |
- // BitBlt the bitmap into the monochrome DIB section |
- // The DIB section will do a true monochrome conversion |
- // The magenta background being closer to white will become white |
- dcBW.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY); |
- |
- // Cleanup |
- dcTemp1.SelectBitmap(hOldBmp1); |
- dcTemp2.SelectBitmap(hOldBmp2); |
- } |
- |
- // Paint the destination rectangle using hBrushBackground |
- if(hBrushBackground != NULL) |
- { |
- RECT rc = { x, y, x + nWidth, y + nHeight }; |
- FillRect(&rc, hBrushBackground); |
- } |
- |
- // BitBlt the black bits in the monochrome bitmap into hBrush3DEffect color in the destination DC |
- // The magic ROP comes from the Charles Petzold's book |
- HBRUSH hOldBrush = SelectBrush(hBrush3DEffect); |
- BitBlt(x + 1, y + 1, nWidth, nHeight, dcBW, 0, 0, 0xB8074A); |
- |
- // BitBlt the black bits in the monochrome bitmap into hBrushDisabledImage color in the destination DC |
- SelectBrush(hBrushDisabledImage); |
- BitBlt(x, y, nWidth, nHeight, dcBW, 0, 0, 0xB8074A); |
- |
- SelectBrush(hOldBrush); |
- dcBW.SelectBitmap(hbmOldBW); |
- dc.SelectBitmap(hbmOldDC); |
- |
- if(hSrcDC == NULL) |
- dc.DeleteDC(); |
- |
- return TRUE; |
- } |
- |
-// Text Functions |
-#ifndef _WIN32_WCE |
- BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount = -1) |
- { |
- ATLASSERT(m_hDC != NULL); |
- if(nCount == -1) |
- nCount = lstrlen(lpszString); |
- return ::TextOut(m_hDC, x, y, lpszString, nCount); |
- } |
-#endif // !_WIN32_WCE |
- |
- BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount = -1, LPINT lpDxWidths = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- if(nCount == -1) |
- nCount = lstrlen(lpszString); |
- return ::ExtTextOut(m_hDC, x, y, nOptions, lpRect, lpszString, nCount, lpDxWidths); |
- } |
- |
-#ifndef _WIN32_WCE |
- SIZE TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL, int nTabOrigin = 0) |
- { |
- ATLASSERT(m_hDC != NULL); |
- if(nCount == -1) |
- nCount = lstrlen(lpszString); |
- LONG lRes = ::TabbedTextOut(m_hDC, x, y, lpszString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin); |
- SIZE size = { GET_X_LPARAM(lRes), GET_Y_LPARAM(lRes) }; |
- return size; |
- } |
-#endif // !_WIN32_WCE |
- |
- int DrawText(LPCTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat) |
- { |
- ATLASSERT(m_hDC != NULL); |
-#ifndef _WIN32_WCE |
- ATLASSERT((uFormat & DT_MODIFYSTRING) == 0); |
-#endif // !_WIN32_WCE |
- return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat); |
- } |
- |
- int DrawText(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat); |
- } |
- |
-#ifndef _WIN32_WCE |
- int DrawTextEx(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat, LPDRAWTEXTPARAMS lpDTParams = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawTextEx(m_hDC, lpstrText, cchText, lpRect, uFormat, lpDTParams); |
- } |
-#endif // !_WIN32_WCE |
- |
-#if (_WIN32_WINNT >= 0x0501) |
- int DrawShadowText(LPCWSTR lpstrText, int cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset) |
- { |
- ATLASSERT(m_hDC != NULL); |
- // This function is present only if comctl32.dll version 6 is loaded; |
- // we use LoadLibrary/GetProcAddress to allow apps compiled with |
- // _WIN32_WINNT >= 0x0501 to run on older Windows/CommCtrl |
- int nRet = 0; |
- HMODULE hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll")); |
- ATLASSERT(hCommCtrlDLL != NULL); |
- if(hCommCtrlDLL != NULL) |
- { |
- typedef int (WINAPI *PFN_DrawShadowText)(HDC hDC, LPCWSTR lpstrText, UINT cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset); |
- PFN_DrawShadowText pfnDrawShadowText = (PFN_DrawShadowText)::GetProcAddress(hCommCtrlDLL, "DrawShadowText"); |
- ATLASSERT(pfnDrawShadowText != NULL); // this function requires CommCtrl6 |
- if(pfnDrawShadowText != NULL) |
- nRet = pfnDrawShadowText(m_hDC, lpstrText, cchText, lpRect, dwFlags, clrText, clrShadow, xOffset, yOffset); |
- ::FreeLibrary(hCommCtrlDLL); |
- } |
- return nRet; |
- } |
-#endif // (_WIN32_WINNT >= 0x0501) |
- |
- BOOL GetTextExtent(LPCTSTR lpszString, int nCount, LPSIZE lpSize) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- if(nCount == -1) |
- nCount = lstrlen(lpszString); |
- return ::GetTextExtentPoint32(m_hDC, lpszString, nCount, lpSize); |
- } |
- |
- BOOL GetTextExtentExPoint(LPCTSTR lpszString, int cchString, LPSIZE lpSize, int nMaxExtent, LPINT lpnFit = NULL, LPINT alpDx = NULL) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetTextExtentExPoint(m_hDC, lpszString, cchString, nMaxExtent, lpnFit, alpDx, lpSize); |
- } |
- |
-#ifndef _WIN32_WCE |
- DWORD GetTabbedTextExtent(LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- if(nCount == -1) |
- nCount = lstrlen(lpszString); |
- return ::GetTabbedTextExtent(m_hDC, lpszString, nCount, nTabPositions, lpnTabStopPositions); |
- } |
- |
- BOOL GrayString(HBRUSH hBrush, BOOL (CALLBACK* lpfnOutput)(HDC, LPARAM, int), LPARAM lpData, int nCount, int x, int y, int nWidth, int nHeight) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GrayString(m_hDC, hBrush, (GRAYSTRINGPROC)lpfnOutput, lpData, nCount, x, y, nWidth, nHeight); |
- } |
-#endif // !_WIN32_WCE |
- |
-#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) |
- UINT GetTextAlign() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetTextAlign(m_hDC); |
- } |
- |
- UINT SetTextAlign(UINT nFlags) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetTextAlign(m_hDC, nFlags); |
- } |
-#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) |
- |
- int GetTextFace(LPTSTR lpszFacename, int nCount) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetTextFace(m_hDC, nCount, lpszFacename); |
- } |
- |
- int GetTextFaceLen() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetTextFace(m_hDC, 0, NULL); |
- } |
- |
-#ifndef _ATL_NO_COM |
-#ifdef _OLEAUTO_H_ |
- BOOL GetTextFace(BSTR& bstrFace) const |
- { |
- USES_CONVERSION; |
- ATLASSERT(m_hDC != NULL); |
- ATLASSERT(bstrFace == NULL); |
- |
- int nLen = GetTextFaceLen(); |
- if(nLen == 0) |
- return FALSE; |
- |
- CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff; |
- LPTSTR lpszText = buff.Allocate(nLen); |
- if(lpszText == NULL) |
- return FALSE; |
- |
- if(!GetTextFace(lpszText, nLen)) |
- return FALSE; |
- |
- bstrFace = ::SysAllocString(T2OLE(lpszText)); |
- return (bstrFace != NULL) ? TRUE : FALSE; |
- } |
-#endif |
-#endif // !_ATL_NO_COM |
- |
-#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) |
- int GetTextFace(_CSTRING_NS::CString& strFace) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- |
- int nLen = GetTextFaceLen(); |
- if(nLen == 0) |
- return 0; |
- |
- LPTSTR lpstr = strFace.GetBufferSetLength(nLen); |
- if(lpstr == NULL) |
- return 0; |
- int nRet = GetTextFace(lpstr, nLen); |
- strFace.ReleaseBuffer(); |
- return nRet; |
- } |
-#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) |
- |
- BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetTextMetrics(m_hDC, lpMetrics); |
- } |
- |
-#ifndef _WIN32_WCE |
- int SetTextJustification(int nBreakExtra, int nBreakCount) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetTextJustification(m_hDC, nBreakExtra, nBreakCount); |
- } |
- |
- int GetTextCharacterExtra() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetTextCharacterExtra(m_hDC); |
- } |
- |
- int SetTextCharacterExtra(int nCharExtra) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetTextCharacterExtra(m_hDC, nCharExtra); |
- } |
-#endif // !_WIN32_WCE |
- |
-// Advanced Drawing |
- BOOL DrawEdge(LPRECT lpRect, UINT nEdge, UINT nFlags) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawEdge(m_hDC, lpRect, nEdge, nFlags); |
- } |
- |
- BOOL DrawFrameControl(LPRECT lpRect, UINT nType, UINT nState) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawFrameControl(m_hDC, lpRect, nType, nState); |
- } |
- |
-// Scrolling Functions |
- BOOL ScrollDC(int dx, int dy, LPCRECT lpRectScroll, LPCRECT lpRectClip, HRGN hRgnUpdate, LPRECT lpRectUpdate) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ScrollDC(m_hDC, dx, dy, lpRectScroll, lpRectClip, hRgnUpdate, lpRectUpdate); |
- } |
- |
-// Font Functions |
-#ifndef _WIN32_WCE |
- BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetCharWidth(m_hDC, nFirstChar, nLastChar, lpBuffer); |
- } |
- |
- // GetCharWidth32 is not supported under Win9x |
- BOOL GetCharWidth32(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetCharWidth32(m_hDC, nFirstChar, nLastChar, lpBuffer); |
- } |
- |
- DWORD SetMapperFlags(DWORD dwFlag) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetMapperFlags(m_hDC, dwFlag); |
- } |
- |
- BOOL GetAspectRatioFilter(LPSIZE lpSize) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetAspectRatioFilterEx(m_hDC, lpSize); |
- } |
- |
- BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABC lpabc) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetCharABCWidths(m_hDC, nFirstChar, nLastChar, lpabc); |
- } |
- |
- DWORD GetFontData(DWORD dwTable, DWORD dwOffset, LPVOID lpData, DWORD cbData) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetFontData(m_hDC, dwTable, dwOffset, lpData, cbData); |
- } |
- |
- int GetKerningPairs(int nPairs, LPKERNINGPAIR lpkrnpair) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetKerningPairs(m_hDC, nPairs, lpkrnpair); |
- } |
- |
- UINT GetOutlineTextMetrics(UINT cbData, LPOUTLINETEXTMETRIC lpotm) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetOutlineTextMetrics(m_hDC, cbData, lpotm); |
- } |
- |
- DWORD GetGlyphOutline(UINT nChar, UINT nFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lpBuffer, const MAT2* lpmat2) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetGlyphOutline(m_hDC, nChar, nFormat, lpgm, cbBuffer, lpBuffer, lpmat2); |
- } |
- |
- BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABCFLOAT lpABCF) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetCharABCWidthsFloat(m_hDC, nFirstChar, nLastChar, lpABCF); |
- } |
- |
- BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, float* lpFloatBuffer) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetCharWidthFloat(m_hDC, nFirstChar, nLastChar, lpFloatBuffer); |
- } |
-#endif // !_WIN32_WCE |
- |
-// Printer/Device Escape Functions |
-#ifndef _WIN32_WCE |
- int Escape(int nEscape, int nCount, LPCSTR lpszInData, LPVOID lpOutData) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::Escape(m_hDC, nEscape, nCount, lpszInData, lpOutData); |
- } |
-#endif // !_WIN32_WCE |
- |
- int Escape(int nEscape, int nInputSize, LPCSTR lpszInputData, |
- int nOutputSize, LPSTR lpszOutputData) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ExtEscape(m_hDC, nEscape, nInputSize, lpszInputData, nOutputSize, lpszOutputData); |
- } |
- |
-#ifndef _WIN32_WCE |
- int DrawEscape(int nEscape, int nInputSize, LPCSTR lpszInputData) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DrawEscape(m_hDC, nEscape, nInputSize, lpszInputData); |
- } |
-#endif // !_WIN32_WCE |
- |
- // Escape helpers |
-#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc)) |
- int StartDoc(LPCTSTR lpszDocName) // old Win3.0 version |
- { |
- DOCINFO di = { 0 }; |
- di.cbSize = sizeof(DOCINFO); |
- di.lpszDocName = lpszDocName; |
- return StartDoc(&di); |
- } |
- |
- int StartDoc(LPDOCINFO lpDocInfo) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::StartDoc(m_hDC, lpDocInfo); |
- } |
- |
- int StartPage() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::StartPage(m_hDC); |
- } |
- |
- int EndPage() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::EndPage(m_hDC); |
- } |
- |
- int SetAbortProc(BOOL (CALLBACK* lpfn)(HDC, int)) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetAbortProc(m_hDC, (ABORTPROC)lpfn); |
- } |
- |
- int AbortDoc() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::AbortDoc(m_hDC); |
- } |
- |
- int EndDoc() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::EndDoc(m_hDC); |
- } |
-#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc)) |
- |
-// MetaFile Functions |
-#ifndef _WIN32_WCE |
- BOOL PlayMetaFile(HMETAFILE hMF) |
- { |
- ATLASSERT(m_hDC != NULL); |
- if(::GetDeviceCaps(m_hDC, TECHNOLOGY) == DT_METAFILE) |
- { |
- // playing metafile in metafile, just use core windows API |
- return ::PlayMetaFile(m_hDC, hMF); |
- } |
- |
- // for special playback, lParam == pDC |
- return ::EnumMetaFile(m_hDC, hMF, EnumMetaFileProc, (LPARAM)this); |
- } |
- |
- BOOL PlayMetaFile(HENHMETAFILE hEnhMetaFile, LPCRECT lpBounds) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::PlayEnhMetaFile(m_hDC, hEnhMetaFile, lpBounds); |
- } |
- |
- BOOL AddMetaFileComment(UINT nDataSize, const BYTE* pCommentData) // can be used for enhanced metafiles only |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GdiComment(m_hDC, nDataSize, pCommentData); |
- } |
- |
- // Special handling for metafile playback |
- static int CALLBACK EnumMetaFileProc(HDC hDC, HANDLETABLE* pHandleTable, METARECORD* pMetaRec, int nHandles, LPARAM lParam) |
- { |
- CDCHandle* pDC = (CDCHandle*)lParam; |
- |
- switch (pMetaRec->rdFunction) |
- { |
- case META_SETMAPMODE: |
- pDC->SetMapMode((int)(short)pMetaRec->rdParm[0]); |
- break; |
- case META_SETWINDOWEXT: |
- pDC->SetWindowExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); |
- break; |
- case META_SETWINDOWORG: |
- pDC->SetWindowOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); |
- break; |
- case META_SETVIEWPORTEXT: |
- pDC->SetViewportExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); |
- break; |
- case META_SETVIEWPORTORG: |
- pDC->SetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); |
- break; |
- case META_SCALEWINDOWEXT: |
- pDC->ScaleWindowExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2], |
- (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); |
- break; |
- case META_SCALEVIEWPORTEXT: |
- pDC->ScaleViewportExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2], |
- (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); |
- break; |
- case META_OFFSETVIEWPORTORG: |
- pDC->OffsetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); |
- break; |
- case META_SAVEDC: |
- pDC->SaveDC(); |
- break; |
- case META_RESTOREDC: |
- pDC->RestoreDC((int)(short)pMetaRec->rdParm[0]); |
- break; |
- case META_SETBKCOLOR: |
- pDC->SetBkColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]); |
- break; |
- case META_SETTEXTCOLOR: |
- pDC->SetTextColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]); |
- break; |
- |
- // need to watch out for SelectObject(HFONT), for custom font mapping |
- case META_SELECTOBJECT: |
- { |
- HGDIOBJ hObject = pHandleTable->objectHandle[pMetaRec->rdParm[0]]; |
- UINT nObjType = ::GetObjectType(hObject); |
- if(nObjType == 0) |
- { |
- // object type is unknown, determine if it is a font |
- HFONT hStockFont = (HFONT)::GetStockObject(SYSTEM_FONT); |
- HFONT hFontOld = (HFONT)::SelectObject(pDC->m_hDC, hStockFont); |
- HGDIOBJ hObjOld = ::SelectObject(pDC->m_hDC, hObject); |
- if(hObjOld == hStockFont) |
- { |
- // got the stock object back, so must be selecting a font |
- pDC->SelectFont((HFONT)hObject); |
- break; // don't play the default record |
- } |
- else |
- { |
- // didn't get the stock object back, so restore everything |
- ::SelectObject(pDC->m_hDC, hFontOld); |
- ::SelectObject(pDC->m_hDC, hObjOld); |
- } |
- // and fall through to PlayMetaFileRecord... |
- } |
- else if(nObjType == OBJ_FONT) |
- { |
- // play back as CDCHandle::SelectFont(HFONT) |
- pDC->SelectFont((HFONT)hObject); |
- break; // don't play the default record |
- } |
- } |
- // fall through... |
- |
- default: |
- ::PlayMetaFileRecord(hDC, pHandleTable, pMetaRec, nHandles); |
- break; |
- } |
- |
- return 1; |
- } |
-#endif // !_WIN32_WCE |
- |
-// Path Functions |
-#ifndef _WIN32_WCE |
- BOOL AbortPath() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::AbortPath(m_hDC); |
- } |
- |
- BOOL BeginPath() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::BeginPath(m_hDC); |
- } |
- |
- BOOL CloseFigure() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::CloseFigure(m_hDC); |
- } |
- |
- BOOL EndPath() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::EndPath(m_hDC); |
- } |
- |
- BOOL FillPath() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::FillPath(m_hDC); |
- } |
- |
- BOOL FlattenPath() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::FlattenPath(m_hDC); |
- } |
- |
- BOOL StrokeAndFillPath() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::StrokeAndFillPath(m_hDC); |
- } |
- |
- BOOL StrokePath() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::StrokePath(m_hDC); |
- } |
- |
- BOOL WidenPath() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::WidenPath(m_hDC); |
- } |
- |
- BOOL GetMiterLimit(PFLOAT pfMiterLimit) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetMiterLimit(m_hDC, pfMiterLimit); |
- } |
- |
- BOOL SetMiterLimit(float fMiterLimit) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetMiterLimit(m_hDC, fMiterLimit, NULL); |
- } |
- |
- int GetPath(LPPOINT lpPoints, LPBYTE lpTypes, int nCount) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetPath(m_hDC, lpPoints, lpTypes, nCount); |
- } |
- |
- BOOL SelectClipPath(int nMode) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SelectClipPath(m_hDC, nMode); |
- } |
-#endif // !_WIN32_WCE |
- |
-// Misc Helper Functions |
- static CBrushHandle PASCAL GetHalftoneBrush() |
- { |
- HBRUSH halftoneBrush = NULL; |
- WORD grayPattern[8]; |
- for(int i = 0; i < 8; i++) |
- grayPattern[i] = (WORD)(0x5555 << (i & 1)); |
- HBITMAP grayBitmap = CreateBitmap(8, 8, 1, 1, &grayPattern); |
- if(grayBitmap != NULL) |
- { |
- halftoneBrush = ::CreatePatternBrush(grayBitmap); |
- DeleteObject(grayBitmap); |
- } |
- return CBrushHandle(halftoneBrush); |
- } |
- |
- void DrawDragRect(LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast, HBRUSH hBrush = NULL, HBRUSH hBrushLast = NULL) |
- { |
- // first, determine the update region and select it |
- CRgn rgnOutside; |
- rgnOutside.CreateRectRgnIndirect(lpRect); |
- RECT rect = *lpRect; |
- ::InflateRect(&rect, -size.cx, -size.cy); |
- ::IntersectRect(&rect, &rect, lpRect); |
- CRgn rgnInside; |
- rgnInside.CreateRectRgnIndirect(&rect); |
- CRgn rgnNew; |
- rgnNew.CreateRectRgn(0, 0, 0, 0); |
- rgnNew.CombineRgn(rgnOutside, rgnInside, RGN_XOR); |
- |
- HBRUSH hBrushOld = NULL; |
- CBrush brushHalftone; |
- if(hBrush == NULL) |
- brushHalftone = hBrush = CDCHandle::GetHalftoneBrush(); |
- if(hBrushLast == NULL) |
- hBrushLast = hBrush; |
- |
- CRgn rgnLast; |
- CRgn rgnUpdate; |
- if(lpRectLast != NULL) |
- { |
- // find difference between new region and old region |
- rgnLast.CreateRectRgn(0, 0, 0, 0); |
- rgnOutside.SetRectRgn(lpRectLast->left, lpRectLast->top, lpRectLast->right, lpRectLast->bottom); |
- rect = *lpRectLast; |
- ::InflateRect(&rect, -sizeLast.cx, -sizeLast.cy); |
- ::IntersectRect(&rect, &rect, lpRectLast); |
- rgnInside.SetRectRgn(rect.left, rect.top, rect.right, rect.bottom); |
- rgnLast.CombineRgn(rgnOutside, rgnInside, RGN_XOR); |
- |
- // only diff them if brushes are the same |
- if(hBrush == hBrushLast) |
- { |
- rgnUpdate.CreateRectRgn(0, 0, 0, 0); |
- rgnUpdate.CombineRgn(rgnLast, rgnNew, RGN_XOR); |
- } |
- } |
- if(hBrush != hBrushLast && lpRectLast != NULL) |
- { |
- // brushes are different -- erase old region first |
- SelectClipRgn(rgnLast); |
- GetClipBox(&rect); |
- hBrushOld = SelectBrush(hBrushLast); |
- PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT); |
- SelectBrush(hBrushOld); |
- hBrushOld = NULL; |
- } |
- |
- // draw into the update/new region |
- SelectClipRgn(rgnUpdate.IsNull() ? rgnNew : rgnUpdate); |
- GetClipBox(&rect); |
- hBrushOld = SelectBrush(hBrush); |
- PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT); |
- |
- // cleanup DC |
- if(hBrushOld != NULL) |
- SelectBrush(hBrushOld); |
- SelectClipRgn(NULL); |
- } |
- |
- void FillSolidRect(LPCRECT lpRect, COLORREF clr) |
- { |
- ATLASSERT(m_hDC != NULL); |
- |
- COLORREF clrOld = ::SetBkColor(m_hDC, clr); |
- ATLASSERT(clrOld != CLR_INVALID); |
- if(clrOld != CLR_INVALID) |
- { |
- ::ExtTextOut(m_hDC, 0, 0, ETO_OPAQUE, lpRect, NULL, 0, NULL); |
- ::SetBkColor(m_hDC, clrOld); |
- } |
- } |
- |
- void FillSolidRect(int x, int y, int cx, int cy, COLORREF clr) |
- { |
- ATLASSERT(m_hDC != NULL); |
- |
- RECT rect = { x, y, x + cx, y + cy }; |
- FillSolidRect(&rect, clr); |
- } |
- |
- void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight) |
- { |
- Draw3dRect(lpRect->left, lpRect->top, lpRect->right - lpRect->left, |
- lpRect->bottom - lpRect->top, clrTopLeft, clrBottomRight); |
- } |
- |
- void Draw3dRect(int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight) |
- { |
- FillSolidRect(x, y, cx - 1, 1, clrTopLeft); |
- FillSolidRect(x, y, 1, cy - 1, clrTopLeft); |
- FillSolidRect(x + cx, y, -1, cy, clrBottomRight); |
- FillSolidRect(x, y + cy, cx, -1, clrBottomRight); |
- } |
- |
-// DIB support |
-#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) |
- 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) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetDIBitsToDevice(m_hDC, x, y, dwWidth, dwHeight, xSrc, ySrc, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse); |
- } |
-#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) |
- |
-#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) |
- 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) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::StretchDIBits(m_hDC, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth, nSrcHeight, lpvBits, lpbmi, uColorUse, dwRop); |
- } |
- |
- UINT GetDIBColorTable(UINT uStartIndex, UINT cEntries, RGBQUAD* pColors) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors); |
- } |
- |
- UINT SetDIBColorTable(UINT uStartIndex, UINT cEntries, CONST RGBQUAD* pColors) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors); |
- } |
-#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) |
- |
-// OpenGL support |
-#if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) |
- int ChoosePixelFormat(CONST PIXELFORMATDESCRIPTOR* ppfd) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ChoosePixelFormat(m_hDC, ppfd); |
- } |
- |
- int DescribePixelFormat(int iPixelFormat, UINT nBytes, LPPIXELFORMATDESCRIPTOR ppfd) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::DescribePixelFormat(m_hDC, iPixelFormat, nBytes, ppfd); |
- } |
- |
- int GetPixelFormat() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetPixelFormat(m_hDC); |
- } |
- |
- BOOL SetPixelFormat(int iPixelFormat, CONST PIXELFORMATDESCRIPTOR* ppfd) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetPixelFormat(m_hDC, iPixelFormat, ppfd); |
- } |
- |
- BOOL SwapBuffers() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SwapBuffers(m_hDC); |
- } |
- |
- HGLRC wglCreateContext() |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglCreateContext(m_hDC); |
- } |
- |
- HGLRC wglCreateLayerContext(int iLayerPlane) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglCreateLayerContext(m_hDC, iLayerPlane); |
- } |
- |
- BOOL wglMakeCurrent(HGLRC hglrc) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglMakeCurrent(m_hDC, hglrc); |
- } |
- |
- BOOL wglUseFontBitmaps(DWORD dwFirst, DWORD dwCount, DWORD listBase) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglUseFontBitmaps(m_hDC, dwFirst, dwCount, listBase); |
- } |
- |
- BOOL wglUseFontOutlines(DWORD dwFirst, DWORD dwCount, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglUseFontOutlines(m_hDC, dwFirst, dwCount, listBase, deviation, extrusion, format, lpgmf); |
- } |
- |
- BOOL wglDescribeLayerPlane(int iPixelFormat, int iLayerPlane, UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglDescribeLayerPlane(m_hDC, iPixelFormat, iLayerPlane, nBytes, plpd); |
- } |
- |
- int wglSetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, CONST COLORREF* pclr) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglSetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr); |
- } |
- |
- int wglGetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, COLORREF* pclr) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglGetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr); |
- } |
- |
- BOOL wglRealizeLayerPalette(int iLayerPlane, BOOL bRealize) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglRealizeLayerPalette(m_hDC, iLayerPlane, bRealize); |
- } |
- |
- BOOL wglSwapLayerBuffers(UINT uPlanes) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::wglSwapLayerBuffers(m_hDC, uPlanes); |
- } |
-#endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) |
- |
-// New for Windows 2000 only |
-#if (_WIN32_WINNT >= 0x0500) |
- COLORREF GetDCPenColor() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetDCPenColor(m_hDC); |
- } |
- |
- COLORREF SetDCPenColor(COLORREF clr) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetDCPenColor(m_hDC, clr); |
- } |
- |
- COLORREF GetDCBrushColor() const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetDCBrushColor(m_hDC); |
- } |
- |
- COLORREF SetDCBrushColor(COLORREF clr) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::SetDCBrushColor(m_hDC, clr); |
- } |
- |
-#ifndef _WIN32_WCE |
- DWORD GetFontUnicodeRanges(LPGLYPHSET lpgs) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetFontUnicodeRanges(m_hDC, lpgs); |
- } |
-#endif // !_WIN32_WCE |
- |
- DWORD GetGlyphIndices(LPCTSTR lpstr, int cch, LPWORD pgi, DWORD dwFlags) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetGlyphIndices(m_hDC, lpstr, cch, pgi, dwFlags); |
- } |
- |
- BOOL GetTextExtentPointI(LPWORD pgiIn, int cgi, LPSIZE lpSize) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetTextExtentPointI(m_hDC, pgiIn, cgi, lpSize); |
- } |
- |
- BOOL GetTextExtentExPointI(LPWORD pgiIn, int cgi, int nMaxExtent, LPINT lpnFit, LPINT alpDx, LPSIZE lpSize) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetTextExtentExPointI(m_hDC, pgiIn, cgi, nMaxExtent, lpnFit, alpDx, lpSize); |
- } |
- |
- BOOL GetCharWidthI(UINT giFirst, UINT cgi, LPWORD pgi, LPINT lpBuffer) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetCharWidthI(m_hDC, giFirst, cgi, pgi, lpBuffer); |
- } |
- |
- BOOL GetCharABCWidthsI(UINT giFirst, UINT cgi, LPWORD pgi, LPABC lpabc) const |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::GetCharABCWidthsI(m_hDC, giFirst, cgi, pgi, lpabc); |
- } |
-#endif // (_WIN32_WINNT >= 0x0500) |
- |
-// New for Windows 2000 and Windows 98 |
-#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) |
- BOOL ColorCorrectPalette(HPALETTE hPalette, DWORD dwFirstEntry, DWORD dwNumOfEntries) |
- { |
- ATLASSERT(m_hDC != NULL); |
- return ::ColorCorrectPalette(m_hDC, hPalette, dwFirstEntry, dwNumOfEntries); |
- } |
-#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) |
-}; |
- |
-typedef CDCT<false> CDCHandle; |
-typedef CDCT<true> CDC; |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// CDC Helpers |
- |
-class CPaintDC : public CDC |
-{ |
-public: |
-// Data members |
- HWND m_hWnd; |
- PAINTSTRUCT m_ps; |
- |
-// Constructor/destructor |
- CPaintDC(HWND hWnd) |
- { |
- ATLASSERT(::IsWindow(hWnd)); |
- m_hWnd = hWnd; |
- m_hDC = ::BeginPaint(hWnd, &m_ps); |
- } |
- |
- ~CPaintDC() |
- { |
- ATLASSERT(m_hDC != NULL); |
- ATLASSERT(::IsWindow(m_hWnd)); |
- ::EndPaint(m_hWnd, &m_ps); |
- Detach(); |
- } |
-}; |
- |
-class CClientDC : public CDC |
-{ |
-public: |
-// Data members |
- HWND m_hWnd; |
- |
-// Constructor/destructor |
- CClientDC(HWND hWnd) |
- { |
- ATLASSERT(hWnd == NULL || ::IsWindow(hWnd)); |
- m_hWnd = hWnd; |
- m_hDC = ::GetDC(hWnd); |
- } |
- |
- ~CClientDC() |
- { |
- ATLASSERT(m_hDC != NULL); |
- ::ReleaseDC(m_hWnd, Detach()); |
- } |
-}; |
- |
-class CWindowDC : public CDC |
-{ |
-public: |
-// Data members |
- HWND m_hWnd; |
- |
-// Constructor/destructor |
- CWindowDC(HWND hWnd) |
- { |
- ATLASSERT(hWnd == NULL || ::IsWindow(hWnd)); |
- m_hWnd = hWnd; |
- m_hDC = ::GetWindowDC(hWnd); |
- } |
- |
- ~CWindowDC() |
- { |
- ATLASSERT(m_hDC != NULL); |
- ::ReleaseDC(m_hWnd, Detach()); |
- } |
-}; |
- |
-class CMemoryDC : public CDC |
-{ |
-public: |
-// Data members |
- HDC m_hDCOriginal; |
- RECT m_rcPaint; |
- CBitmap m_bmp; |
- HBITMAP m_hBmpOld; |
- |
-// Constructor/destructor |
- CMemoryDC(HDC hDC, RECT& rcPaint) : m_hDCOriginal(hDC), m_hBmpOld(NULL) |
- { |
- m_rcPaint = rcPaint; |
- CreateCompatibleDC(m_hDCOriginal); |
- ATLASSERT(m_hDC != NULL); |
- m_bmp.CreateCompatibleBitmap(m_hDCOriginal, m_rcPaint.right - m_rcPaint.left, m_rcPaint.bottom - m_rcPaint.top); |
- ATLASSERT(m_bmp.m_hBitmap != NULL); |
- m_hBmpOld = SelectBitmap(m_bmp); |
- SetViewportOrg(-m_rcPaint.left, -m_rcPaint.top); |
- } |
- |
- ~CMemoryDC() |
- { |
- ::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); |
- SelectBitmap(m_hBmpOld); |
- } |
-}; |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// Enhanced metafile support |
- |
-#ifndef _WIN32_WCE |
- |
-class CEnhMetaFileInfo |
-{ |
-public: |
-// Data members |
- HENHMETAFILE m_hEMF; |
- BYTE* m_pBits; |
- TCHAR* m_pDesc; |
- ENHMETAHEADER m_header; |
- PIXELFORMATDESCRIPTOR m_pfd; |
- |
-// Constructor/destructor |
- CEnhMetaFileInfo(HENHMETAFILE hEMF) : m_pBits(NULL), m_pDesc(NULL), m_hEMF(hEMF) |
- { } |
- |
- ~CEnhMetaFileInfo() |
- { |
- delete [] m_pBits; |
- delete [] m_pDesc; |
- } |
- |
-// Operations |
- BYTE* GetEnhMetaFileBits() |
- { |
- ATLASSERT(m_hEMF != NULL); |
- UINT nBytes = ::GetEnhMetaFileBits(m_hEMF, 0, NULL); |
- delete [] m_pBits; |
- m_pBits = NULL; |
- ATLTRY(m_pBits = new BYTE[nBytes]); |
- if (m_pBits != NULL) |
- ::GetEnhMetaFileBits(m_hEMF, nBytes, m_pBits); |
- return m_pBits; |
- } |
- |
- LPTSTR GetEnhMetaFileDescription() |
- { |
- ATLASSERT(m_hEMF != NULL); |
- UINT nLen = ::GetEnhMetaFileDescription(m_hEMF, 0, NULL); |
- delete [] m_pDesc; |
- m_pDesc = NULL; |
- ATLTRY(m_pDesc = new TCHAR[nLen]); |
- if (m_pDesc != NULL) |
- nLen = ::GetEnhMetaFileDescription(m_hEMF, nLen, m_pDesc); |
- return m_pDesc; |
- } |
- |
- ENHMETAHEADER* GetEnhMetaFileHeader() |
- { |
- ATLASSERT(m_hEMF != NULL); |
- memset(&m_header, 0, sizeof(m_header)); |
- m_header.iType = EMR_HEADER; |
- m_header.nSize = sizeof(ENHMETAHEADER); |
- UINT n = ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), &m_header); |
- return (n != 0) ? &m_header : NULL; |
- } |
- |
- PIXELFORMATDESCRIPTOR* GetEnhMetaFilePixelFormat() |
- { |
- ATLASSERT(m_hEMF != NULL); |
- memset(&m_pfd, 0, sizeof(m_pfd)); |
- UINT n = ::GetEnhMetaFilePixelFormat(m_hEMF, sizeof(m_pfd), &m_pfd); |
- return (n != 0) ? &m_pfd : NULL; |
- } |
-}; |
- |
- |
-template <bool t_bManaged> |
-class CEnhMetaFileT |
-{ |
-public: |
-// Data members |
- HENHMETAFILE m_hEMF; |
- |
-// Constructor/destructor |
- CEnhMetaFileT(HENHMETAFILE hEMF = NULL) : m_hEMF(hEMF) |
- { |
- } |
- |
- ~CEnhMetaFileT() |
- { |
- if(t_bManaged && m_hEMF != NULL) |
- DeleteObject(); |
- } |
- |
-// Operations |
- CEnhMetaFileT<t_bManaged>& operator =(HENHMETAFILE hEMF) |
- { |
- Attach(hEMF); |
- return *this; |
- } |
- |
- void Attach(HENHMETAFILE hEMF) |
- { |
- if(t_bManaged && m_hEMF != NULL && m_hEMF != hEMF) |
- DeleteObject(); |
- m_hEMF = hEMF; |
- } |
- |
- HENHMETAFILE Detach() |
- { |
- HENHMETAFILE hEMF = m_hEMF; |
- m_hEMF = NULL; |
- return hEMF; |
- } |
- |
- operator HENHMETAFILE() const { return m_hEMF; } |
- |
- bool IsNull() const { return (m_hEMF == NULL); } |
- |
- BOOL DeleteObject() |
- { |
- ATLASSERT(m_hEMF != NULL); |
- BOOL bRet = ::DeleteEnhMetaFile(m_hEMF); |
- m_hEMF = NULL; |
- return bRet; |
- } |
- |
- UINT GetEnhMetaFileBits(UINT cbBuffer, LPBYTE lpbBuffer) const |
- { |
- ATLASSERT(m_hEMF != NULL); |
- return ::GetEnhMetaFileBits(m_hEMF, cbBuffer, lpbBuffer); |
- } |
- |
- UINT GetEnhMetaFileDescription(UINT cchBuffer, LPTSTR lpszDescription) const |
- { |
- ATLASSERT(m_hEMF != NULL); |
- return ::GetEnhMetaFileDescription(m_hEMF, cchBuffer, lpszDescription); |
- } |
- |
- UINT GetEnhMetaFileHeader(LPENHMETAHEADER lpemh) const |
- { |
- ATLASSERT(m_hEMF != NULL); |
- lpemh->iType = EMR_HEADER; |
- lpemh->nSize = sizeof(ENHMETAHEADER); |
- return ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), lpemh); |
- } |
- |
- UINT GetEnhMetaFilePaletteEntries(UINT cEntries, LPPALETTEENTRY lppe) const |
- { |
- ATLASSERT(m_hEMF != NULL); |
- return ::GetEnhMetaFilePaletteEntries(m_hEMF, cEntries, lppe); |
- } |
- |
- UINT GetEnhMetaFilePixelFormat(DWORD cbBuffer, PIXELFORMATDESCRIPTOR* ppfd) const |
- { |
- ATLASSERT(m_hEMF != NULL); |
- return ::GetEnhMetaFilePixelFormat(m_hEMF, cbBuffer, ppfd); |
- } |
-}; |
- |
-typedef CEnhMetaFileT<false> CEnhMetaFileHandle; |
-typedef CEnhMetaFileT<true> CEnhMetaFile; |
- |
- |
-class CEnhMetaFileDC : public CDC |
-{ |
-public: |
-// Constructor/destructor |
- CEnhMetaFileDC() |
- { |
- } |
- |
- CEnhMetaFileDC(HDC hdc, LPCRECT lpRect) |
- { |
- Create(hdc, NULL, lpRect, NULL); |
- ATLASSERT(m_hDC != NULL); |
- } |
- |
- CEnhMetaFileDC(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription) |
- { |
- Create(hdcRef, lpFilename, lpRect, lpDescription); |
- ATLASSERT(m_hDC != NULL); |
- } |
- |
- ~CEnhMetaFileDC() |
- { |
- HENHMETAFILE hEMF = Close(); |
- if (hEMF != NULL) |
- ::DeleteEnhMetaFile(hEMF); |
- } |
- |
-// Operations |
- void Create(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription) |
- { |
- ATLASSERT(m_hDC == NULL); |
- m_hDC = ::CreateEnhMetaFile(hdcRef, lpFilename, lpRect, lpDescription); |
- } |
- |
- HENHMETAFILE Close() |
- { |
- HENHMETAFILE hEMF = NULL; |
- if (m_hDC != NULL) |
- { |
- hEMF = ::CloseEnhMetaFile(m_hDC); |
- m_hDC = NULL; |
- } |
- return hEMF; |
- } |
-}; |
- |
-#endif // !_WIN32_WCE |
- |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-// WinCE compatible clipboard CF_DIB format support functions |
- |
-#ifndef _WTL_NO_DIB16 |
- |
-#define DIBINFO16_BITFIELDS { 31744, 992, 31 } |
- |
-// DIBINFO16 - To avoid color table problems in WinCE we only create this type of Dib |
-struct DIBINFO16 // a BITMAPINFO with 2 additional color bitfields |
-{ |
- BITMAPINFOHEADER bmiHeader; |
- RGBQUAD bmiColors[3]; |
- |
- DIBINFO16(SIZE size) |
- { |
- BITMAPINFOHEADER bmih = { sizeof(BITMAPINFOHEADER), size.cx, size.cy, |
- 1, 16, BI_BITFIELDS, 2 * size.cx * size.cy , 0, 0, 3 }; |
- DWORD dw[3] = DIBINFO16_BITFIELDS ; |
- |
- bmiHeader = bmih; |
- memcpy(bmiColors, dw, 3 * sizeof(DWORD)); |
- } |
-}; |
- |
- |
-// AtlxxxDibxxx minimal packed DIB implementation and helpers to copy and paste CF_DIB |
- |
-inline bool AtlIsDib16(LPBITMAPINFOHEADER pbmih) |
-{ |
- return (pbmih->biBitCount == 16) && (pbmih->biCompression == BI_BITFIELDS); |
-} |
- |
-inline int AtlGetDibColorTableSize(LPBITMAPINFOHEADER pbmih) |
-{ |
- switch (pbmih->biBitCount) |
- { |
- case 2: |
- case 4: |
- case 8: |
- return pbmih->biClrUsed ? pbmih->biClrUsed : 1 << pbmih->biBitCount; |
- case 24: |
- break; |
- case 16: |
- case 32: |
- return pbmih->biCompression == BI_BITFIELDS ? 3 : 0; |
- default: |
- ATLASSERT(FALSE); // should never come here |
- } |
- |
- return 0; |
-} |
- |
-inline int AtlGetDibNumColors(LPBITMAPINFOHEADER pbmih) |
-{ |
- switch (pbmih->biBitCount) |
- { |
- case 2: |
- case 4: |
- case 8: |
- if (pbmih->biClrUsed) |
- return pbmih->biClrUsed; |
- else |
- break; |
- case 16: |
- if (pbmih->biCompression == BI_BITFIELDS ) |
- return 1 << 15; |
- else |
- break; |
- case 24: |
- break; |
- case 32: |
- if (pbmih->biCompression == BI_BITFIELDS ) |
- return 1 << 24; |
- else |
- break; |
- default: |
- ATLASSERT(FALSE); |
- } |
- |
- return 1 << pbmih->biBitCount; |
-} |
- |
-inline HBITMAP AtlGetDibBitmap(LPBITMAPINFO pbmi) |
-{ |
- HBITMAP hbm = NULL; |
- CDC dc(NULL); |
- void * pBits = NULL; |
- |
- LPBYTE pDibBits = (LPBYTE)pbmi + sizeof(BITMAPINFOHEADER) + AtlGetDibColorTableSize(&pbmi->bmiHeader) * sizeof(RGBQUAD); |
- if (hbm = CreateDIBSection(dc, pbmi, DIB_RGB_COLORS, &pBits, NULL, NULL)) |
- memcpy(pBits, pDibBits, pbmi->bmiHeader.biSizeImage); |
- |
- return hbm; |
-} |
- |
-inline HBITMAP AtlCopyBitmap(HBITMAP hbm , SIZE sizeDst, bool bAsBitmap = false) |
-{ |
- CDC hdcSrc = CreateCompatibleDC(NULL); |
- CDC hdcDst = CreateCompatibleDC(NULL); |
- |
- CBitmapHandle hbmOld = NULL, hbmOld2 = NULL, bmSrc = hbm; |
- |
- CBitmap bmNew = NULL; |
- |
- SIZE sizeSrc = { 0 }; |
- bmSrc.GetSize(sizeSrc); |
- |
- hbmOld = hdcSrc.SelectBitmap(bmSrc); |
- |
- if (bAsBitmap) |
- { |
- bmNew.CreateCompatibleBitmap(hdcSrc, sizeDst.cx, sizeDst.cy); |
- } |
- else |
- { |
- DIBINFO16 dib16(sizeDst); |
- LPVOID pBits = NULL; |
- bmNew = CreateDIBSection(hdcDst, (const BITMAPINFO*)&dib16, DIB_RGB_COLORS, &pBits, NULL, NULL); |
- } |
- |
- ATLASSERT(!bmNew.IsNull()); |
- |
- hbmOld2 = hdcDst.SelectBitmap(bmNew); |
- BOOL bOK = FALSE; |
- |
- if ((sizeDst.cx == sizeSrc.cx) && (sizeDst.cy == sizeSrc.cy)) |
- bOK = hdcDst.BitBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, SRCCOPY); |
- else |
- bOK = hdcDst.StretchBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, sizeSrc.cx, sizeSrc.cy, SRCCOPY); |
- |
- hdcSrc.SelectBitmap(hbmOld); |
- hdcDst.SelectBitmap(hbmOld2); |
- |
- if (bOK == FALSE) |
- bmNew.DeleteObject(); |
- |
- return bmNew.Detach(); |
-} |
- |
-inline HLOCAL AtlCreatePackedDib16(HBITMAP hbm, SIZE size) |
-{ |
- DIBSECTION ds = { 0 }; |
- LPBYTE pDib = NULL; |
- bool bCopied = false; |
- |
- bool bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds); |
- if ((bOK == FALSE) || (ds.dsBm.bmBits == NULL) || (AtlIsDib16(&ds.dsBmih) == FALSE) || |
- (ds.dsBmih.biWidth != size.cx ) || (ds.dsBmih.biHeight != size.cy )) |
- { |
- if ((hbm = AtlCopyBitmap(hbm, size)) != NULL) |
- { |
- bCopied = true; |
- bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds); |
- } |
- else |
- { |
- bOK = FALSE; |
- } |
- } |
- |
- if((bOK == TRUE) && (AtlIsDib16(&ds.dsBmih) == TRUE) && (ds.dsBm.bmBits != NULL)) |
- { |
- pDib = (LPBYTE)LocalAlloc(LMEM_ZEROINIT, sizeof(DIBINFO16) + ds.dsBmih.biSizeImage); |
- if (pDib != NULL) |
- { |
- memcpy(pDib , &ds.dsBmih, sizeof(DIBINFO16)); |
- memcpy(pDib + sizeof(DIBINFO16), ds.dsBm.bmBits, ds.dsBmih.biSizeImage); |
- } |
- } |
- |
- if (bCopied == true) |
- DeleteObject(hbm); |
- |
- return (HLOCAL)pDib; |
-} |
- |
-inline bool AtlSetClipboardDib16(HBITMAP hbm, SIZE size, HWND hWnd) |
-{ |
- ATLASSERT(::IsWindow(hWnd)); |
- BOOL bOK = OpenClipboard(hWnd); |
- if (bOK == TRUE) |
- { |
- if ((bOK = EmptyClipboard()) == TRUE) |
- { |
- HLOCAL hDib = AtlCreatePackedDib16(hbm, size); |
- if (hDib != NULL) |
- { |
- bOK = SetClipboardData(CF_DIB, hDib) != NULL; |
- if (bOK == FALSE) |
- LocalFree(hDib); |
- } |
- else |
- { |
- bOK = FALSE; |
- } |
- } |
- CloseClipboard(); |
- } |
- |
- return bOK == TRUE; |
-} |
- |
-inline HBITMAP AtlGetClipboardDib(HWND hWnd) |
-{ |
- ATLASSERT(::IsWindow(hWnd) == TRUE); |
- HBITMAP hbm = NULL; |
- if (OpenClipboard(hWnd) == TRUE) |
- { |
- LPBITMAPINFO pbmi = (LPBITMAPINFO)GetClipboardData(CF_DIB); |
- if (pbmi != NULL) |
- hbm = AtlGetDibBitmap(pbmi); |
- CloseClipboard(); |
- } |
- |
- return hbm; |
-} |
- |
-#endif // _WTL_NO_DIB16 |
- |
-}; // namespace WTL |
- |
-#endif // __ATLGDI_H__ |