MFC双缓冲绘图

本文介绍MFC中实现双缓冲绘图的方法,通过创建内存设备上下文(DC)及兼容位图,避免闪烁地绘制图形。文章提供了一个具体的CDataStructureView类OnEraseBkgnd成员函数实例,并展示如何利用自定义的CCanvas类来简化绘图过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MFC双缓冲绘图

原理呢转一下别人的,重点在后面的画布类——MFC双缓冲绘图

——————————————————————————

BOOL  CDataStructureView::OnEraseBkgnd(CDC* pDC)
 
{
      CRect rc;
      CDC dcMem;
      GetClientRect(&rc);
      CBitmap bmp; //内存中承载临时图象的位图
 
 
      dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC
      //创建兼容位图(必须用pDC创建,否则画出的图形变成黑色)
      bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
      CBitmap *pOldBit=dcMem.SelectObject(&bmp);
      //按原来背景填充客户区,不然会是黑色
      dcMen.FillSolidRect(rc,RGB(255,255,255))
 
      //画图,添加你要画图的代码,不过用dcMem画,而不是pDC;
 
      ......
 
      pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);
 
      //将内存DC上的图象拷贝到前台
      //绘图完成后的清理
      dcMem.DeleteDC();     //删除DC
      bmp.DeleteObject(); //删除位图
      return  true ;
      //这里一定要用return true,如果用自动生成的,会调用基类,把画出来的覆盖,就什     么结果也没有了
}
新建画布类:
class CCanvas  
{
public:
    CCanvas();
    virtual ~CCanvas();


    void Create(CDC* a_pDC,CSize a_szSize){
        Create(a_pDC,a_szSize.cx,a_szSize.cy);
    }
    // 创建画布
    void Create(CDC* a_pDC,const int a_iWidth,const int a_iHeight){
        m_dcMem.CreateCompatibleDC(a_pDC);
        m_bit.CreateCompatibleBitmap(a_pDC,a_iWidth,a_iHeight);
        m_bitOld=m_dcMem.SelectObject(&m_bit);
m_iWidth=a_iWidth;
m_iHeight=a_iHeight;
    }
void SetFilledRGB(COLORREF a_FilledRGB){ //Add by QLH
m_dcMem.FillSolidRect(0,0,m_iWidth,m_iHeight,a_FilledRGB);  //用背景色填充位图,将位图清除干净
}
    void Destroy(){
        if(m_bitOld) {
            m_dcMem.SelectObject(m_bitOld);
            //m_dcMem.DeleteDC();
        }
    }
    // 绘制图像到画布
    void Draw(CBMP* a_pBMP,LPRECT a_rRect){
        PaintDIB(m_dcMem,a_rRect,a_pBMP->GetHDIB(),a_pBMP->GetRect(),a_pBMP->GetPalette());
    }
    // 输出到设备
/*BOOLBitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop);


   x:目标矩形区域的左上角x轴坐标点。


y:目标矩形区域的左上角y轴坐标点。


nWidth:在目标设备中绘制位图的宽度。


nHight:在目标设备中绘制位图的高度。


pSrcDC:源设备上下文对象指针。


xSrc:源设备上下文的起点x轴坐标,函数从该起点复制位图到目标设备。


ySrc:源设备上下文的起点y轴坐标,函数从该起点复制位图到目标设备。
*/
    void OutToDC(CDC* a_pDC,LPRECT a_rRect,DWORD dwRop=SRCCOPY){
        a_pDC->BitBlt(a_rRect->left,a_rRect->top,a_rRect->right-a_rRect->left,a_rRect->bottom-a_rRect->top,&m_dcMem,0,0,SRCCOPY);


    }
void OutToDC(CDC * a_pDC,LPRECT a_rDesPos,int a_iSrcX,int a_iSrcY){
a_pDC->BitBlt(a_rDesPos->left,a_rDesPos->top,a_rDesPos->right-a_rDesPos->left,a_rDesPos->bottom-a_rDesPos->top,&m_dcMem,a_iSrcX,a_iSrcY,SRCCOPY);
}
    CDC*    GetDC(){return &m_dcMem;}
CBitmap* GetBitmap(){return &m_bit;}
protected:
    CDC         m_dcMem;
    CBitmap*    m_bitOld;
    CBitmap     m_bit;
int m_iWidth; //add by qlh
int m_iHeight; //add by qlh
};


#endif // !defined(AFX_CANVAS_H__9066CECA_82F0_4A75_950D_26D34D23F5E0__INCLUDED_)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值