李国玲
摘 要:GTK+是一套跨多种平台的图形工具包,它提供了多种界面库元素供用户调用。但是,已有的界面库元素仅能保证基础的界面应用程序开发,当用户需要特定功能的界面库元素时,自定义控件的设计和使用就显得尤为重要。结合工作实践,对GTK+自定义控件的设计和使用进行了总结,以期为对GTK+感兴趣的爱好者们提供参考。
关键词:GTK+;界面库;自定义控件;工具包
中图分类号:TP311.52 文献标识码:A DOI:10.15913/j.cnki.kjycx.2015.15.115
文章编号:2095-6835(2015)15-0115-02
2013年的凌镜门事件把国家信息安全推到了风口浪尖,随着互联网的飞速发展,全球信息化的不断加速,信息安全也越来越受到人们的重视。国外软硬件产品藏有后门的消息此起彼伏,国内市场对于国产软硬件的需求愈发强烈。仅仅支持Windows操作系统平台的软件产品已经不能满足市场需求,跨平台的产品越来越受到人们的欢迎。GTK+是一套跨多种平台的图形工具包,能开发出满足跨平台要求的界面应用程序。GTK+工具包自带的界面库元素只能满足最基本的应用程序要求,要开发出更高级的界面应用程序,需要满足特定功能要求的自定义界面库控件。
1 GTK+简介
GTK(GIMP TookKit)是一套跨多种平台的图形工具包,是按照LGPL许可协议发布的。虽然最初是为GIMP而写的,但时至今日早已发展为一个功能强大、设计灵活的通用图形库,特别是被GNOME选中,使得GTK+被广泛应用,成为Linux下开发图形界面应用程序的主流开发工具之一。GTK+是一套开放源码的自由软件,这一点保证了它的信息安全性。
2 GTK+自定义控件设计和使用
当已有的界面库元素不能很好地满足开发者要求时,需要考虑编写自定义GTK+界面控件。
首先,分析该自定义控件需要满足的功能,定义头文件和实现文件。以自定义面板TestPanel为例,假设存在一个自定义面板,其中包含两个按钮button1和button2。另外给TestPanel定义一个回调函数pressed,应用程序绑定此回调函数。当点击button1或者button2时,都触发此回调函数。这就是TestPanel的功能定义。
参考gtkbutton的源码,我们应该定义TestPanel.h、TestPanel.c、TestPanelPrivate.h这三个文件。由于TestPanelPrivate.h文件只包含一个控件信息结构体,因此可考虑把TestPanelPrivate.h文件的内容合并到TestPanel.h中。在TestPanel.h中就包含TestPanel、TestPanelClass、private_data这三个结构体的定义,如图1所示。
TestPanel中的GtkVBox是该自定义控件的父控件,表示该自定义控件是基于工具包中的VBox之上的。Private_data参数就是结构体private_data对象,此处用指针表示。对应的TestPanelClass中包含一个GtkVBoxClass对象和pressed回调函数的声明。
然后从自定义控件的创建函数开始逐步分析实现过程。在创建函数TestPanel_new中,调用GTK+的相关方法获取自定义控件的类型信息,返回GtkType的对象。在获取类型信息的同时,调用了testPanel_class_init的初始化方法。根据这个GtkType对象,创建一个自定义控件的GtkWidget对象。接着初始化该自定义控件,包括在控件上添加两个按钮,并绑定按钮的点击事件。
接下来要定义回调函数。在自定义控件的实现文件中定义一个静态数组,为static guint testPanel??? signals[LAST SIGNAL]={0};,用来存储所有的回调命令。然后在testPanel_class_init方法中初始化回调命令,如图2所示,其中,object_class是把参数TestPanelClass*klass强转成GtkObjectClass*。
图2 初始化回调命令程序
接着定义在自定义控件内部何时触发此回调函数,调用gtk_signal_emit函数即可触发。在本例中,在button1和button2的clicked事件中触发pressed回调函数,程序为gtk_signal_emit(GTK_OBJECT(panel),testPanel_signals[PRESSED]);
最后,实现完自定义控件后,应用程序就像和使用基础类库的基本界面元素一样使用自定义控件。如图3所示,调用new方法来构造对象,调用gtk_signal_connect方法绑定回调函数,调用gtk_container_add把它添加到其他的GTK容器中。
图3 自定义控件使用程序
3 结束语
GTK+是在Linux环境下一套非常实用的工具界面库。同时,它也是一套完全开源的自由软件,对源码的研究有助于界面应用程序的开发,也能帮助我们更好地理解GTK+的设计思想和实现方法。参考源码实现,开发者们可以自定义一些适用于界面应用程序的界面控件。在实现自定义控件的过程中,可以按照自己的设计思想来实现,不需要照本宣科。当然,这需要我们在实践当中不断探索和学习。
参考文献
[1]战晓苏.Gtk+程序设计[M].北京:清华大学出版社,2002.
[2]博韦.深入理解LINUX内核[M].陈莉群,冯锐,牛欣源,译.北京:中国电力出版社,2008.
〔编辑:王霞〕