Gdiplus中实现双Buffer绘图
在编写win32 GUI相关的程序的时候,最直接的方法是使用GDI API进行绘制操作。一般为了图形绘制过程中为避免绘制过程闪动,而多采用双Buffer的做法,具体是先在一个内存DC中线将图像绘制好,然后采用BitBlt函数将该内存DC中绘制好的图像贴到目标DC中(该目标DC即是待绘制窗口的DC)。在内存DC中绘图的时候,需先创建该DC,然后根据需要创建各种Pen,各种Brush,将Pen/Brush选进去,绘制完成之后,再将原来的Pen/Brush选回去,最后执行InvalidateRect函数使窗口中的指定区域无效,触发WM_PAINT消息,在响应WM_PAINT消息中,执行BitBlt函数。
该过程使用GDI函数形式的API,操作起来不是很方便,好在Windows给我们提供了一个更好的选择,那就是Gdiplus,在提供相同基本功能前提下,C++对象形式的API使用起来更加方便,而且还提供了常见的变换API,让相关的图形绘制操作变得更省心了。
这里仅介绍在Gdiplus过程中如何实现爱GDI中类似的双Buffer绘图功能,其核心实现是使用Graphics这个对象。先看其构造函数定义,如下
1 Graphics(hdc) 2 Graphics(hdc, hdevice) 3 Graphics(hwnd, icm) 4 Graphics(image)
从其构造函数可以看出,Graphics对象的绘制过程,可以在的DC上进行,可以在窗口上进行,也可以在一个Image对象上进行,形式非常的灵活,此处实现双Buffer绘制即是利用这一灵活性,另外对应还用到的还有Graphics对象的DrawImage方法,该方法可以将一个Image对象,绘制到构造函数所提供的上下文里头去。如此不难看出此处的双Buffer绘制的操作过程如下
1,新建一个Image对象,命名为men_image,该对象用于在内存中保存绘制结果
2,新建一个Graphics对象,命名为drawer,构造函数传入mem_image
3,使用drawer进行各项所需的绘制过程,结果保存到mem_image中
4,使用InvalidateRect函数是制定窗口中的区域无效,触发WM_PAINT消息
5,在响应WM_PAINT消息中,使用另外一个Graphics对象,该对象可以是一个临时对象(构造函数传入HDC),或持续存在的对象(构造函数传入HWND),然后利用Graphics::DrawImage,将mem_image对象显示到窗口中。
如此处理的话,实现了将绘制过层(drawer完成的)与显示过程(响应WM_PAINT过程)相分离,绘制过程不需关心显示过程,各自的功能内聚,降低了耦合,简化了各自内部的实现流程。
PS: 在VS2010中使用Gdiplus的代码,以下头文件必须放在文件首部,再引用其他头文件,否则编译不过,Faint!
#include <windows.h> #include <gdiplus.h>
转载于:https://www.cnblogs.com/lanyuliuyun/archive/2013/04/29/3050577.html
Gdiplus中实现双Buffer绘图相关推荐
- VC中的双缓冲绘图技术
之前在做图形绘制的时候,发现在拖动图形时候,会出现闪烁的情况,后来就上网找了一下双缓冲绘图,本文非原创,只是想保存下来,以后要用的时候不用再到处去搜,也希望能帮助有这方面困惑的朋友 原文来自http: ...
- Qt组件中的双缓冲无闪烁绘图
双缓冲绘图 在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOnS ...
- VC绘图中的双缓冲技术
VC绘图中的双缓冲技术 转自:VC 绘图,使用双缓冲技术实现 ********************所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)******************* **** ...
- C++零食:WTL中使用双缓冲避免闪烁
双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板.首先我们在内存环境中建立一个"虚拟"的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制 ...
- 【Qt】2D绘图之双缓冲绘图
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制矩形 04. 双缓冲绘图 05. 附录 01. 概述 所谓的双缓冲绘图的概念.双缓冲(double-buffers)绘 ...
- [Qt教程] 第18篇 2D绘图(八)双缓冲绘图
[Qt教程] 第18篇 2D绘图(八)双缓冲绘图 楼主 发表于 2013-5-2 22:07:23 | 查看: 789| 回复: 1 双缓冲绘图 版权声明 该文章原创于Qter开源社区(www.qt ...
- MFC绘制动态曲线,用双缓冲绘图技术防闪烁
转载自:ZHY_ongu的博客:MFC绘制动态曲线,用双缓冲绘图技术防闪烁 先上效果图 随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新. 一.如何绘制动态曲线. 所谓动画,都是一帧一帧 ...
- c#双缓冲绘图(不闪烁的几种方法)
C#绘图双缓冲 C#双缓冲解释: 简单说就是当我们在进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先在内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现在画图过程中屏幕会闪的很厉 ...
- android双缓冲绘图技术分析
转载请说明出处:http://www.jianshu.com/p/efc0bebfd22e 双缓冲.多缓冲技术在计算机科学中其实是一个广义的概念,不过其本质上的意思都是差不多的.今天我们就来讲一讲双缓 ...
最新文章
- 通过Excel生成批量SQL语句
- 简明深度学习方法概述 Deep Learning:Methods and Application
- 初学Java Web(8)——过滤器和监听器
- RabbitMQ学习(1):安装
- springboot 添加允许跨域_springboot设置cors跨域请求的两种方式
- Sharepoint client model 中出现Cannot invoke HTTP DAV request. There is a pending query 的解决办法...
- maven零基础从配置到运行helloworld(java maven helloworld)
- 使用RxJava和Completable并行执行阻止任务
- React Native windows环境安装遇到的坑
- 宝塔面板备份网站方法
- 这两年计算机高职考试坎坷路
- [原创]markdown语法学习(commonmark)
- 2017全国省市区县 json数据
- 图像复原技术及其MATLAB实现
- 用html制作发货单,使用excel制作发货单和送货单模板教程
- wordpres报错sfile_exists() [function.file-exists]: File name is longer than the maximum allowed
- 对draw.io第一次加载慢的探讨
- jw player 6 断点续播 seek()
- 笔记本跑python 90多度会坏吗_cpu温度多高才安全?90度会烧坏吗??
- 嵌入式软件面试问题总结