Hello World 详解
现在我们知道基本理论了,让我们来详细分析helloworld 示例程序。
这是按钮被点击时要调用的回调函数。在这个示例中我们忽略了参数 widget 和 data,但是使用这些参数也不难。下一个示例会使用 data 参数来告诉我们哪个按钮被按下了。
void hello( GtkWidget *widget, |
接下来的一个回调函数有点特殊。"delete_event" 在窗口管理器发送这个事件给应用程序时发生。我们在这里可以选择对这些事件做什么。可以忽略它们,可以做一点响应,或是简单地退出程序。
gint delete_event( GtkWidget *widget, |
这里是另一个回调函数,它通过调用 gtk_main_quit() 来退出程序。这个函数告诉 GTK 当控制权返回给它时就从 gtk_main 退出。
void destroy( GtkWidget *widget, |
我假设你知道 main() 函数...是的,像其它程序一样,所有的 GTK 程序有一个 main() 函数。
int main( int argc, |
接下来声明两个指向 GtkWidget 类型的结构的指针。它们被用于创建一个窗口和一个按钮。
GtkWidget *window; |
gtk_init (&argc, &argv); |
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
g_signal_connect (G_OBJECT (window), "delete_event", |
接下来这个函数用于设置容器对象的属性。设置窗口边框宽度为10个象素。在 设置构件属性 这一章还有其它类似函数。
再次,GTK_CONTAINER 也是一个执行类型转换的宏。
gtk_container_set_border_width (GTK_CONTAINER (window), 10); |
这个函数调用创建一个新按钮。在内存中分配空间给一个新的 GtkWidget 结构,初始化它,并使 button 指针指向它。它显示后上面会有个 "Hello World" 标签。
button = gtk_button_new_with_label ("Hello World"); |
在 这,我们让这个按钮做一些有用的事。我们给按钮设置信号处理函数,因此当按钮发出 "clicked" 信号时,hello() 函数被调用。我们忽略了 data 参数,简单地传送 NULL 给 hello() 回调函数。显而易见,当我们用鼠标点击按钮时,信号 "clicked" 被发出。
g_signal_connect (G_OBJECT (button), "clicked", |
我 们也要使用这个按钮退出程序。这将演示 "destroy" 信号怎样由窗口管理器引发,或由我们的程序引发。当我们按下按钮时,和上面一样,它首先调用 hello() 回调函数,然后是这个函数,这依赖于它们被设置连接的顺序。你可以拥有许多回调函数,所有的回调按你设置连接的顺序依次执行。因为 gtk_widget_destroy() 函数只接受 GtkWidget *widget 作为唯一的参数,我们这里用 g_signal_connect_swapped() 函数代替正统的 g_signal_connect()。
g_signal_connect_swapped (G_OBJECT (button), "clicked", |
这是一个组装调用,在组装构件 这一章将作深入讲解。不过它相当容易理解。它简单地告诉 GTK 要把按钮放在窗口里,也就是它显示的地方。注意一个 GTK 容器只能包含一个构件。还有其它的构件,在后面介绍,设计为用来以各种方法布局多个构件。
gtk_container_add (GTK_CONTAINER (window), button); |
一切准备就绪。所有信号处理函数连接好了,按钮也放进了窗口,我们让 GTK 在屏幕上“显示”这些构件。窗口构件最后显示,这样整个窗口会一下弹出,而不是先见到窗口弹出后再见到按钮。虽然这个简单的示例中,你不会注意到。
gtk_widget_show (button); |
接着,当然,我们调用 gtk_main() 函数来等待来自 X 服务器的事件,当这些事件到来时,调用构件发出信号。
gtk_main (); |
最后返回,调用函数 gtk_quit() 后控制权返回到这里。
return 0; |
现 在,当我们用鼠标点击一个 GTK 按钮,构件发出一个 "clicked" 信号。为了让我们利用这个信息,程序设置了一个信号处理器来捕获那个信号,它按我们的选择依次调用函数。在我们的示例中,当按下按钮时,以 NULL 作为参数调用函数 hello(),然后调用该信号的下一个处理函数,该函数调用 gtk_widget_destroy() 函数,把窗口构件作为参数传递给它,销毁窗口构件。这导致窗口发出 "destroy" 信号,它被捕获,并且调用我们的 destroy() 回调函数,简单地退出 GTK。
如果用窗口管理器去关闭窗口,它会引发 "delete_event"。这会调用我们的 "delete_event" 处理函数。如果我们在函数中返回 TRUE,窗口还是留在那里,什么事也不发生。返回 FALSE,会使 GTK 发出 "destroy" 信号,它当然会调用 "destroy" 回调,退出 GTK。
<<< Previous | Home | Next >>> |
事件 | Up | 继续 |