MemoryDC.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "stdafx.h"
  2. #include "MemoryDC.h"
  3. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. CMemoryDC::CMemoryDC( CDC* pDC, CRect rect /*= CRect(0,0,0,0)*/, BOOL bCopyFirst /*= FALSE*/ ): CDC(), m_oldBitmap(NULL), m_pDC(pDC)
  5. {
  6. ASSERT(m_pDC != NULL); // 断言参数不为空
  7. m_bMemDC = !pDC->IsPrinting();
  8. if (m_bMemDC)
  9. {
  10. //创建一个内存DC
  11. CreateCompatibleDC(pDC);
  12. if ( rect == CRect(0,0,0,0) )
  13. {
  14. pDC->GetClipBox(&m_rect);
  15. }
  16. else
  17. {
  18. m_rect = rect;
  19. }
  20. //创建兼容位图
  21. m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  22. //保留旧位图对象
  23. m_oldBitmap = SelectObject(&m_bitmap);
  24. //移动窗口原点
  25. SetWindowOrg(m_rect.left, m_rect.top);
  26. //初次复制
  27. if(bCopyFirst)
  28. {
  29. this->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),m_pDC, m_rect.left, m_rect.top, SRCCOPY);
  30. }
  31. }
  32. else
  33. {
  34. //创建一个跟当前DC绘制有关的副本
  35. m_bPrinting = pDC->m_bPrinting;
  36. m_hDC = pDC->m_hDC;
  37. m_hAttribDC = pDC->m_hAttribDC;
  38. }
  39. }
  40. CMemoryDC::~CMemoryDC()
  41. {
  42. if (m_bMemDC)
  43. {
  44. //复制屏幕外位图到屏幕内
  45. m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), this, m_rect.left, m_rect.top, SRCCOPY);
  46. //交换原来的位图
  47. SelectObject(m_oldBitmap);
  48. }
  49. else
  50. {
  51. m_hDC = m_hAttribDC = NULL;
  52. }
  53. }
  54. CMemoryDC* CMemoryDC::operator->()
  55. {
  56. return this;
  57. }
  58. CMemoryDC::operator CMemoryDC*()
  59. {
  60. return this;
  61. }
  62. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////