MemDC.h
上传用户:diziting
上传日期:2007-01-02
资源大小:56k
文件大小:2k
源码类别:

工具条

开发平台:

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-1997, 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.
  15. //
  16. // This class implements a memory Device Context
  17. class CMemDC : public CDC {
  18. private:
  19. CBitmap m_bitmap; // Offscreen bitmap
  20. CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
  21. CDC* m_pDC; // Saves CDC passed in constructor
  22. CRect m_rect; // Rectangle of drawing area.
  23. BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
  24. public:
  25. CMemDC(CDC* pDC) : CDC(), m_oldBitmap(NULL), m_pDC(pDC)
  26. {
  27. ASSERT(m_pDC != NULL); // If you asserted here, you passed in a NULL CDC.
  28.                 
  29. m_bMemDC = !pDC->IsPrinting();
  30.                 
  31. if (m_bMemDC){
  32. // Create a Memory DC
  33. CreateCompatibleDC(pDC);
  34. pDC->GetClipBox(&m_rect);
  35. m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  36. m_oldBitmap = SelectObject(&m_bitmap);
  37. SetWindowOrg(m_rect.left, m_rect.top);
  38. } else {
  39. // Make a copy of the relevent parts of the current DC for printing
  40. m_bPrinting = pDC->m_bPrinting;
  41. m_hDC = pDC->m_hDC;
  42. m_hAttribDC = pDC->m_hAttribDC;
  43. }
  44. }
  45.         
  46. ~CMemDC()
  47. {
  48. if (m_bMemDC) {
  49. // Copy the offscreen bitmap onto the screen.
  50. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  51. this, m_rect.left, m_rect.top, SRCCOPY);
  52. //Swap back the original bitmap.
  53. SelectObject(m_oldBitmap);
  54. } else {
  55. // All we need to do is replace the DC with an illegal value,
  56. // this keeps us from accidently deleting the handles associated with
  57. // the CDC that was passed to the constructor.
  58. m_hDC = m_hAttribDC = NULL;
  59. }
  60. }
  61.         
  62. // Allow usage as a pointer
  63. CMemDC* operator->() {return this;}
  64.         
  65. // Allow usage as a pointer
  66. operator CMemDC*() {return this;}
  67. };
  68. #endif