memdc.h
上传用户:sunh8215
上传日期:2010-02-13
资源大小:1616k
文件大小:2k
源码类别:

酒店行业

开发平台:

Visual C++

  1. #ifndef _MEMDC_H_
  2. #define _MEMDC_H_
  3. //////////////////////////////////////////////////
  4. // CMemDC - memory DC
  5. //
  6. //使用双缓冲技术解决屏幕闪烁问题
  7. //
  8. // This class implements a memory Device Context which allows
  9. // flicker free drawing.
  10. class CMemDC2 : public CDC {
  11. private:
  12. CBitmap m_bitmap; // Offscreen bitmap
  13. CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
  14. CDC* m_pDC; // Saves CDC passed in constructor
  15. CRect m_rect; // Rectangle of drawing area.
  16. BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
  17. public:
  18. CMemDC2(CDC* pDC, const CRect* pRect = NULL) : CDC()
  19. {
  20. ASSERT(pDC != NULL); 
  21. // Some initialization
  22. m_pDC = pDC;
  23. m_oldBitmap = NULL;
  24. m_bMemDC = !pDC->IsPrinting();
  25. // Get the rectangle to draw
  26. if (pRect == NULL) {
  27. pDC->GetClipBox(&m_rect);
  28. } else {
  29. m_rect = *pRect;
  30. }
  31. if (m_bMemDC) {
  32. // Create a Memory DC
  33. CreateCompatibleDC(pDC);
  34. pDC->LPtoDP(&m_rect);
  35. m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  36. m_oldBitmap = SelectObject(&m_bitmap);
  37. SetMapMode(pDC->GetMapMode());
  38. SetWindowExt(pDC->GetWindowExt());
  39. SetViewportExt(pDC->GetViewportExt());
  40. pDC->DPtoLP(&m_rect);
  41. SetWindowOrg(m_rect.left, m_rect.top);
  42. } else {
  43. // Make a copy of the relevent parts of the current DC for printing
  44. m_bPrinting = pDC->m_bPrinting;
  45. m_hDC       = pDC->m_hDC;
  46. m_hAttribDC = pDC->m_hAttribDC;
  47. }
  48. // Fill background 
  49. FillSolidRect(m_rect, pDC->GetBkColor());
  50. }
  51. ~CMemDC2()
  52. {
  53. if (m_bMemDC) {
  54. // Copy the offscreen bitmap onto the screen.
  55. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  56. this, m_rect.left, m_rect.top, SRCCOPY);
  57. //Swap back the original bitmap.
  58. SelectObject(m_oldBitmap);
  59. } else {
  60. // All we need to do is replace the DC with an illegal value,
  61. // this keeps us from accidently deleting the handles associated with
  62. // the CDC that was passed to the constructor.
  63. m_hDC = m_hAttribDC = NULL;
  64. }
  65. }
  66. // Allow usage as a pointer
  67. CMemDC2* operator->() 
  68. {
  69. return this;
  70. }
  71. // Allow usage as a pointer
  72. operator CMemDC2*() 
  73. {
  74. return this;
  75. }
  76. };
  77. #endif