现在的位置: 首页 > 综合 > 正文

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

2013年10月25日 ⁄ 综合 ⁄ 共 1163字 ⁄ 字号 评论关闭

        转自: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,这样就比较麻烦,而却程序运行的效率也不高。

抱歉!评论已关闭.