你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 图形图象处理与游戏编程
在GDI+中利用双缓存技术实现橡皮筋效果(一)
 

摘 要 由于GDI+不提供XOR模式绘图,使得橡皮筋技术这种在交互式绘图软件中经常使用的构图方法实现产生困难。本文介绍一种采用双缓存技术解决该问题的方法,通过实例测试,该方法简单实用,效果良好。

关键词 GDI+;橡皮筋;双缓存

 

一、橡皮筋技术

橡皮筋技术是计算机图形系统经常使用的一种交互式构造技术,通过动态显示几何图形,最终确定几何图形的基本尺寸。例如构造直线段时,按下鼠标按键,得到线段的起点位置,当光标移动时,线段的终点也在移动,在屏幕上始终显示一条连结起点和终点的直线,松开按键,这条线段就确定下来了,整个绘制过程动态连续地表现出来,使图形绘制直观、准确。

 

二、GDI+

GDI+GDI的新版本,它在GDI的基础上添加了许多新特性,例如渐变画刷、基数样条曲线、持久路径对象、变形和矩阵对象、可伸缩区域、Alpha混合、多种图像格式支持等,为开发人员提供了处理二维矢量图形、文本、图像以及图形数据矩阵的一系列API接口。通过这些改进,使图形程序的开发更为方便,绘制出的图形效果更加美观。但GDI+也存在一些不足,例如在GDI+中不再支持XOR(异或)方式绘图,因此在GDI中可以简单实现的“橡皮筋”绘图效果在GDI+中显得有些困难,必须通过其他方式才能实现。经过研究,找到了一种通过缓存技术实现“橡皮筋”效果的方法。

 

三、双缓存技术

所谓双缓存,即先在内存中开辟一块虚拟画布,然后将所有需要绘制的图形先画在这块“虚拟画布”上,最后再一次性将整块画布画到真正的窗体上。由于图形的绘制都不是真正的调用显示系统来“画”,所以不会占用显示系统的开销,极大地提高了绘图效率,是计算机图形系统经常使用的解决屏幕刷新闪烁问题的方法。

 

四、双缓存技术实现橡皮筋效果

采用双缓存方法实现了GDI+模式绘图的橡皮筋效果,其开发思路为:

(1)       在内存中建立虚拟画布(缓存),保存已绘制好的图像。

(2)       当开始绘制新图形时,首先建立虚拟画布的副本,然后在此副本画布上进行绘制,最后再将绘制了新图形的副本画布内容更新到屏幕界面上,实现实时变化。

3  当判断图像绘制过程结束,则将图形绘制到后台虚拟画布上并更新到屏幕上完成绘图。绘制过程如图1所示。


五、绘图程序

下面通过一个绘图程序实例,说明在MFC中使用缓存技术实现“橡皮筋”效果的过程,该实例实现了直线、矩形、椭圆和曲线四种图形的绘制:

1)启动Visual Studio 2005,建立MFC单文档工程Dbuffer

2GDI+初始化,   在“stdafx.h”中添加如下代码:

#include <gdiplus.h>

#pragma comment(lib,"gdiplus.lib")

using namespace Gdiplus;

在应用程序类“CDBufferApp”中添加成员变量:

ULONG_PTR m_pGdiToken;

GdiplusStartupInput m_gdiplusStartupInput;

CDBufferApp::InitInstance()中添加下面的GDI+初始化函数:

GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);

添加虚函数CDBufferApp::ExitInstance()并将下面的语句添加到该函数中:

Gdiplus::GdiplusShutdown(m_pGdiToken);

3)编辑菜单及工具栏,建立绘制直线、矩形、椭圆和曲线的命令。

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089