FCMemDC.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (C) =USTC= Fu Li
  3. *
  4. * Author : Fu Li
  5. * Create : 2005-3-11
  6. * Home : www.crazy-bit.com
  7. * Mail : crazybit@263.net
  8. * History :
  9. */
  10. #pragma once
  11. /**
  12. * Memory DC class (to avoid screen's flash)
  13. */
  14. class FCMemDC : public CDC
  15. {
  16. public:
  17. /// Constructor
  18. FCMemDC (CDC* pDC, LPCRECT lpRect)
  19. {
  20. CreateCompatibleDC (pDC) ;
  21. m_rcDC = lpRect ; ASSERT(!m_rcDC.IsRectEmpty());
  22. m_memBmp.CreateCompatibleBitmap (pDC, m_rcDC.Width(), m_rcDC.Height()) ;
  23. m_pOldBitmap = SelectObject (&m_memBmp) ;
  24. m_pDC = pDC ; ASSERT(pDC);
  25. }
  26. virtual ~FCMemDC()
  27. {
  28. if (m_pOldBitmap)
  29. {
  30. ASSERT(FALSE) ;
  31. SelectObject (m_pOldBitmap) ;
  32. m_pOldBitmap = NULL;
  33. }
  34. }
  35. /// Draw content of memory DC to actual DC
  36. void FinalBlt()
  37. {
  38. m_pDC->BitBlt (m_rcDC.left, m_rcDC.top, m_rcDC.Width(), m_rcDC.Height(), this, 0, 0, SRCCOPY) ;
  39. m_pDC = NULL ;
  40. SelectObject (m_pOldBitmap) ;
  41. m_pOldBitmap = NULL ;
  42. }
  43. private:
  44. CBitmap m_memBmp ;
  45. CRect m_rcDC ;
  46. CBitmap * m_pOldBitmap ;
  47. CDC * m_pDC ;
  48. };
  49. /**
  50. * Auto restore DC's attribute (textcolor, bkmode, font, pen, brush)
  51. @verbatim
  52. example:
  53. FCAutoRestoreDCAttribute _dc_attri (pDC) ;
  54. CFont ft ;
  55. ft.CreatePointFont (90, _T("Arial")) ;
  56. ::SelectObject (pDC->GetSafeHdc(), ft.m_hObject) ;
  57. _dc_attri.Restore() ; // must restore before ft's deconstructor
  58. @endverbatim
  59. */
  60. class FCAutoRestoreDCAttribute
  61. {
  62. public:
  63. /// Save pDC's attributes when constructor
  64. FCAutoRestoreDCAttribute (CDC* pDC) : m_pDC(pDC), m_bHasRestore(FALSE)
  65. {
  66. m_crTxt = pDC->GetTextColor() ;
  67. m_nBkMode = pDC->GetBkMode() ;
  68. m_hFont = ::GetCurrentObject (pDC->GetSafeHdc(), OBJ_FONT) ; ASSERT(m_hFont);
  69. m_hPen = ::GetCurrentObject (pDC->GetSafeHdc(), OBJ_PEN) ; ASSERT(m_hPen);
  70. m_hBrush = ::GetCurrentObject (pDC->GetSafeHdc(), OBJ_BRUSH) ; ASSERT(m_hBrush);
  71. }
  72. /// Restore pDC's attributes if you haven't call Restore() method
  73. ~FCAutoRestoreDCAttribute()
  74. {
  75. Restore() ;
  76. }
  77. /// Restore pDC's attributes
  78. void Restore()
  79. {
  80. if (m_bHasRestore)
  81. return ;
  82. if (::GetCurrentObject (m_pDC->GetSafeHdc(), OBJ_FONT) != m_hFont)
  83. ::SelectObject (m_pDC->GetSafeHdc(), m_hFont) ;
  84. if (::GetCurrentObject (m_pDC->GetSafeHdc(), OBJ_PEN) != m_hPen)
  85. ::SelectObject (m_pDC->GetSafeHdc(), m_hPen) ;
  86. if (::GetCurrentObject (m_pDC->GetSafeHdc(), OBJ_BRUSH) != m_hBrush)
  87. ::SelectObject (m_pDC->GetSafeHdc(), m_hBrush) ;
  88. m_pDC->SetBkMode(m_nBkMode) ;
  89. m_pDC->SetTextColor(m_crTxt) ;
  90. m_bHasRestore = TRUE ;
  91. }
  92. private:
  93. CDC * m_pDC ;
  94. COLORREF m_crTxt ;
  95. int m_nBkMode ;
  96. HGDIOBJ m_hFont ;
  97. HGDIOBJ m_hPen ;
  98. HGDIOBJ m_hBrush ;
  99. BOOL m_bHasRestore ;
  100. };