VC 中使用双缓冲以及出现的问题总结

在使用VC进行UI开发的时候,绘图是一个比较常见的操作。

网络上有很多关于“双缓冲”绘图的文章。这里就自己使用时出现的问题做个总结,和大家分享

例如:

在视图类(View类)的OnDraw(CDC* pDC)函数中

CDC   dcMemeryFirst;    //第一个兼容DC

CDC  dcMemerySecond;     //第二个兼容DC

 

CBitmap        memBmpFirst;      //第一张内存Bitmap

dcMemeryFirst.CreateCompatibleDC(pDC);    //这里注意,传入的参数是pDC

 

CRect  rect;
GetClientRect(&rect);    //获取客户区的大小,在创建兼容位图时,指定位图的大小


memBmpFirst.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

 

  CBrush  writeBrush;

  writeBrush.CreateSolidBrush(RGB(255,255,255));

 

  dcMemeryFirst.SelectObject(&membmp);    //兼容位图选入到兼容dc,这样就可以在该位图上绘制

 

  dcMemeryFirst.FillRect(&rect, &writeBrush);  //绘制底色,这里绘制成白色

 

  dcMemerySecond.CreateCompatibleDC(&dcMemery1);
  
  dcMemerySecond.SelectObject(m_bmtmap);  //加载位图资源的方式有两种,这里使用的是从资源中加载的

 

  memBmpFirst.BitBlt(m_point.x, m_point.y,110,157, &dcMemerySecond,0,0,SRCCOPY); 

 //将第二个兼容DC中的内容绘制到,第一个兼容DC


  pDC->BitBlt(0,0,rect.Width(), rect.Height(),&memBmpFirst,0,0, SRCCOPY);

 //将第一个兼容DC中的内容绘制到,实际DC

 

 memBmpFirst.DeleteObject();

 

 

总结:

1.所谓双缓冲技术,就是在绘制的时候不是直接绘制到DC表面。而是首先绘制到兼容DC,然后在贴到实际DC。

2.在使用兼容DC的时候一定要将一个位图对象与之关联,否则绘制不了。

3.如果缺少上面的dcMemeryFirst.FillRect(&rect, &writeBrush); 那么你的兼容位图时黑色的。

 

分析:

1.为什么时候双缓冲技术?

因为进行大量绘制的时候,下一个绘制状态最终可能与上一个状态差别不是很大,但是这个绘制过程中差距比较大,所以我们在内存中将绘制工作完成,最后使用BitBlt将绘制好的图贴到目标DC中,可以防止闪烁的出现。(例如在一个View中拖动一张图片的时候)

2。为什么使用上述方法,还是出现闪动现象呢?

你可以重载一下OnEraseBkgnd(CDC* pDC)

在该函数中直接 return TRUE;不要总是刷背景,看看是不是OK了?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值