memdc.h
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:3k
源码类别:

CA认证

开发平台:

Visual C++

  1. #ifndef _MEMDC_H_
  2. #define _MEMDC_H_
  3. //////////////////////////////////////////////////
  4. // CMemDC - memory DC
  5. //
  6. // Author: Keith Rule
  7. // Email:  keithr@europa.com
  8. // Copyright 1996-2002, Keith Rule
  9. //
  10. // You may freely use or modify this code provided this
  11. // Copyright is included in all derived versions.
  12. //
  13. // History - 10/3/97 Fixed scrolling bug.
  14. //                   Added print support. - KR
  15. //
  16. //           11/3/99 Fixed most common complaint. Added
  17. //                   background color fill. - KR
  18. //
  19. //           11/3/99 Added support for mapping modes other than
  20. //                   MM_TEXT as suggested by Lee Sang Hun. - KR
  21. //
  22. //           02/11/02 Added support for CScrollView as supplied
  23. //                    by Gary Kirkham. - KR
  24. //
  25. // This class implements a memory Device Context which allows
  26. // flicker free drawing.
  27. //
  28. //
  29. // I made a few changes to support transparency effect 
  30. //
  31. // Line 44 : Added bBg parameter.
  32. // Line 83 ~ 87 : If bBg is TRUE, copy background.
  33. //
  34. class CMemDC : public CDC {
  35. private:
  36. CBitmap m_bitmap; // Offscreen bitmap
  37. CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
  38. CDC* m_pDC; // Saves CDC passed in constructor
  39. CRect m_rect; // Rectangle of drawing area.
  40. BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
  41. public:
  42. CMemDC(CDC* pDC, const CRect* pRect = NULL, BOOL bBg = FALSE) : CDC()
  43. {
  44. ASSERT(pDC != NULL); 
  45. // Some initialization
  46. m_pDC = pDC;
  47. m_oldBitmap = NULL;
  48. m_bMemDC = !pDC->IsPrinting();
  49. // Get the rectangle to draw
  50. if (pRect == NULL) {
  51. pDC->GetClipBox(&m_rect);
  52. } else {
  53. m_rect = *pRect;
  54. }
  55. if (m_bMemDC) {
  56. // Create a Memory DC
  57. CreateCompatibleDC(pDC);
  58. pDC->LPtoDP(&m_rect);
  59. m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  60. m_oldBitmap = SelectObject(&m_bitmap);
  61. SetMapMode(pDC->GetMapMode());
  62. SetWindowExt(pDC->GetWindowExt());
  63. SetViewportExt(pDC->GetViewportExt());
  64. pDC->DPtoLP(&m_rect);
  65. SetWindowOrg(m_rect.left, m_rect.top);
  66. } else {
  67. // Make a copy of the relevent parts of the current DC for printing
  68. m_bPrinting = pDC->m_bPrinting;
  69. m_hDC       = pDC->m_hDC;
  70. m_hAttribDC = pDC->m_hAttribDC;
  71. }
  72. // Fill background 
  73. if( bBg )
  74. BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  75. m_pDC, m_rect.left, m_rect.top, SRCCOPY);
  76. else
  77. FillSolidRect(m_rect, pDC->GetBkColor());
  78. }
  79. ~CMemDC()
  80. {
  81. if (m_bMemDC) {
  82. // Copy the offscreen bitmap onto the screen.
  83. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  84. this, m_rect.left, m_rect.top, SRCCOPY);
  85. //Swap back the original bitmap.
  86. SelectObject(m_oldBitmap);
  87. } else {
  88. // All we need to do is replace the DC with an illegal value,
  89. // this keeps us from accidently deleting the handles associated with
  90. // the CDC that was passed to the constructor.
  91. m_hDC = m_hAttribDC = NULL;
  92. }
  93. }
  94. // Allow usage as a pointer
  95. CMemDC* operator->() 
  96. {
  97. return this;
  98. }
  99. // Allow usage as a pointer
  100. operator CMemDC*() 
  101. {
  102. return this;
  103. }
  104. };
  105. #endif