首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

SWT Part 七 —— Graphics (绘图)

2012-12-27 
SWT Part 7 —— Graphics (绘图)Graphics?? ? ? ?SWT 提供了一个图形引擎,在小部件(widgets)中绘制图形和显

SWT Part 7 —— Graphics (绘图)

Graphics

?? ? ? ?SWT 提供了一个图形引擎,在小部件(widgets)中绘制图形和显示图像。SWT中小部件已经我们提供了绘制图片、文本、和其他数据的功能,所以不需要图形接口编程已经可以实现足够漂亮的功能。但是,如果需要在应用程序中显示自定制图形,或者需要实现一个自定制的小部件,就需要理解SWT 中的基本的绘制工具对象。

?

1、GC

?? ? ? ?图像上下文(graphics context),即GC, 是SWT 图形功能的核心类,它的API提供了SWT所有的绘图能力。

?

?? ? ? ?GC可以用来在控件(大多数情况)、图片、显示器(display)上绘制图形,或是为打印机提供绘图功能。当在控件上绘图时,使用控件的 panit event 提供的 GC 来实现,如果是在图片、显示器、或打印机上绘图,必须创建一个 GC,并在使用过后销毁它。

?

?? ? ? ?一旦获得一个 GC 对象,就可以设置它的属性,例如颜色、线条宽度和字体样式,来控制GC 所绘制的图形的外观。

GC API 参考手册描述了完整的SWT图形绘制功能。

?

2、字体样式

?? ? ? ?Font 和 FontData 类用来控制SWT中的字体样式。

?

?? ? ? ?FontData 描述字体样式的特征,可以通过设定字体样式的名字、样式和大小来创建一个FontData对象。FontData 包含查询这些属性的API。因为FontData没有占用任何操作系统资源,所以不需要销毁它。

?

?? ? ? ?Font类是绘图API中实际表示字体样式的图形对象,可以通过提供一个Display 对象和FontData对象来创建一个Font 对象,可以在Font对象中获取它的具体的FontData数据。Font对象必须在用完后明确地销毁。

?

3、颜色

?? ? ? ?颜色类似于字体,你可以通过提供RGB数据值来创建一个具有所希望颜色的?Color 对象,在使用完毕后必须销毁Color 对象。使用Display的方法?getSystemColor(int),可以获得为操作系统平台预先定义系统颜色对象,使用这种方式获得颜色对象不需要释放。

?? ? ??SWT color model?这篇文章详细地讨论了有关颜色的问题。

?

4、图像

?? ? ? ?Image,ImageData 和 ImageLoader 是SWT中操作图形的类。

?

?? ? ? ?ImageData 描述图像中的实际的像素,使用?PaletteData 类描述其中具体的颜色值,ImageData 是设备和平台无关的图像的描述数据。ImageLoader?能够以不同文件格式加载和保存?ImageData 对象,SWT目前支持加载和保存图像格式包括BMP(Windows 位图)、JPEG、GIF和PNG。

?

Image 类是绘图API中实际表示图像的图形对象,可以用下面几种方式创建Image对象:

使用 ImageData初始化图像的内容拷贝一个已存在的图像从文件中加载一个图像不管以哪种方式创建Image对象,都要销毁它。
5、图像对象生命周期?? ? ? ?SWT 中用来绘图的大多数图像对象使用了底层系统资源,必须明确的释放资源。之前讨论的关于控件的规则在这里也是使用的——如果你使用构造方法创建了一个SWT的图像对象,就必须在使用过后销毁它,如果是从别的地方获得的SWT图形对象,就不需要销毁。
5.1、创建?? ? ? ?图形对象,例如图形上下文GC、字体样式、颜色和图像,被创建时就被分配了操作系统的资源,使用图像对象的意图决定了创建它们的时刻。
?? ? ? ?对于在应用程序中大量使用的图形对象,可以在创建图像部件的时候创建它们,一般采用这种方式创建颜色和字体。其他情况下,在运行时常见图形对象更为合适,例如,可以在处理控件事件的代码中创建一个图形上下文GC,来执行一些运行。
?? ? ? ?如果创建自定制的控件,如果是经常使用到图像对象,一般可以在构造方法中创建它们,如果不是经常用到,或者是依赖于一些属性数据,可以在运行时创建。
5.2、绘制?? ? ? ?创建图形对象之后,就可以开始绘制了,有一个原则很重要:必须在一个绘图监听器(paint listener)中执行绘制操作。在实现自定制控件时,只有在很少的情况下会在其他的事件中执行绘制的操作,但是,一般不鼓励使用这种方式。如果需要在处理其他事件的时候绘图,应该优先尝试使用redraw()方法,这个方法会产生一个新的绘图事件。在panit方法之外绘图会让平台上的优化措施失效,引发一些bug,因为在事件队列中已经存在着等待绘图的事件。
?? ? ? 当收到一个绘制事件就可以使用预先配置的GC 在控件中绘制图形了。不要销毁这个 GC,应为你没有创建它。
?? ? ? 在处理绘图事件时,必须沙鸥先创建任何其他的图形对象。下面的代码片段展示了具体的过程,在创建小部件时颜色对象 red 已经创建了,所以这里可以直接使用:
   shell.addPaintListener (new PaintListener () {      public void paintControl (PaintEvent event) {         GC gc = event.gc;         gc.setForeground (red);         Rectangle rect = event.widget.getClientArea ();         gc.drawRectangle (rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);         gc.drawString (resHello.getString("Hello_world"), rect.x + 20, rect.y + 20);      }   });

5.3、销毁?? ? ? ?每一个直接创建的图形对象在使用结束以后都必须销毁。
?? ? ? ?什么时刻销毁图形对象取决于它们是在什么时候创建的。如果是在创建小部件的时候创建的,一般是在小部件上添加一个销毁事件监听器,在小部件销毁的时候销毁图形对象。如果是在绘图的过程中创建,就应该在绘图结束的时候销毁它。
?? ? ? ?在下面的代码中,稍微改动了前面展示绘图监听器的代码,在这个例子中,是在绘图的过程中创建和销毁颜色对象red:
    shell.addPaintListener (new PaintListener () {      public void paintControl (PaintEvent event) {         GC gc = event.gc;         Color red = new Color (event.widget.getDisplay (), 0xFF, 0, 0);         gc.setForeground (red);         Rectangle rect = event.widget.getClientArea ();         gc.drawRectangle (rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20);         gc.drawString (resHello.getString ("Hello_world"), rect.x + 20, rect.y + 20);         red.dispose ();      }   });
?附:参考:http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.isv/guide/swt_graphics.htm

?

热点排行