GTK(GIMP Toolkit)是一个图形用户编程的接口器械。它注册完全免费,所以用来拓荒自由软件或商业软件都不需要破费什么。此刻许多Linux集成系统都已经将GTK1.2版一个比GTK更好的C++编译情况。
此刻已经拓荒出来GTK的增强版GTK+。GTK+是将GTK,GDK,GLIB集成在一路的拓荒包,可以工作在许多近似于UNIX的系统上,没有GTK的平台限制。
1.GTK的新闻处置责罚机制
下面我们先看一个根底的例子,该例子发生一个200×200像素的窗口。它不能自己退出,只能经过过程shell来杀物化过程(挪用kill饬令)。
/*例子 base.c */
#include <gtk/gtk.h>
int main( int argc,char *argv[ ] ){
GtkWidget *window;
gtk_init (&argc, &argv); /* 初始化显示情况 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* 建立一个新的窗口*/
gtk_widget_show (window); /*显示窗口*/
gtk_main (); /*进入寝息状况,守候事宜激活*/
return(0);
}
从上面的法式可以看出,GTK是一个事宜驱动器械包,当它运行到gtk_main()函数时会自动寝息,直到有事宜发生,节制权让渡给响应的函数挪用,在该函数中可以用尺度C写出响应的事物逻辑。这与windows 上的法式处置责罚是一样的。
对窗口器械上发生的事宜(如按下鼠标,激活键盘等),GTK也有响应的新闻旗子记号发生。这时就需要法式员建立一个旗子记号处置责罚器来捕捉该旗子记号,并申报GTK法式事宜发生后挪用哪个回调函数。旗子记号处置责罚器的建立函数界说如下:
gint gtk_signal_connect( GtkObject *object, gchar *name,GtkSignalFunc callback_func, gpointer func_data );
返回值是一个区分统一器械中的事宜与分歧回调函数的联系关系标签。如准许以做到一个器械的一个旗子记号就有尽情多个回调函数,而且每一个都邑按照声明的挨次执行。函数挪用的第一个参数是发生旗子记号的widget组件(即按钮等窗口构件),而name则是但愿捕捉的旗子记号或事宜的名称,callback_func则是事宜发生后所挪用的回调函数名称,而第四个参数func_data则是传递给回调函数的参数。
回调函数要界说在主法式的前面,它们的日常花样都如下所示:
void callback_func( GtkWidget *widget, gpointer func_data );
挪用下面这个方式将准许你将回调函数与事宜的联系关系断开:
void gtk_signal_disconnect( GtkObject *object, gint id );
该函数的第二个参数就是上述gtk_signal_connect()函数的返回值,即联系关系标签。第一个参数指向了去除联系关系的器械名称。如准许以做到断开事宜与回调函数的联系关系,使得事宜发生后,不会挪用相关的回调函数。
结构花样
2.1打包盒子
对GTK显示花样的节制是凡是经过过程打包盒子来完成的。widget组件打包可以接纳两种体式格局,水平盒子和垂直盒子。若将widget组件打包进平行盒子,组件就被依次水平的插入窗口;假如垂直盒子,则组件罗列是垂直的。发生新的水平盒子的函数为
GtkWidget *gtk_hbox_new (gint homogeneous, gint spacing);
参数homogeneous是用来节制是否盒子中的每个组件都有同样的巨细(例如水平盒子中的控件有同样的宽度,垂直盒子中的控件有同样的高度)。Spacing参数是组件之间的距离。
垂直盒子的建立函数是gtk_vbox_new(),界说与水平盒子整齐。
gtk_box_pack_start()和gtk_box_pack_end()函数是用来将打包器械放入这些盒子中的。
void gtk_box_pack_start( GtkBox *box, GtkWidget *child,gint expand, gint fill, gint padding );
第一个参数是你将组件打进去的盒子指针,第二个参数是你将要打进去的组件指针。Expand参数是用来节制是否准许组件扩展至分配给盒子空间的巨细(选TRUE),照样盒子的巨细缩短到组件那么年夜(选FALSE)。函数中的fill参数是用来节制是否将多余的空间分配给组件,即将组件扩展到盒子的巨细(选TRUE),概略多余的空间不变,保留作为盒子和打包组件间的距离。该参数只有在expand参数取TRUE时才有用。Padding参数是指组件四周与盒子的距离巨细。
注重fill取FALSE值,expand取TRUE值时与expand取FALSE值,fill值无效的区别。前者的盒子仍是正本建立盒子时指定的巨细,尔后者的盒子已经缩小到打包组件的巨细了。
gtk_box_pack_end()函数的参数与上面描摹的整齐。只是罗列挨次离别是从下到上
,从右到左。
末尾将全数的盒子或组件打包到一个年夜盒子中,用gtk_container_add()函数将盒子插手窗口即可。
2.2表格打包
我们可以发生一个表格,将widget组件一一放入。Widget组件将占有全数分配给它的空间。建立表格是用下面的函数:
GtkWidget *gtk_table_new( gint rows, gint columns,gint homogeneous );
第一个参数,显而易见,是表格的行数。后背的参数则是表格的列数。homogeneous参数则是用来放置表格距离巨细。若是它取TRUE,则表格中每个小格的巨细用表格中最年夜组件的巨细来设置的,全数的小格巨细都是一样的。若是homogeneous参数取FALSE的,每个小格的巨细都用同业中最高组件的高度,同列中最宽组件的宽度。
将一个widget组件放入一个表格,用下面的函数:
void gtk_table_attach( GtkTable *table, GtkWidget *child, gint left_attach,
gint right_attach, gint top_attach, gint bottom_attach,
gint xoptions, gint yoptions, gint xpadding, gint ypadding );
left_attach参数和right_attach参数将指出在哪儿放置组件,以及用了若干盒子。若是你想在两行两列的表格中的右下小格中插手一个按钮,而且想让按钮充溢谁人小格,则参数可以选择left_attach = 1, right_attach = 2, top_attach = 1, bottom_attach = 2。其实left_attach也就是组件所在小格的左边框是表格的第几条边数,其余依此类推。
参数xoptions和yoptions是用来确定打包选项的,可以用OR来选择多个选项。
调节器
GTK有许多组件可以用鼠标或键盘来调整,例如局限组件(Range Widget)。还有一些组件在整个数据区域的一部门是可调整的,例如文本组件(Text Widget)和视口组件(Viewport Widget)。
很光鲜明显,法式是要能够对可调整组件所发生的转变进行处置责罚。一种治理设施是让可调整组件在释放自己的旗子记号时,将调整数据值传递旗子记号处置责罚器。概略用其余一种治理方式将调整数据值放入一个数据结构,由法式接见该结构来获得改变的参数值。有时候你概略需要将几个可调整组件的调节相联系关系,调整一个也会导致另一个的转变。最光鲜明显的例子就是动弹条与文本编纂框组件的处置责罚。若是这些相联系关系的组件离别有自己处置责罚调整数据的方式,则法式员必需自己写一个旗子记号处置责罚器,将一个组件的调整数据转换成另一个组件的调整数据,并挪用调整设置函数将该值设置进去。
GTK挪用了调节器成功的治理了这个题目问题。调节器不是组件,而是存储和传递调整数据的结构。最典型的调整器应用是存储培植参数和局限组件的值。分歧的是调整器也是从器械(Object)继续而来的,它有许多分歧于数据结构的特征。最主要的是,它也会释放旗子记号,而且这些旗子记号不只可以被法式捕捉来响应用户的调整和编纂,还可以在可调整组件中透明的流传调整数据。
日常调节器会建立组件时自动建立。例如让文本组件和动弹条组件用统一个调节器如下所示:
text = gtk_text_new (NULL, NULL);
/* 将刚建立的调节器用于垂直动弹条 */
vscrollbar = gtk_vscrollbar_new (GTK_TEXT(text)->vadj);
调节器是从器械Object继续下来的。所以它与其余的组件器械一样,能够发生旗子记号。当好几个组件共享一个调节器时,它们都邑和一个旗子记号处置责罚器相联系关系。这个旗子记号处置责罚器是用来处置责罚“value_changed”旗子记号的,跟法式中处置责罚旗子记号是一样。下面是在GtkAdjustmentClass结构中该旗子记号的界说:
void (* value_changed) (GtkAdjustment *adjustment);
分歧的可调整组件都用一个调节器时,任何一个组件发生调整转变都邑发生该旗子记号。有两种情形会导致这个现象的发生。第一种情形是用户在用鼠标或键盘调整该组件(例如拉动弹条),概略直接在法式顶用gtk_adjustment_set_value()函数来改变调节器中的value值。
当调节器的upper参数和lower参数被从头培植时,就象用户需要给一个文本编纂框插手了更多的文本后,调节器就会释放出“changed”旗子记号。它的界说如下:
void (* changed) (GtkAdjustment *adjustment);
局限组件将该旗子记号与一个旗子记号处置责罚器相联系关系,并随时在面板上反映参数的转变。举个例子,动弹条中滑动键的巨细与调节器中upper,lower值之差正好成反比。一旦前者有任何改变,面板上的显示也会响应发生转变。
不需要在法式中将一个旗子记号处置责罚器与该旗子记号相联系关系,实足都是GTK完成的。若是你直接设置了调节器的这些参数,则需要在法式中挪用下面的语句来释放旗子记号:
gtk_signal_emit_by_name (GTK_OBJECT