GTK+ 加入消息处理的 hello world

转载请注明出处:http://www.cnblogs.com/build/archive/2010/12/17/hello-world-modify.html  

上文介绍了如何使用Eclipse编译一个最简单的GTK+ Helloworld,但这中间并不完美,存在很多问题,尤其是应用程序无法退出.

 所以基于上一篇的代码,做进一步加工,来实现最起码的应用程序退出功能。

 

原理上就是处理一个消息,这个消息是通过一个事件触发的,所以会在App启动之前将消息和处理过程链接好,当这个消息触发之后,就会在相应的过程中得到处理,这个过程叫做回调函数,英文名是CallBack。

 

这里将用到GTK+的消息与函数。代码如下。

 1 #include <gtk/gtk.h>
 2 
 3 static void destroy (GtkWidget*, gpointer);
 4 static gboolean delete_event (GtkWidget*, GdkEvent*, gpointer);
 5 
 6 int main (int argc,char *argv[])
 7 {
 8   GtkWidget *window, *label;
 9 
10   gtk_init (&argc, &argv);
11 
12   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
13   gtk_window_set_title (GTK_WINDOW (window), "Hello World!");
14   gtk_container_set_border_width (GTK_CONTAINER (window), 10);
15   gtk_widget_set_size_request (window, 200100);
16 
17   /* 将主窗口于 destroy 和 delete-event 信号连接起来. */
18   g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL);
19   g_signal_connect (G_OBJECT (window), "delete_event",G_CALLBACK (delete_event), NULL);
20 
21   /* 创建一个文本可以被选择的新的GtkLabel组件*/
22   label = gtk_label_new ("Hello World");
23   gtk_label_set_selectable (GTK_LABEL (label), TRUE);
24 
25   /* 将这个Label组件作为主窗口的子组件添加进来 */
26   gtk_container_add (GTK_CONTAINER (window), label);
27 
28   gtk_widget_show_all (window);
29   gtk_main ();
30   return 0;
31 }
32 /* 当窗口被销毁的时候,停止GTK+ 主循环函数*/
33 static void destroy (GtkWidget *window,gpointer data)
34 {
35    gtk_main_quit ();
36 }
37 /* 销毁组件时返回false,如果取消一个delete-event返回true,这样就可以用来确认,是否真的要退出*/
39 static gboolean delete_event (GtkWidget *window,GdkEvent *event,gpointer data)
40 {
41     return FALSE;
42 }
43 

 

编译运行后的结果如下:

 

 

 在按下右上角的x后, 应用程序成功退出。

posted @ 2010-12-20 15:03  e_hong  阅读(457)  评论(0编辑  收藏  举报