GTK+的组合构件设计
GTK+概述
1 GTK+简介
GTK+(GIMP ToolKit,GIMP工具包)最初用于开发GIMP,是一个用于创建图形用户接口的图形库。在功能上类似微软的MFC,即为应用程序提供一套与平台无关的图形用户界面接口。GTK+是基于LGPL授权的,因此GTK+在开发开源软件或商业的非自由软件领域中都得到越来越广泛的使用。特别在嵌入式应用中,由于GTK+库小,且程序员可以根据自己需要对其进行裁剪,因此其占用资源少并能快速装入,所以基于GTK+开发的图形用户界面适合在内存受限的嵌入式设备上运行。
2 GTK+的库的调用关系
GTK+建立在GDK (GIMP Drawing Kit)的上层,基本上是将Xlib功能包装起来。它被称为GIMP toolkit是因为原来是写来开发GIMP,但现在被许多免费软体计划所使用。GTK基本上是物件导向应用软体程式设计界面(API)。虽然完全用C所写成,他是用classes及callback函数的观念所做出来的。还有另一个被称为glib的函数库被用到,该函数库包涵了一些标准X函数的替代函数及一些额外的处理链结表的函数,等等。这些替代函数是用来增加GTK的可移植性的,因为有些函数需要用到非标准的功能,诸如g_strerror()。有些则包含一些libc版本的加强的功能,诸如g_malloc有加强的除错功能。
GTK+是在Ddk的基础上创建的,其软件层次结构如图1所示。Glib是Linux系统下最常用的轻量级的C语言函数库,它提供了C常用的数据结构定义、处理函数、宏、可移植的封装和一些运行机能。Xlib是用来控制显示的底层图形函数库。Gdk则是对Xlib的封装。
图1即为GTK+软件结构层次图。
组合构件的定义及其设计难点分析
1 组合构件的定义
图1 GTK+软件结构层次图
在GTK+图形库中,我们将窗口、按钮、框架、树等图形界面元素称为构件。构件具有面向对象的特征,其具体结构由GTK+库所定义,这对使用构件的程序员来说是透明的。GTK+库提供了一套完善的构件,供程序员创建出丰富的图形界面。同时,程序员也可方便的创建自定义构件。
组合构件是构件的一种,它将多个构件组合起来成为一个新的构件,它不是单纯的将多个构件组合,也不是单纯的从某个控件继承下来的子控件,它有每个成员构件所没有的新功能。它是为了配合设计的需要,将每个成员构件组合起来形成一个具有新功能,新接口,实现新功能的构件。但是严格意义上讲它不能称之为全新的构件。
2 组合构件的设计难点分析
自定义组合构件的设计首先需要对GTK+自定义构件的设计非常熟悉,对GTK+构件的设计风格和继承关系很了解,并且能掌握对各个库的相应关系。组合构件它不是单纯从某个构件继承下来的,只是组合任何想要组合的构件来实现某项功能。因此必须考虑该组合构件的父类问题。
组合构件也跟构件库里面的构件一样,它也可能要接收信号并做出相应的处理。因此挂接信号也是设计需要考虑的问题。
作为一个构件,组合构件也应有自己的风格,由于组合构件是多个构件的组合,每个构件又有其不同的风格,如何确定当前构件的风格也是设计的难点。
组合构件的设计思想及其实现
1 组合构件的设计思想
通俗的讲,GTK+的构件库是基于C语言的,它不具有面向对象的特性,然而GTK+的确又是面向对象的,那是因为它用C语言来实现了C++编译器的功能。因此它同样具有继承的特性,它的代码风格也延续了面向对象的设计风格。在GTK+库中,直接继承自GtkObject对象的构件主要是 GtkWidget,它几乎是所有可视构件的共同祖先,大多数构件共有的属性都包括在其中。与其他GUI开发工具不同的是,我们不用直接创建 GtkObject或GtkWidget对象,而是用定义对象的实例结构和类结构的方式来定义对象,然后再通过类型注册来实现对象。当前笔者就根据组合构件的特点,直接从GtkObject继承。它与GtkWidget是一种并行关系。和其他构件一样,它也有相应的宏定义,来进行各种强制转换和类型获取。
任何一个构件都有其创建对象函数,组合构件也是一样,在对象中定义各个成员构件,在创建对象时将其一一创建,并根据需要对其各个构件来进行属性设定,最后返回的是组合构件对象本身。关于信号的设定也是和其他构件的方法一样,在类的结构体中定义信号,并在类的初始化中对信号进行定义。
组合构件的接口设计应可以根据当前总体设计的需要,而不是像一般构件一样完全的独立出来,它具有自己的特色,并不需要刻意遵守一般构件的要求。这也是组合构件的灵活性所在。
GTK+允许用户通过rc文件来定制应用程序的主题风格,即设置构件颜色、字号大小,并为构件添加背景图标等。而对于组合构件而言,由于其为多个构件的组合,每个构件都有其相应的风格设计,因此严格的讲它本身是不具有风格设计的,所谓组合构件的风格设计,就是对各个构件进行风格设计,并将其风格设定封装在一个函数里,对外只提供一个接口。对于组合构件,如果不进行风格设计,它将沿用整个图形界面的风格设计。
2自定义组合构件在任意波形发生器图形界面中的实现
笔者参与开发的任意波形发生器以linux作为操作系统平台,以320×240的彩色液晶为显示器,以精简版的X Windows作为图形用户界面系统,以GTK+库为图形编程库。下面就是笔者设计的任意波形发生器的整个图形界面,在图形界面中可以看到下面有波形显示和坐标值显示。笔者利用组合构件的设计思想来设计该图形界面的波形显示部分,通常情况下组合构件的设计是要符合当前总体设计的某项要求,因此组合构件有可能只是为了实现某项实际的功能而具体设计的一个构件。在任意波形发生器的设计中,笔者将下面的波形显示部分设计为一个组合构件,简单地称之为 awgwavegraph,若将其命名为gtkwavegraph是不合理的,因为它仅仅是为了实现任意波形发生器的图形界面而设计的一种多构件组合,而不是一个严格意义上的全新构件。在设计awgwavegraph时考虑到构件本身只是对某个信号进行响应,而不需要对信号进行获取,因此该组合构件并没有设计获取信号。所谓的响应,只是需要对坐标进行更新,根据此项需求,笔者提供了一个更新坐标的函数,接口仅仅是组合构件本身。图2即为任意波形发生器图形界面。
- MEMS增势喜人,组合传感器最流行(11-05)
- 凌力尔特推出一款准确和简单的延迟构件(08-25)
- 面向无线传感网络的构件化开发方法(07-01)