MemDC.h
上传用户:guanx8y8
上传日期:2007-07-30
资源大小:326k
文件大小:3k
开发平台:

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-1999, 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. // This class implements a memory Device Context which allows
  23. // flicker free drawing.
  24. class CMemDC : public CDC {
  25. private:
  26. CBitmap m_bitmap; // Offscreen bitmap
  27. CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
  28. CDC* m_pDC; // Saves CDC passed in constructor
  29. CRect m_rect; // Rectangle of drawing area.
  30. BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
  31. public:
  32. CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
  33. {
  34. ASSERT(pDC != NULL); 
  35. // Some initialization
  36. m_pDC = pDC;
  37. m_oldBitmap = NULL;
  38. m_bMemDC = !pDC->IsPrinting();
  39. // Get the rectangle to draw
  40. if (pRect == NULL)
  41. pDC->GetClipBox(&m_rect);
  42. else
  43. m_rect = *pRect;
  44. if (m_bMemDC) {
  45. // Create a Memory DC
  46. CreateCompatibleDC(pDC);
  47. pDC->LPtoDP(&m_rect);
  48. m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  49. m_oldBitmap = SelectObject(&m_bitmap);
  50. SetMapMode(pDC->GetMapMode());
  51. pDC->DPtoLP(&m_rect);
  52. SetWindowOrg(m_rect.left, m_rect.top);
  53. } else {
  54. // Make a copy of the relevent parts of the current DC for printing
  55. m_bPrinting = pDC->m_bPrinting;
  56. m_hDC       = pDC->m_hDC;
  57. m_hAttribDC = pDC->m_hAttribDC;
  58. }
  59. // Fill background 
  60. FillSolidRect(m_rect, pDC->GetBkColor());
  61. }
  62. ~CMemDC()
  63. {
  64. if (m_bMemDC) {
  65. // Copy the offscreen bitmap onto the screen.
  66. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  67. this, m_rect.left, m_rect.top, SRCCOPY);
  68. //Swap back the original bitmap.
  69. SelectObject(m_oldBitmap);
  70. } else {
  71. // All we need to do is replace the DC with an illegal value,
  72. // this keeps us from accidently deleting the handles associated with
  73. // the CDC that was passed to the constructor.
  74. m_hDC = m_hAttribDC = NULL;
  75. }
  76. }
  77. // Allow usage as a pointer
  78. CMemDC* operator->() 
  79. {
  80. return this;
  81. }
  82. // Allow usage as a pointer
  83. operator CMemDC*() 
  84. {
  85. return this;
  86. }
  87. };
  88. #endif