MemDC.h
上传用户:apnc006
上传日期:2013-01-26
资源大小:178k
文件大小:4k
源码类别:

绘图程序

开发平台:

Visual C++

  1. //*******************************************************************************************************/
  2. //* FileName: MemDC.h
  3. //*
  4. //* Contents: Definition and implementation for CMemDC
  5. //*
  6. //* Copyright You may freely use or modify this code provided this Copyright is included in all 
  7. //* Notice: derived versions.
  8. //*
  9. //* Author: Keith Rule
  10. //*
  11. //* Email: keithr@europa.com
  12. //*
  13. //* Copyright 1996-1997, Keith Rule
  14. //*******************************************************************************************************/
  15. //* 10/3/97 Keith Rule Fixed scrolling bug.
  16. //* 10/3/97 Keith Rule Added print support.
  17. //* 12.feb.98 Jan Vidar Berger Ported CMemDC into clPlot and added some comments.
  18. //*******************************************************************************************************/
  19. #ifndef _MEMDC_H_
  20. #define _MEMDC_H_
  21. //*******************************************************************************************************/
  22. //* Class: CMemDC - memory DC
  23. //*
  24. //* Base Class: public CDC
  25. //*
  26. //* Description: This class implements a memory Device Context that enables flicker free drawing.
  27. //*
  28. //* Usage: Implemen CMemDC in your CMyWnd::OnPaint as following:
  29. //* {
  30. //* CPaintDC dc(pWnd);
  31. //* CMemDC mDC(dc); // call CMemDC::CMemDC(CDC *dc)
  32. //*
  33. //* Draw(mDC); // draw on CMemDC rather than CDC directly.
  34. //* } // call CMemDC::~CMemDC()
  35. //*
  36. //* Finally, add and modify WM_ERASEBKGND message in your project as following.
  37. //*
  38. //* BOOL CMyView::OnEraseBkgnd(CDC* pDC) 
  39. //* {
  40. //* return FALSE;
  41. //* }
  42. //*
  43. //* How it works: 1. The constructor will construct compatibledc and do the work required to enable 
  44. //* drawing on a memory dc.
  45. //* 2. You can draw on the CMemDC as if it is a CDC.
  46. //* 3. The destructor copies the memory dc into the real DC.
  47. //*******************************************************************************************************/
  48. class CMemDC : public CDC {
  49. private:
  50.         CBitmap m_bitmap; // Offscreen bitmap
  51.         CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
  52.         CDC* m_pDC; // Saves CDC passed in constructor
  53.         CRect m_rect; // Rectangle of drawing area.
  54.         BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
  55. public:
  56.         CMemDC(CDC* pDC) : CDC(), m_oldBitmap(NULL), m_pDC(pDC)
  57.         {
  58.                 ASSERT(m_pDC != NULL); // If you asserted here, you passed in a NULL CDC.
  59.                 
  60.                 m_bMemDC = !pDC->IsPrinting();
  61.                 
  62.                 if (m_bMemDC){
  63.                         // Create a Memory DC
  64.                         CreateCompatibleDC(pDC);
  65.                         pDC->GetClipBox(&m_rect);
  66.                         m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  67.                         m_oldBitmap = SelectObject(&m_bitmap);
  68.                         SetWindowOrg(m_rect.left, m_rect.top);
  69.                 } else {
  70.                         // Make a copy of the relevent parts of the current DC for printing
  71.                         m_bPrinting = pDC->m_bPrinting;
  72.                         m_hDC = pDC->m_hDC;
  73.                         m_hAttribDC = pDC->m_hAttribDC;
  74.                 }
  75.         }
  76.         
  77.         ~CMemDC()
  78.         {
  79.                 if (m_bMemDC) {
  80.                         // Copy the offscreen bitmap onto the screen.
  81.                         m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  82.                                 this, m_rect.left, m_rect.top, SRCCOPY);
  83.                         //Swap back the original bitmap.
  84.                         SelectObject(m_oldBitmap);
  85.                 } else {
  86.                         // All we need to do is replace the DC with an illegal value,
  87.                         // this keeps us from accidently deleting the handles associated with
  88.                         // the CDC that was passed to the constructor.
  89.                         m_hDC = m_hAttribDC = NULL;
  90.                 }
  91.         }
  92.         
  93.         // Allow usage as a pointer
  94.         CMemDC* operator->() {return this;}
  95.         
  96.         // Allow usage as a pointer
  97.         operator CMemDC*() {return this;}
  98. };
  99. #endif