APP下载

基于GDI+的.NET动态绘图技术的研究与应用①

2012-09-27夏克付张承云

关键词:图形图像窗体绘图

夏克付, 张承云

(1.安徽电子信息职业技术学院,安徽 蚌埠 233030;2.安徽科大讯飞信息科技股份有限公司,安徽 合肥 230088)

动态绘图是指使用键盘、鼠标、手写板等计算机输入设备动态绘制图形或图像.动态绘图技术是图形图像处理领域中的一项非常重要的技术.GDI+是图形设备接口GDI(graphics device interface)的改进版本,提供了二维矢量图形的显示、图像处理和版式处理等功能.在.NET中,GDI+提供了一系列图形图像处理相关的类与接口,使用这些类与接口可以很轻松地实现动态绘图功能.但这种动态绘图技术在绘图过程中存在图形连续绘制、闪烁和消失等问题,严重影响了图形绘制的效果与效率.因此,怎样研究一种基于GDI+的高效的动态绘图技术,已成为当前亟待解决的问题.

1 动态绘图技术存在的问题

动态绘图过程一般是在按下鼠标后确定所绘图形的起始点,移动鼠标时绘制图形,松开鼠标后完成绘图.因此,在实现动态绘图功能时一般需要使用鼠标的按下(MouseDown)、移动(MouseMove)和松开(MouseUp)事件.在使用GDI+提供的动态绘图技术进行动态绘图的过程中,容易出现以下问题.

1.1 图形连续绘制

图1是使用GDI+的动态绘图技术在.NET窗体上动态绘制直线的效果.从图中可以看出,鼠标每移动一次就会绘制一条直线,这样从按下鼠标到松开鼠标的过程中,绘制的就不是所期望的一条直线,而是“无数条”直线.

要解决这个问题,可以在MouseMove事件中加上一条图形清除语句,使得在每次绘制直线时清除之前所绘制的内容.但这样做又有了新的问题,也就是永远只能绘制一条直线.

图1 动态绘制直线

1.2 图形闪烁现象

使用GDI+的动态绘图技术在动态绘图时容易出现闪烁现象,特别是对图像进行动态处理时,只要移动鼠标,图像闪烁现象就非常明显.

1.3 图形消失现象

使用GDI+的动态绘图技术所绘制的图形,被其他程序界面覆盖恢复后或程序最小化恢复后,图形消失.要解决此问题,可以在窗体或控件的Paint事件中对消失的图形进行重绘,但这样做比较麻烦.

2 动态绘图技术的改进措施

要解决动态绘图过程中所出现的问题,需要引入“图层”技术.在此引入三个“图层”,依次分别是:永久层、临时层和显示层.其中永久层用于永久存储每次动态绘制完成的图形,临时层用于临时存储鼠标一次移动时所绘制的图形,显示层用于在窗体或控件中显示临时层中所绘制的图形.各图层及其关系如图2所示.

图2 动态绘图图层

图2中的箭头表示在动态绘图过程中该层内容的来源.永久层表示最终需要绘制的图形,在开始绘图之前,该层内容要么为空,要么来源于需要绘制的图形或图像,在绘图过程中,该层内容来源于显示层;临时层表示鼠标本次移动所绘制的图形,其内容来源于永久层,其生命周期从移动鼠标开始到松开鼠标结束;显示层表示当前需要显示的图形,其内容来源于临时层.

在.NET中,永久层和临时层一般使用GDI+提供的Bitmap对象来实现,显示层一般使用窗体或控件的Image类型的属性来实现.在绘图过程中,临时层和显示层的内容在MouseMove事件中完成,永久层的内容在MouseUp事件中完成.主要实现过程如下:

(1)创建一个全局的Bitmap对象(用于实现永久层),大小与窗体或控件中绘图区域大小一致.

Bitmap bmpForever=new Bitmap(this.Width,this.Height);

(2)在MouseMove事件中创建一个上述全局对象的副本(用于实现临时层).

Bitmap bmpTemp = (Bitmap)bmpForever.Clone();

(3)以上述副本为画布来动态绘制图形(如直线).

Graphics g = Graphics.FromImage(bmp-Temp);

g.DrawLine(pen,pt,e.Location);

(4)在窗体或控件中即时显示上述副本中所绘制的图形(用于实现显示层).

this.BackgroundImage=bmpTemp;

(5)在MouseUp事件中将本次绘制完成的图形存入上述全局对象.

Graphics g=Graphics.FromImage(bmpForever);

g.DrawImage(this.BackgroundImage,0,0);

在.NET中使用C#语言按照以上改进方法在窗体上动态绘制直线的效果如图3所示.从图中可以看出,可以在窗体的任意位置使用鼠标绘制直线,解决了之前动态绘图过程中所出现的问题.

图3 动态绘制直线(改进后)

图4 动态绘图技术应用

3 动态绘图技术的应用

图5 数据测量类

动态绘图技术的应用非常广泛,只要有电脑、手机等电子产品存在的地方,基本上都会用到动态绘图技术.例如生活中最常见的手写输入法、幻灯片中的动态批注等都使用了动态绘图技术.在医院使用的各种软件系统中,动态绘图技术也随处可见.下面以动态测量患者CT图中的相关数据为例,介绍动态绘图技术的应用(如图4所示).

图4是对某位患者脑部CT图进行相关数据测量.从图中可知,数据测量功能主要包括动态绘制图形、根据CT图的显示大小与实际大小的比例实时测量数据,以及当前所测量数据的解释说明.主要实现过程如下:

(1)设计数据测量类

根据引入“图层”后的动态绘图技术,以及对CT图进行数据测量的功能需求,设计的数据测量类如图5所示.

数据测量类(DataMeasurement)中共包括3个属性和6个方法,这些属性与方法的具体功能描述如表1所示.

表1 DataMeasurement类的成员功能描述

(2)创建应用程序,实现数据测量类

在Visual Studio 2008中新建一个Windows应用程序,设计图4所示窗体,并实现数据测量类.而后使用该类实现图4所示的数据测量功能.

4 结束语

GDI+提供了强大的图形图像处理功能,在.NET中使用GDI+几乎可以完成所有与图形图像相关的操作.动态绘图技术是使用GDI+进行动态图形绘制的技术.通过在多个项目开发中的实践证明,使用引入“图层”后的动态绘图技术,不仅解决了绘图过程中存在的图形连续绘制问题,还解决了使用GDI+进行图形图像处理时容易出现的闪烁现象,以及图形被覆盖或最小化后消失的现象,大大提高了程序的运行效率.

[1]谢超,陈毓芬.基于GDI+的电子地图符号库的改进[J].测绘工程,2006,15(2):45 -49.

[2]闫宇晗,常鑫.在C#中用GDI+实现图像动态显示[J].计算机技术与发展,2006,16(12):117—118.

[3]王磊.基于GDI+的图形图像处理[J].苏州市职业大学学报,2008,19(4):7 -9.

[4]Christian Nagel,Bill Evjen.C#高级编程(第 6 版)[M].北京:清华大学出版社,2009.

[5]唐政,房大伟.C#项目开发全程实录[M].北京:清华大学出版社,2010.

猜你喜欢

图形图像窗体绘图
来自河流的你
“禾下乘凉图”绘图人
Photoshop图形图像处理线上线下混合式教学模式探究
试谈Access 2007数据库在林业档案管理中的应用
垂涎三尺
浅析计算机图形图像处理技术偏技术
网页设计与图形图像处理技术探析
面向工艺设计的图形图像处理系统研究与实现
Surfer和ArcView结合在气象绘图中的应用
巧设WPS窗体控件让表格填写更规范