c++双缓冲技术,以避免闪烁绘图

当数据量非常大时,画图可能须要几秒钟甚至更长的时间,并且有时还会出现闪烁现象,为了解决这些问题。可採用双缓冲技术来画图。

双缓冲即在内存中创建一个与屏幕画图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形复制到屏幕上,这样能大大加快画图的速度。双缓冲实现步骤例如以下:
1、在内存中创建与画布一致的缓冲区
2、在缓冲区绘图
3、将缓冲区位图复制到当前画布上
4、释放内存缓冲区
图形图象处理编程过程中,双缓冲是一种主要的技术。我们知道,假设窗口在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗口在重绘时由于过频的刷新而引起闪烁现象。

解决这一问题的有效方法就是双缓冲技术。由于窗口在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗口画图区,然后在调用新的画图代码进行重绘,这样一擦一写造成了图象颜色的反差。

当WM_PAINT的响应非常频繁的时候。这样的反差也就越发明显。于是我们就看到了闪烁现象。 

我们会非常自然的想到,避免背景色的填充是最直接的办法。

可是那样的话,窗口上会变的一团糟。由于每次绘制图象的时候都没有将原来的图象清除,造 成了图象的残留。于是窗口重绘时,画面往往会变的乱七八糟。所以单纯的禁止背景重绘是不够的。

我们还要进行又一次画图,但要求速度非常快,于是我们想到了使用
BitBlt函数。它能够支持图形块的复制。速度非常快。我们能够先在内存中作图。然后用此函数将做好的图拷贝到前台,同一时候禁止背景刷新。这样就消除了闪 烁。以上也就是双缓冲画图的主要的思路。

 

首先给出实现的程序,然后再解释,相同是在OnDraw(CDC *pDC)中: 
CDC MemDC; //首先定义一个显示设备对象 
CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备
MemDC.CreateCompatibleDC(NULL); //这时还不能画图,由于没有地方画 ^_^ 
//以下建立一个与屏幕显示兼容的位图,至于位图的大小嘛。能够用窗体的大小。也能够自定义
(如:有滚动栏时就要大于当前窗体的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //仅仅有选入了位图的内存显示设备才有地方画图。画到指定的位图上 
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 //你也能够用自己应该用的颜色 
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //画图 
MemDC.MoveTo(……); MemDC.LineTo(……); //将内存中的图复制到屏幕上进行显示 
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //画图完毕后的清理 //把前面的pOldBit选回来.在删除MemBitmap之前要先从设备中移除它 
MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC(); 双缓冲孔(two way soft-closing)

版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文链接: https://www.cnblogs.com/zfyouxi/p/4733580.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    c++双缓冲技术,以避免闪烁绘图

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/220717

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午11:00
下一篇 2023年2月13日 上午11:00

相关推荐