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`
将会看到程序结果。