zoukankan      html  css  js  c++  java
  • 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)

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

  • 相关阅读:
    AutoCAD 2013 .net插件创建向导现在支持Map 3D,Civil 3D,AutoCAD Architecture 和AutoCAD MEP
    AutoCAD® Civil 3D API需求意愿调查
    Linux 下动态库和静态库的创建和调用
    几个典型的内存拷贝及字符串函数实现
    典型的几个链表操作-逆序和重排
    打印 N*N 螺旋矩阵
    PhoneGap开发初体验:用HTML5技术开发本地应用
    不申请变量和空间反转字符串
    寻找最大公共子字符串
    二维动态数组定义及二维静态数组与**P的区别
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4733580.html
Copyright © 2011-2022 走看看