MemDC.h
上传用户:amei960
上传日期:2007-02-05
资源大小:143k
文件大小:3k
源码类别:

Audio

开发平台:

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-1999, 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. - KR
  15. //
  16. //           11/3/99 Fixed most common complaint. Added
  17. //                   background color fill. - KR
  18. //
  19. //           11/3/99 Added support for mapping modes other than
  20. //                   MM_TEXT as suggested by Lee Sang Hun. - KR
  21. //
  22. // This class implements a memory Device Context which allows
  23. // flicker free drawing.
  24. class CMemDC : public CDC {
  25. private:    
  26.     CBitmap  m_bitmap;       // Offscreen bitmap
  27.     CBitmap* m_oldBitmap;    // bitmap originally found in CMemDC
  28.     CDC*     m_pDC;          // Saves CDC passed in constructor
  29.     CRect    m_rect;         // Rectangle of drawing area.
  30.     BOOL     m_bMemDC;       // TRUE if CDC really is a Memory DC.
  31. public:
  32.     
  33.     CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
  34.     {
  35.         ASSERT(pDC != NULL); 
  36.         // Some initialization
  37.         m_pDC = pDC;
  38.         m_oldBitmap = NULL;
  39.         m_bMemDC = !pDC->IsPrinting();
  40.         // Get the rectangle to draw
  41.         if (pRect == NULL) {
  42.             pDC->GetClipBox(&m_rect);
  43.         } else {
  44.             m_rect = *pRect;
  45.         }
  46.         
  47.         if (m_bMemDC) {
  48.             // Create a Memory DC
  49.             CreateCompatibleDC(pDC);
  50.             pDC->LPtoDP(&m_rect);
  51.             m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  52.             m_oldBitmap = SelectObject(&m_bitmap);
  53.             
  54.             SetMapMode(pDC->GetMapMode());
  55.             pDC->DPtoLP(&m_rect);
  56.             SetWindowOrg(m_rect.left, m_rect.top);
  57.         } else {
  58.             // Make a copy of the relevent parts of the current DC for printing
  59.             m_bPrinting = pDC->m_bPrinting;
  60.             m_hDC       = pDC->m_hDC;
  61.             m_hAttribDC = pDC->m_hAttribDC;
  62.         }
  63.         // Fill background 
  64.         FillSolidRect(m_rect, pDC->GetBkColor());
  65.     }
  66.     
  67.     ~CMemDC()    
  68.     {        
  69.         if (m_bMemDC) {
  70.             // Copy the offscreen bitmap onto the screen.
  71.             m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  72.                 this, m_rect.left, m_rect.top, SRCCOPY);            
  73.             
  74.             //Swap back the original bitmap.
  75.             SelectObject(m_oldBitmap);        
  76.         } else {
  77.             // All we need to do is replace the DC with an illegal value,
  78.             // this keeps us from accidently deleting the handles associated with
  79.             // the CDC that was passed to the constructor.            
  80.             m_hDC = m_hAttribDC = NULL;
  81.         }    
  82.     }
  83.     
  84.     // Allow usage as a pointer    
  85.     CMemDC* operator->() 
  86.     {
  87.         return this;
  88.     }    
  89.     // Allow usage as a pointer    
  90.     operator CMemDC*() 
  91.     {
  92.         return this;
  93.     }
  94. };
  95. #endif