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、字体样式

        FontFontData 类用来控制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、图像

        ImageImageDataImageLoader 是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 ();
      }
   });
 
附:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值