在编写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绘图相关推荐

  1. VC中的双缓冲绘图技术

    之前在做图形绘制的时候,发现在拖动图形时候,会出现闪烁的情况,后来就上网找了一下双缓冲绘图,本文非原创,只是想保存下来,以后要用的时候不用再到处去搜,也希望能帮助有这方面困惑的朋友 原文来自http: ...

  2. Qt组件中的双缓冲无闪烁绘图

    双缓冲绘图 在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOnS ...

  3. VC绘图中的双缓冲技术

    VC绘图中的双缓冲技术 转自:VC 绘图,使用双缓冲技术实现 ********************所有的GDI绘图函数使用的都是逻辑坐标(逻辑范围)******************* **** ...

  4. C++零食:WTL中使用双缓冲避免闪烁

    双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板.首先我们在内存环境中建立一个"虚拟"的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制 ...

  5. 【Qt】2D绘图之双缓冲绘图

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制矩形 04. 双缓冲绘图 05. 附录 01. 概述 所谓的双缓冲绘图的概念.双缓冲(double-buffers)绘 ...

  6. [Qt教程] 第18篇 2D绘图(八)双缓冲绘图

    [Qt教程] 第18篇 2D绘图(八)双缓冲绘图 楼主  发表于 2013-5-2 22:07:23 | 查看: 789| 回复: 1 双缓冲绘图 版权声明 该文章原创于Qter开源社区(www.qt ...

  7. MFC绘制动态曲线,用双缓冲绘图技术防闪烁

    转载自:ZHY_ongu的博客:MFC绘制动态曲线,用双缓冲绘图技术防闪烁 先上效果图    随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新. 一.如何绘制动态曲线. 所谓动画,都是一帧一帧 ...

  8. c#双缓冲绘图(不闪烁的几种方法)

    C#绘图双缓冲 C#双缓冲解释: 简单说就是当我们在进行画图操作时,系统并不是直接把内容呈现到屏幕上,而是先在内存中保存,然后一次性把结果输出来,如果没用双缓冲的话,你会发现在画图过程中屏幕会闪的很厉 ...

  9. android双缓冲绘图技术分析

    转载请说明出处:http://www.jianshu.com/p/efc0bebfd22e 双缓冲.多缓冲技术在计算机科学中其实是一个广义的概念,不过其本质上的意思都是差不多的.今天我们就来讲一讲双缓 ...

最新文章

  1. 通过Excel生成批量SQL语句
  2. 简明深度学习方法概述 Deep Learning:Methods and Application
  3. 初学Java Web(8)——过滤器和监听器
  4. RabbitMQ学习(1):安装
  5. springboot 添加允许跨域_springboot设置cors跨域请求的两种方式
  6. Sharepoint client model 中出现Cannot invoke HTTP DAV request. There is a pending query 的解决办法...
  7. maven零基础从配置到运行helloworld(java maven helloworld)
  8. 使用RxJava和Completable并行执行阻止任务
  9. React Native windows环境安装遇到的坑
  10. 宝塔面板备份网站方法
  11. 这两年计算机高职考试坎坷路
  12. [原创]markdown语法学习(commonmark)
  13. 2017全国省市区县 json数据
  14. 图像复原技术及其MATLAB实现
  15. 用html制作发货单,使用excel制作发货单和送货单模板教程
  16. wordpres报错sfile_exists() [function.file-exists]: File name is longer than the maximum allowed
  17. 对draw.io第一次加载慢的探讨
  18. jw player 6 断点续播 seek()
  19. 笔记本跑python 90多度会坏吗_cpu温度多高才安全?90度会烧坏吗??
  20. 嵌入式软件面试问题总结

热门文章

  1. windows2003 mstsc 远端连线,减少可会话数目 ,同一用户只允许一个会话
  2. 做项目时用到的linux知识
  3. BIOS MCSDK 2.0 User Guide 示例学习
  4. Loss曲线震荡分析
  5. MySQL安装后第一次修改密码
  6. python家的杨辉三角
  7. 02-vue过滤器和键盘修饰符
  8. 使用 qrcodejs 生成二维码的几个问题
  9. Spring Cloud云服务架构 - common-service 项目构建过程
  10. JAVA基础中关于double进制问题的解析