ExtMemoryDC.h
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:7k
源码类别:

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #if (!defined __EXT_MEMORY_DC_H)
  22. #define __EXT_MEMORY_DC_H
  23. //
  24. // The enhanced version of Keith Rule's memory DC class
  25. //
  26. #if (!defined __EXT_MFC_DEF_H)
  27. #include <ExtMfcDef.h>
  28. #endif // __EXT_MFC_DEF_H
  29. class __PROF_UIS_API CExtMemoryDC : public CDC 
  30. {
  31. protected:
  32. CBitmap m_bitmapSuface, * m_pBitmapPrevSurface;
  33. CDC * m_pExternalDC;
  34. CRect m_rc;
  35. bool m_bMemoryMode:1;
  36. COLORREF * m_pHelperDibSurface;
  37. public:
  38. enum eOptFlags
  39. {
  40. MDCOPT_TO_MEMORY = 0x0001L,
  41. MDCOPT_FILL_SURFACE = 0x0002L,
  42. MDCOPT_FORCE_BLACK = 0x0004L,
  43. MDCOPT_FORCE_DIB = 0x0008L,
  44. MDCOPT_NO_COPY_OPT = 0x0010L,
  45. MDCOPT_FILL_BITS = 0x0020L,
  46. MDCOPT_RTL_COMPATIBILITY = 0, // MDCOPT_NO_COPY_OPT
  47. MDCOPT_DIB_NEGATIVE_WIDTH = 0x0040L,
  48. MDCOPT_DIB_NEGATIVE_HEIGHT = 0x0080L,
  49. MDCOPT_DESKTOP_COMPATIBILITY = 0x0100L,
  50. MDCOPT_DEFAULT = MDCOPT_TO_MEMORY|MDCOPT_FILL_SURFACE|MDCOPT_RTL_COMPATIBILITY
  51. }; // enum eOptFlags
  52. void __InitMemoryDC( CDC * pDC, const RECT * pRect = NULL, DWORD dwOptFlags = MDCOPT_DEFAULT )
  53. {
  54. ASSERT( m_pExternalDC == NULL ); 
  55. ASSERT( pDC != NULL ); 
  56. ASSERT( pDC->GetSafeHdc() != NULL ); 
  57. m_pExternalDC = pDC;
  58. m_pBitmapPrevSurface = NULL;
  59. if( ( dwOptFlags & MDCOPT_TO_MEMORY ) != 0 )
  60. {
  61. if( ( dwOptFlags & MDCOPT_DESKTOP_COMPATIBILITY ) != 0 )
  62. m_bMemoryMode = true;
  63. else
  64. m_bMemoryMode = pDC->IsPrinting() ? false : true;
  65. }
  66. else
  67. m_bMemoryMode = false;
  68. if( pRect == NULL )
  69. pDC->GetClipBox( &m_rc );
  70. else 
  71. m_rc = *pRect;
  72. if( m_bMemoryMode ) 
  73. {
  74. if( ( dwOptFlags & MDCOPT_DESKTOP_COMPATIBILITY ) != 0 )
  75. CreateCompatibleDC( NULL );
  76. else
  77. CreateCompatibleDC( pDC );
  78. if( GetSafeHdc() == NULL )
  79. return;
  80. DWORD dwLayout = pDC->GetLayout();
  81. if( dwLayout == GDI_ERROR )
  82. dwLayout = LAYOUT_LTR;
  83. if( (dwOptFlags & MDCOPT_NO_COPY_OPT) == 0 )
  84. {
  85. SetLayout( dwLayout );
  86. if( (dwLayout&LAYOUT_RTL) != 0 )
  87. __EXT_MFC_SwapLeftRight( m_rc );
  88. pDC->LPtoDP( &m_rc );
  89. }
  90. if( dwOptFlags & MDCOPT_FORCE_BLACK )
  91. m_bitmapSuface.CreateBitmap( m_rc.Width(), m_rc.Height(), 1, 1, NULL );
  92. else if( dwOptFlags & MDCOPT_FORCE_DIB )
  93. {
  94. BITMAPINFOHEADER bih;
  95. ::memset( LPVOID(&bih), 0, sizeof(BITMAPINFOHEADER) );
  96. bih.biSize = sizeof(BITMAPINFOHEADER);
  97. bih.biWidth = ( ( dwOptFlags & MDCOPT_DIB_NEGATIVE_WIDTH ) != 0 ) ? (-m_rc.Width()) : m_rc.Width();
  98. bih.biHeight = ( ( dwOptFlags & MDCOPT_DIB_NEGATIVE_HEIGHT ) != 0 ) ? (-m_rc.Height()) : m_rc.Height();
  99. bih.biPlanes = 1;
  100. bih.biBitCount = 32;
  101. bih.biCompression = BI_RGB;
  102. bih.biSizeImage = m_rc.Width() * m_rc.Height();
  103. ASSERT( m_pHelperDibSurface == NULL );
  104. HBITMAP hDIB = ::CreateDIBSection( pDC->GetSafeHdc(), (LPBITMAPINFO)&bih, DIB_RGB_COLORS, (void **)&m_pHelperDibSurface, NULL, NULL );
  105. if( hDIB == NULL || m_pHelperDibSurface == NULL )
  106. {
  107. ASSERT( FALSE );
  108. return;
  109. }
  110. m_bitmapSuface.Attach( hDIB );
  111. }
  112. else
  113. m_bitmapSuface.CreateCompatibleBitmap( pDC, m_rc.Width(), m_rc.Height() );
  114. m_pBitmapPrevSurface = SelectObject( &m_bitmapSuface );
  115. if( (dwOptFlags & MDCOPT_NO_COPY_OPT) == 0 )
  116. {
  117. SetMapMode( pDC->GetMapMode() );
  118. if( ( dwLayout & LAYOUT_RTL ) != 0 )
  119. __EXT_MFC_SwapLeftRight( m_rc );
  120. pDC->DPtoLP( &m_rc );
  121. SetWindowOrg( m_rc.left, m_rc.top );
  122. }
  123. else 
  124. {
  125. if( pDC->IsPrinting() )
  126. m_bPrinting = pDC->m_bPrinting;
  127. m_hDC       = pDC->m_hDC;
  128. m_hAttribDC = pDC->m_hAttribDC;
  129. }
  130. if( ( dwOptFlags & MDCOPT_FILL_BITS ) != 0 )
  131. BitBlt( m_rc.left, m_rc.top, m_rc.Width(), m_rc.Height(), pDC, m_rc.left, m_rc.top, SRCCOPY );
  132. else if( ( dwOptFlags & MDCOPT_FILL_SURFACE ) != 0 )
  133. FillSolidRect( m_rc, pDC->GetBkColor() );
  134. }
  135. void __Flush( BOOL bMoveImage = TRUE )
  136. {
  137. if( m_pExternalDC == NULL )
  138. return;
  139. if( m_bMemoryMode ) 
  140. {
  141. if( bMoveImage )
  142. m_pExternalDC->BitBlt( m_rc.left, m_rc.top, m_rc.Width(), m_rc.Height(), this, m_rc.left, m_rc.top, SRCCOPY );
  143. SelectObject( m_pBitmapPrevSurface );
  144. else 
  145. m_hDC = m_hAttribDC = NULL;
  146. m_pExternalDC = NULL;
  147. m_pBitmapPrevSurface = NULL;
  148. m_rc.SetRectEmpty();
  149. m_bMemoryMode = false;
  150. m_pHelperDibSurface = NULL;
  151. }
  152. CExtMemoryDC( CDC * pDC = NULL, const RECT * pRect = NULL, DWORD dwOptFlags = MDCOPT_DEFAULT )
  153. : m_bMemoryMode( false )
  154. , m_pBitmapPrevSurface( NULL )
  155. , m_pExternalDC( NULL )
  156. , m_rc( 0, 0, 0, 0 )
  157. , m_pHelperDibSurface( NULL )
  158. {
  159. if( pDC != NULL && pDC->GetSafeHdc() != NULL )
  160. __InitMemoryDC( pDC, pRect, dwOptFlags );
  161. }
  162. CExtMemoryDC( CDC & dc, const RECT * pRect = NULL, DWORD dwOptFlags = MDCOPT_DEFAULT )
  163. : m_bMemoryMode( false )
  164. , m_pBitmapPrevSurface( NULL )
  165. , m_pExternalDC( NULL )
  166. , m_rc( 0, 0, 0, 0 )
  167. , m_pHelperDibSurface( NULL )
  168. {
  169. if( dc.GetSafeHdc() != NULL )
  170. __InitMemoryDC( &dc, pRect, dwOptFlags );
  171. }
  172. CExtMemoryDC( CDC & dc, const RECT & aRect, DWORD dwOptFlags = MDCOPT_DEFAULT )
  173. : m_bMemoryMode( false )
  174. , m_pBitmapPrevSurface( NULL )
  175. , m_pExternalDC( NULL )
  176. , m_rc( 0, 0, 0, 0 )
  177. , m_pHelperDibSurface( NULL )
  178. {
  179. if( dc.GetSafeHdc() != NULL )
  180. __InitMemoryDC( &dc, &aRect, dwOptFlags );
  181. }
  182. virtual ~CExtMemoryDC() { __Flush(); }
  183. CRect & __GetDrawRect() { return m_rc; }
  184. const CRect & __GetDrawRect() const { return m_rc; }
  185. BOOL __IsMemDC() const { return m_bMemoryMode ? TRUE : FALSE; }
  186. CExtMemoryDC * operator -> ()  { return this; }
  187. operator CExtMemoryDC * () { return this; }
  188. COLORREF * GetDibSurface() { ASSERT( m_pHelperDibSurface != NULL ); return m_pHelperDibSurface; }
  189. const COLORREF * GetDibSurface() const { ASSERT( m_pHelperDibSurface != NULL ); return m_pHelperDibSurface; }
  190. }; /// class CExtMemoryDC
  191. #endif // !defined(__EXT_MEMORY_DC_H)