双缓冲技术绘图

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、双缓冲技术的应用

    当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。

    我们会很自然的想到,避免背景色的填充是最直接的办法。但是那样的话,窗体上会变的一团糟。因为每次绘制图象的时候都没有将原来的图象清除,造 成了图象的残留,于是窗体重绘时,画面往往会变的乱七八糟。所以单纯的禁止背景重绘是不够的。我们还要进行重新绘图,但要求速度很快,于是我们想到了使用 BitBlt函数。它可以支持图形块的复制,速度很快。我们可以先在内存中作图,然后用此函数将做好的图复制到前台,同时禁止背景刷新,这样就消除了闪 烁。以上也就是双缓冲绘图的基本的思路。

二、双缓冲技术的实现步骤

    双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:    

    1、在内存中创建与画布一致的缓冲区

    2、在缓冲区画图

    3、将缓冲区位图拷贝到当前画布上

    4、释放内存缓冲区

首先给出实现的程序,然后再解释,同样是在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)

相关链接:

http://www.cnblogs.com/afarmer/archive/2012/03/31/2427315.html

 

转载于:https://my.oschina.net/u/1426828/blog/286982

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.Pycharm + Django + Python进行WEB路由配置

一、普通路由配置 1.利用PyCharm创建工程名为mysite的Django项目,在mysite文件上新建views.py视图文件,如下图示: 2.在urls.py文件中导入view.py视图文件 from . import views3.在urls.py文件中添加新的路由,如下图示&#xff1…

面试官 | Oracle JDK 和 OpenJDK 有什么区别?

作者 | petercao来源 | urlify.cn/yAn6ruOpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。Oracle JDK采用了商业实现…

关于终端的小脚本

#!/bin/bashwho|grep -v ^root |awk {print $1,$2} |while read user ttydo echo "$user :hi,i am root" >/dev/$ttydone向终端窗口或者是控制台(必须是普通用户登录的情况下)发送信息转载于:https://blog.51cto.com/menglinux/1434…

Python通过snmp获取交换机VLAN号、VLAN默认网关、VLAN子网掩码和ARP表中的IP地址与MAC对应记录数据

自己做项目时,自己封装的Python通过snmp获取交换机VLAN号、VLAN默认网关、VLAN子网掩码和ARP表中的IP地址与MAC对应记录数据。 myPySnmp.py源代码 """ mySnmpScan类,扫描核心交换机发送oid或MIB值获取对应数据 """ # -*- coding: utf-8 -*- i…

面试官 | 如何提高服务器的并发能力?

作者 | 潇洒一剑来源 | cnblogs.com/zengjin93/p/5569556.html什么是服务器并发处理能力一台服务器在单位时间里能处理的请求越多,服务器的能力越高,也就是服务器并发处理能力越强有什么方法衡量服务器并发处理能力1. 吞吐率吞吐率,单位时间里…

CentOS 7.0变动

一如每个主要版本的首个发行本,多数组件都已作出改动及更新至较新版本。列出所有改动是本文档的范围以外的事情。最重大的改动计有:内核更新至 3.10.0支持 Linux 容器Open VMware Tools 及 3D 图像能即装即用OpenJDK-7 作为缺省 JDK原地升级 6.5 至 7.0&…

html网页的结构框架代码

推荐使用Notepad编辑器写HTML代码 Notepad官网下载地址 html学习网址&#xff1a; w3school在线教程 html网页的结构框架.html <!--文档声明&#xff0c;声明当前网页的版本--> <!DOCTYPE html> <!--html的根标签&#xff08;元素&#xff09;&#xff0c;网…

Spring 经典面试题汇总.pdf(2020版)

作者 | 静默虚空来源 | juejin.im/post/5cbda379f265da03ae74c2821、基础1.1. 不同版本的 Spring Framework 有哪些主要功能&#xff1f;Version FeatureSpring 2.5发布于 2007 年。这是第一个支持注解的版本。Spring 3.0发布于 2009 年。它完全利用了 Java…

Python校验文件Hash值及获取文件属性

myHash.py # -*- coding: utf-8 -*- import os from hashlib import md5, sha1, sha256 from zlib import crc32 import time from math import ceilclass Hash:def __init__(self, strFilePath):self

面试官 | SpringBoot 中如何实现异步请求和异步调用?

作者 | 会炼钢的小白龙来源 | cnblogs.com/baixianlong/p/10661591.html一、SpringBoot中异步请求的使用1、异步请求与同步请求 特点&#xff1a;可以先释放容器分配给请求的线程与相关资源&#xff0c;减轻系统负担&#xff0c;释放了容器所分配线程的请求&#xff0c;其响应将…

HTML网页结构化框架、meta标签和语义化标签

1.HTML网页结构化框架代码示例 myhtml.html <!--文档声明&#xff0c;声明当前网页的版本--> <!DOCTYPE html> <!--html的根标签&#xff08;元素&#xff09;&#xff0c;网页中的所有内容都要写在根元素的里边--> <html lang"en"> <!…

Android之个性化ListView实现

2019独角兽企业重金招聘Python工程师标准>>> Android中提供的ListView部件&#xff0c;用来在android手机中展现一个列表&#xff0c;这个列表的表现形式&#xff0c;完全由你选择的Adapter有关系&#xff0c;android框架中已有的adapter&#xff0c;形式都比较单调…

面试官 | Class.forName 和 ClassLoader 有什么区别?

作者 | 纪莫来源 | dwz.date/eUc在 Java 中 Class.forName() 和 ClassLoader 都可以对类进行加载。ClassLoader 就是遵循双亲委派模型最终调用启动类加载器的类加载器&#xff0c;实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”&#xff0c;获取到二进制流…

微信公众号使用Chrome插件:Markdown Nice优化微信公众号排版教程

Markdown Nice 是一个为了解决微信公众号排版而生的 Markdown 编辑器&#xff0c;当前有在线编辑器和 Chrome 插件 2 种产品形态。 下面介绍Chrome 插件&#xff1a;Markdown Nice 一、下载和安装Markdown Nice 1.从 墨滴 网站下载mdnice谷歌浏览器插件&#xff0c;如下图&a…

面试官 | 如何优雅的设计Java 异常?

作者 | lrwinx来源 | lrwinx.github.io异常处理是程序开发中必不可少操作之一&#xff0c;但如何正确优雅的对异常进行处理确是一门学问。异常的类别正如我们所知道的&#xff0c;java中的异常的超类是java.lang.Throwable(后文省略为Throwable),它有两个比较重要的子类,java.l…

微型php框架 include/conf.class.php

<?phpdefined(ACC)||exit(Access Denied);// 配置文件读取类class conf {protected static $ins null;protected $cfg array(db>java0620);public static function getIns() {if(self::$ins null) {self::$ins new self();}return self::$ins;}final protected func…

3.Python Django之GET请求和POST请求及响应处理

一、请求中的方法 方法描述GET请求指定的页面信息&#xff0c;并返回实体主体。HEAD类似于GET请求&#xff0c;只不过返回的响应中没有具体的内容&#xff0c;用于获取报头。POST向指定资源提交数据进行处理请求&#xff08;例如&#xff1a;提交表单或者上传文件&#xff09;…

面试官 | Java中的注解是如何工作的?

自Java5.0版本引入注解之后&#xff0c;它就成为了Java平台中非常重要的一部分。开发过程中&#xff0c;我们也时常在应用代码中会看到诸如Override&#xff0c;Deprecated这样的注解。这篇文章中&#xff0c;我将向大家讲述到底什么是注解&#xff1f;为什么要引入注解&#x…

Linux mint 17中文输入法安装,改动linux mint与windows7双系统启动顺序

安装好linux mint17后&#xff0c;进入mint系统&#xff0c;首先须要一个比較合适的中文输入法。 一、首先迎来的就是安装中文输入法了&#xff0c;之前听说搜狗为ubuntu kinly定制了输入法&#xff0c;所以就想安装搜狗输入法&#xff0c;可是搜索了多个教程并不起作用&#x…

Linux debian安装Typora教程

Typora简介 ​ Typora是一款轻便简洁的Markdown编辑器&#xff0c;它支持即时渲染技术&#xff0c;这也是与其他Markdown编辑器最显著的区别。即时渲染使得你写Markdown就像写Word文档一样流畅自如&#xff0c;不像其他编辑器有编辑栏和显示栏。 下载安装包 官网下载较慢&am…