GTK+2.0中利用信号/回调函数机制来处理窗口外部传来的事件、消息或信号。
以下实现的是单击窗口关闭按钮,窗口自动关闭。在程序中调用了gtk_main_quit()函数实现退出主循环。
#include<gtk/gtk.h> void on_delete_event(); //函数声明 int main(int argc, char* argv[]) { GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* *这里要注意的是g_signal_connect宏. */ g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(on_delete_event), NULL); gtk_window_set_title(GTK_WINDOW(window), "第二个练习窗口例子"); gtk_window_set_default_size(GTK_WINDOW(window),500, 100); /* *设定窗口的位置在父窗口的中部 */ gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_widget_show(window); gtk_main(); return FALSE; } /* *实现退出主循环 */ void on_delete_event(GtkWidget *widget, GdkEvent* event, gpointer data) { gtk_main_quit(); }
g_signal_connect宏是今天学习的目的之一。g_signal_connect宏有4个参数
gulong g_signal_connect( gpointer *object, const gchar *name, GCallback func, gpointer func_data );
它们分别是连接信号控件的指针(连接的对象)、信号名称、回调函数以及传递给回调函数的参数。而第三个回调函数一般为以下的形式
void callback_func( GtkWidget *widget, gpointer callback_data );
第一个参数是指向发出信号的控件指针,第二个参数是g_signal_connect宏的最后一个参数传进来的数据指针。
接下来我们来学习HelloWorld的代码。在上面的代码里添加HelloWorld。
#include<gtk/gtk.h> //函数声明 void on_delete_event(); void on_button_clicked(); //定义单击次数统计 gint data_count = 1; int main(int argc, char* argv[]) { GtkWidget *window; GtkWidget *button; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(on_delete_event), NULL); gtk_window_set_title(GTK_WINDOW(window), "Hello World Test"); gtk_window_set_default_size(GTK_WINDOW(window),500, 100); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(window),50); button = gtk_button_new_with_label("按下按钮将会显示一行信息:"); //响应click事件 g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),(gpointer)data_count); gtk_container_add(GTK_CONTAINER(window),button); gtk_widget_show(button); gtk_widget_show(window); gtk_main(); return FALSE; } void on_delete_event(GtkWidget *widget, GdkEvent* event, gpointer data) { gtk_main_quit(); } /* *实现单击显示Hello World 结果以及显示单击的次数data_count */ void on_button_clicked(GtkWidget *button, gpointer userdata) { g_print("Hello,The test for 'Hello World'!"); g_print("%d\n", data_count); data_count = data_count + 1; }
执行 $gcc -o gtksec ./gtk_sec.c `pkg-config --cflags --libs gtk+-2.0`
将会看到程序结果。