MFC 双缓冲实现

#pragma once
//用这个类可以实现双缓冲
/*

通过
CMemoryDC dc(pDc);  创建一个内存DC,
dc.Fill();  全部是内存Bitmap上画图
当dc析构时,将内存bitmap直接拷贝到物理DC上去.
*/
class CMemoryDC
 :public CDC
{
protected: 
   CBitmap  m_bitmap;       // Offscreen bitmap     内存的位图
   CBitmap* m_oldBitmap;    // bitmap originally found in CMemDC   原始位图
   CDC*     m_pDC;          // Saves CDC passed in constructor  
   CRect    m_rect;         // Rectangle of drawing area.  
   BOOL     m_bMemDC;       // TRUE if CDC really is a Memory DC.  
    
  void Construct(CDC* pDC) 
  { 
        ASSERT(pDC != NULL);  
 
        // Some initialization  
      m_pDC = pDC; 
      m_oldBitmap = NULL; 
      m_bMemDC = !pDC->IsPrinting(); 
 
     if (m_bMemDC) { 
            // Create a Memory DC  
         CreateCompatibleDC(pDC); 
         pDC->LPtoDP(&m_rect); 
 
          m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height()); 
            m_oldBitmap = SelectObject(&m_bitmap); 
             
           SetMapMode(pDC->GetMapMode()); 
          pDC->DPtoLP(&m_rect); 
            SetWindowOrg(m_rect.left, m_rect.top); 
        } else { 
            // Make a copy of the relevent parts of the current DC for printing  
          m_bPrinting = pDC->m_bPrinting; 
            m_hDC       = pDC->m_hDC; 
            m_hAttribDC = pDC->m_hAttribDC; 
       } 

      // Fill background   
      FillSolidRect(m_rect, pDC->GetBkColor()); 
  } 
 
// TRK begin  
public: 
   CMemoryDC(CDC* pDC     ) : CDC() { pDC->GetClipBox(&m_rect); Construct(pDC); } 
   CMemoryDC(CDC* pDC, const RECT& rect) : CDC() { m_rect = rect           ; Construct(pDC); } 
// TRK end  
    
   virtual ~CMemoryDC() 
  {         
       if (m_bMemDC) { 
            // Copy the offscreen bitmap onto the screen.  
            m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(), 
                this, m_rect.left, m_rect.top, SRCCOPY);             
            
           //Swap back the original bitmap.  
            SelectObject(m_oldBitmap);         
        } else { 
          // All we need to do is replace the DC with an illegal value,  
           // this keeps us from accidently deleting the handles associated with  
           // the CDC that was passed to the constructor.              
           m_hDC = m_hAttribDC = NULL; 
        }     
   } 
    
    // Allow usage as a pointer      
   CMemoryDC* operator->()  
   { 
       return this; 
   }     
 
   // Allow usage as a pointer      
   operator CMemoryDC*()  
 { 
  return this; 
 } 
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值