双缓冲解决位图移动的闪屏问题

        转自:http://zyb.nero.blog.163.com/blog/static/10860604520102514338569/

        双缓冲是一个解决闪屏很有效的方法,即在内存中创建一块与客户区大小相同的表面,在其上绘制好要画的所有图,然后通过一次位块转移操作,翻转到实际的客户区表面,最后一起显示出来。这样做的好处是可以减少了对主表面的刷新重绘操作,可以提升程序的运行效率,同样也可以结局闪屏问题。

       导致闪屏的原因上篇日志我也说了。在主表面上直接绘制时,显示出的图形就会因绘制先后次序不一致而分别显示,如果主表面的刷新比较频繁的话,那么在某一次刷新时有一部分图形重绘了,而另一部分没有重绘,下一次刷新时这部分才出现,那样就会导致闪屏。

       对于双缓冲,我原来也听说过,但是一直没有很好的理解,不知道他的实质。即在后备表面上先画好这一帧所需要绘制的全部图像,然后再进过翻转操作显示到主表面上。经过前天和YXY讨论后,我才最终明白。

       所以我的位图移动的闪屏问题也可以通过这个方法更好的解决了。

       方法:

      1、创建一个DC的对象BufferCD。

      CDC bufferdc;

      2、创建一个Bitmap的对象BufferBMP

      CBitmap bufferbmp;

      3、通过这个BufferBMP对象创建一个兼容性位图,这个位图大小设置为与客户区大小相同,同时将其与我们的BufferCD关联起来。

       bufferbmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());

      4、在BufferCD上进行绘图操作,画出这一帧所需要画的图形。

       bufferdc.BitBlt(0,0,rc.Width(),rc.Height(),&bgdc,0,0,SRCCOPY);
       bufferdc.BitBlt(distance,0,rc.Width(),rc.Height(),&mdc,0,0,SRCCOPY);

     5、通过主表面的位块转移操作,将BufferCD上的图形全部复制到主表面上。

     pDC->BitBlt(0,0,rc.Width(),rc.Height(),&bufferdc,0,0,SRCCOPY);

     通过这种方法来做,首先代码量小多了。另外在前一种方法中,我为了局部刷新,要在OnPaint()函数中分情况来绘制背景,但是绘制的方法是一样的,因此就会有大量代码是重复出现的。而且为了避免出现异常,我还得再每次绘图之后要销毁、删除DC,然后要新绘制时还得重新获取DC,创建DC,这样就比较麻烦,而却程序运行的效率也不高。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值