GTK+编程入门

作者 xinhe

 一、什么是GTK+ GTK+(GIMP ToolKit),即GIMP工具箱,最初是用来向GNU图像处理程序(即GIMP)的开发者提供用户界面功能,简单的说,GTK+就是用于图形界面开发的API库,是由最初简单的GTK扩展而来的。 与其他GUI环境下开发的API相比,GTK+的确是与众不同的,甚至在有些方面是令人惊喜的,一方面,GTK+是作为用于Linux他UNIX平台的其他GUI API的一个免费的和简单的替代品,而另一方面,GTK+是在有了数年的使用和开发经验之后开发的。 总之,在Linux/UNIX平台下开发图形界面,GTK+将是一个不错的选择。

二、一个简单的GTK+程序的例子 GTK+对开发环境的要求很简单,程序的编写可以使用任何编辑器,编译一般选用GCC,不过记得在安装时要把GTK+的API库装上去。(呵呵,是不是觉得比装VC,或.net之类的东西要简单多了?),编程的语言还是采用我们熟悉的C。 下面给出一个最简单的GTK+程序,它的作用就是在桌面上创建一个窗体。我们通过这个程序来了解GTK+的一些基础知识。

 /*****************************************************

* basicgtk.c * create by xinhe

*****************************************************/

#include gint main(gint argc,gchar **argv)

{

GtkWidget *TheWindow; //定义一个GtkWidget的数据结构 gtk_init(&argc,&argv);//对gtk+进行初始化 TheWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);//创建一个新的窗体 gtk_main();//这里是进入gtk的循环 return(0); } 然后编译此程序 gcc -Wall -o basicgtk basicgtk.c `gtk-config –cflags –libs` 编译通过后运行此程序,会在桌面上看到一个窗体。 下面来解释一下这段小程序

1、关于数据类型 这个程序中出现了gint,gchar等数据类型,这些都是GLIB的数据类型,GLIB有点像windows下C的STL,GLIB的数据类型的表示和C的差不多,基本上是在前面加一个g的前缀,但GLIB对数据类型的处理(主要指内存管理方面)比C要优化一些。如果这方面还有什么问题请参考GLIB的说明。

2、关于GtkWidget GtkWidget从本质上说它只一个数据结构,在这里,我们可以把它理解为一个对象,这里好像用到了面向对象的概念,不错同GTK+就是基于面象对面的恩想设计的,你可能会问,GTK+程序不是用C语言写的吗?注意,这里只是用到了面向对象的思想和面向对象的编程方法,并不是面向对象语言,C++语言的发明人Bjarne Stroustrup曾经说过,面向对像的程序设计是编写程序代码的一种方法。而向对像的程序设计语言是在语言内部明确的提供帮助。 因此,这里的GtkWidget可以说一个对象。

3、初始化GTK+ 在调用GTK+的函数之前,必须先初始化GTK+。gtk_init()就是对GTK+进行初始化,它主要处理命令行的参数。

4、创建并显示窗体 函数gtk_window_new()的作用就是创建一个窗体,而该函数的参数是说明所要创建窗体的类型,它可以是以下三种中的一种: GTK_WINDOW_TOPLEVEL、GTK_WINDOW_DIALOG、GTK_WINDOW_POPUP 5、gtk_main循环 gtk_main函数的作用就是进入GTK+循环,即程序不停的运行,直到程序的的另一个部分调用了gtk_main_quit或程序崩溃为止,这有点像win32程序的消息循环。

 三、信号与事件 这里将引入GTK+信号和事件的概念,信号和事件的概念十分相近,初学者比较难区别,简单的说,当用户点击一个按纽或是移动鼠标,就称该用户触发了一个事件,而X本身能够抓住的一些事情,如窗口删除、点击按纽,这些就称为信号。(的确很难区别,不过在程序里使用信号和事件的方法却没有区别) 对信号和事件的处理首先要连接信号,这里将使用到连接函数gtk_signal_connect, 这里给出一个例子

//—————————————-

TheWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT(TheWindow),”destroy”,GTK_SIGNAL_FUNC(StopTheApp),NULL); gtk_widget_show(TheWindow);

//———————————————–

gtk_signal_connect函数有四个参数,第一个是GTK+对象,GTK_OBJECT宏起到转化作用,第二个是要捕捉的信号名,第三个是信号处理程序名,GTK_SIGNAL_FUNC宏是将函数的指针转换成一个更便于GTK+内部使用的信号函数指针。最后一个参数是要传递给信号处理函数的数据指针,没有就是NULL。 接下来就要编写信号处理函数

void StopTheApp(GtkObject * TheWindow,gpointer data)

{ gtk_main_quit(); }

下面再写一个程序来理解信号和事件

/********************************

* events.c

* ***********************************/

#include //信处理函数

 void StopTheApp(GtkWinget *TheWindow,gpointer data)

 { gtk_main_quit(); }

 //事件处理函数

 gboolean EventHandler(GtkWidget *TheWindow,GdkEvent *event,gpointer data)

 { switch(event->type)

 {

case GDK_EXPOSE: g_print(“the window contents were redrawn\n”);

break;

case GDK_LEAVE_NOTIFY: g_print(“the mouse left the window\n”);

break;

case GDK_DELETE: g_print(“the window was killed”);

 break;

default: break;

}

return FALSE;

}

ginit main(gint argc,gchar **argv)

 {

GtkWidget TheWidow; gtk_init(&argc,&argv);

TheWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_signal_connect(GTK_OBJECT(TheWidow),”event”,GTK_SIGNAL_FUNC(EventHandler),NULL); gtk_signal_connect(GTK_OBJECT(TheWidow),”destroy”,GTK_SIGNAL_FUNC(StopTheApp),NULL); gtk_widget_show(TheWindow);

gtk_main(); return 0;

}

这里第一个信号连接函数是连接的事件处理函数,而第二个是连接的信号处理函数。 最后,需要断开信号连接,使用函数gtk_signal_disconnect();

//———————————————

gint SignalHandler;

SignalHandler=gtk_signal_connect(GTK_OBJECT(window),”destroy”,GTK_SIGNALFUNC(HandlerFunc),NULL);

gtk_signal_disconnect(GTK_OBJECT(window),GTK_SIGNAL_FUNC(HandlerFunc),NULL);

到这里,我们应该对GTK+编程有了一个大概的了解了。


评论

该日志第一篇评论

发表评论

评论也有版权!