在Ubuntu下GTK编程笔记(二)

    在《在Ubuntu下GTK编程笔记(一)》中,我们讲述了gtk环境的构筑,以及制

作了一个简单的HelloWorld程序,在本节中我们对HelloWorld程序进行展开,介绍

gtk的信号和回调机制。

    所有的GUI库都有一个共同点:必须有某种机制响应用户动作以执行代码。命令行

程序有奢侈的做法:就是暂停执行,等待用户输入,然后采用switch语句等机制使程

序根据输入不同而分支执行。这种做法对GUI应用程序是不现实的,因为应用程序必

须不断地响应用户输入,例如她需要不断地更新窗口区域。

    现代窗口系统是由事件和事件监听系统来解决这个问题的。笔者接触到最早的事件

程序是用VB写的,其思想是,每次用户输入都触发一个事件。程序员只需编写监听事

件以及事件触发时执行的代码。

    相应地,GTK有自己的事件和事件监听系统,叫做信号(signal)和回调函数(callback)。

它们非常简单易用,因为你可以用C语言的一个有用的特征——函数指针来设置信号

处理器。

    GTK信号:当某件事发生时GtkObject对象发出的数据。

    回调函数:与信号连接,一旦信号发出就会被调用的函数。

    典型的回调函数的原型:

        void a_callback_function ( GtkWidget *widget, gpointer user_data);

        参数1:指向发出信号的窗口部件的指针;

        参数2:回调函数与信号连接时定义的任一指针。

    连接回调函数,只需要调用g_signal_connect函数就可以了:

        gulong g_signal_connect (gpointer *object, const gchar *name,

                                             GCallback func, gpointer user_data);

    ※连接回调函数没有任何限制。可以将多个信号连接到一个回调函数,也可以将

      多个回调函数连接到一个信号。

    以上,是GTK信号和回调函数的介绍,下面就HelloWorld程序进行分析:

    HelloWorld程序中定义的回调函数:

1 void closeApp (GtkWidget *window, gpointer data) {
2     gtk_main_quit();
3 }

 

    连接回调函数的方法:

g_signal_connect(GTK_OBJECT(window), "destroy",
                 GTK_SIGNAL_FUNC(closeApp), NULL);

 

    效果:window窗口发出destroy信号时,将执行回调函数closeApp,

使程序正常终止。

    ※有兴趣的读者可以试试:当去掉以上代码时,点击关闭按钮时,依然

      可以关闭窗口,但是程序本身并没有被终止掉。

----------------------------------------------------------------------------

posted on 2010-07-24 17:43  flycatorg  阅读(663)  评论(0编辑  收藏  举报

导航