MemDC.h
上传用户:qzpk666
上传日期:2022-08-04
资源大小:59k
文件大小:3k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. #ifndef _MEMDC_H_
  2. #define _MEMDC_H_
  3.  
  4. //////////////////////////////////////////////////
  5. // CMemDC - memory DC
  6. //
  7. // Author: Keith Rule
  8. // Email:  keithr@europa.com
  9. // Copyright 1996-2002, Keith Rule
  10. //
  11. // You may freely use or modify this code provided this
  12. // Copyright is included in all derived versions.
  13. //
  14. // History - 10/3/97 Fixed scrolling bug.
  15. //               Added print support. - KR
  16. //
  17. //       11/3/99 Fixed most common complaint. Added
  18. //            background color fill. - KR
  19. //
  20. //       11/3/99 Added support for mapping modes other than
  21. //            MM_TEXT as suggested by Lee Sang Hun. - KR
  22. //
  23. //       02/11/02 Added support for CScrollView as supplied
  24. //             by Gary Kirkham. - KR
  25. //
  26. // This class implements a memory Device Context which allows
  27. // flicker free drawing.
  28.  
  29. class CMemDC : public CDC {
  30. private:       
  31.     CBitmap    m_bitmap;        // Offscreen bitmap
  32.     CBitmap*       m_oldBitmap; // bitmap originally found in CMemDC
  33.     CDC*       m_pDC;           // Saves CDC passed in constructor
  34.     CRect      m_rect;          // Rectangle of drawing area.
  35.     BOOL       m_bMemDC;        // TRUE if CDC really is a Memory DC.
  36. public:
  37.     
  38.     CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
  39.     {
  40.         ASSERT(pDC != NULL); 
  41.  
  42.         // Some initialization
  43.         m_pDC = pDC;
  44.         m_oldBitmap = NULL;
  45.         m_bMemDC = !pDC->IsPrinting();
  46.  
  47.         // Get the rectangle to draw
  48.         if (pRect == NULL) {
  49.              pDC->GetClipBox(&m_rect);
  50.         } else {
  51.              m_rect = *pRect;
  52.         }
  53.  
  54.         if (m_bMemDC) {
  55.              // Create a Memory DC
  56.              CreateCompatibleDC(pDC);
  57.              pDC->LPtoDP(&m_rect);
  58.  
  59.              m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), 
  60.                                                   m_rect.Height());
  61.              m_oldBitmap = SelectObject(&m_bitmap);
  62.  
  63.              SetMapMode(pDC->GetMapMode());
  64.  
  65.              SetWindowExt(pDC->GetWindowExt());
  66.              SetViewportExt(pDC->GetViewportExt());
  67.  
  68.              pDC->DPtoLP(&m_rect);
  69.              SetWindowOrg(m_rect.left, m_rect.top);
  70.         } else {
  71.              // Make a copy of the relevent parts of the current 
  72.              // DC for printing
  73.              m_bPrinting = pDC->m_bPrinting;
  74.              m_hDC       = pDC->m_hDC;
  75.              m_hAttribDC = pDC->m_hAttribDC;
  76.         }
  77.  
  78.         // Fill background 
  79.         FillSolidRect(m_rect, pDC->GetBkColor());
  80.     }
  81.     
  82.     ~CMemDC()      
  83.     {          
  84.         if (m_bMemDC) {
  85.              // Copy the offscreen bitmap onto the screen.
  86.              m_pDC->BitBlt(m_rect.left, m_rect.top, 
  87.                            m_rect.Width(),  m_rect.Height(),
  88.                   this, m_rect.left, m_rect.top, SRCCOPY);            
  89.              
  90.              //Swap back the original bitmap.
  91.              SelectObject(m_oldBitmap);        
  92.         } else {
  93.              // All we need to do is replace the DC with an illegal
  94.              // value, this keeps us from accidentally deleting the 
  95.              // handles associated with the CDC that was passed to 
  96.              // the constructor.              
  97.              m_hDC = m_hAttribDC = NULL;
  98.         }       
  99.     }
  100.     
  101.     // Allow usage as a pointer    
  102.     CMemDC* operator->() 
  103.     {
  104.         return this;
  105.     }       
  106.  
  107.     // Allow usage as a pointer    
  108.     operator CMemDC*() 
  109.     {
  110.         return this;
  111.     }
  112. };
  113.  
  114. #endif