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, 200, 100);
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
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, 200, 100);
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后, 应用程序成功退出。