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