G0398 发表于 2014-10-17 15:12:28

C语言GUI程序设计-GTK图文系列-信号处理

本帖最后由 G0398 于 2014-10-23 17:13 编辑

本讲主要讲解窗口的常用信号处理:

信号类似Windows下的消息,操作系统收到用户交互信息通过封装成信号或消息的方式通知程序,调用程序注册的信号处理过程或消息处理事件进行交互处理

gtk的信号注册中信号名称以字符串形式呈现,例如:
g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
这里注册了窗口销毁信号,窗口销毁时会调用gtk_main_quit这个函数处理。

在Windows下的消息以宏的方式呈现,比如:
#define WM_DESTROY                      0x0002
g_signal_connect为信号注册函数,定义在\include\glib-2.0\gobject\gsignal.h 头文件中

第一个参数为widget实例,第二个参数为字符串形式的信号名称,第三个参数为信号处理函数,第四个参数为用户自定义数据。

所有的信号注册都通过这个函数完成。

#include <gtk/gtk.h>
#include <cairo.h>

void window_show(GtkWidget *widget,gpointer data)
{
    printf("窗口显示\n");
}

void window_draw(GtkWidget *widget,cairo_t *cr,gpointer data)
{
    printf("重绘\n");
}

void window_destroy(GtkWidget *widget,gpointer data)
{
    printf("销毁\n");
    gtk_main_quit();
}

int main(int argc,char *argv[])
{
GtkWidget *window;

//GTK初始化
gtk_init (&argc, &argv);

//“实例化”一个新窗口
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

//注册信号通知(窗口销毁)
g_signal_connect(window, "destroy", G_CALLBACK(window_destroy), NULL);
//注册信号通知(窗口显示)
g_signal_connect(window, "show", G_CALLBACK(window_show), NULL);
//注册信号通知(窗口重绘)
g_signal_connect(window, "draw", G_CALLBACK(window_draw), NULL);

gtk_window_set_title(GTK_WINDOW(window),"hello fishc");

//显示窗口
gtk_widget_show (window);

//执行消息循环
gtk_main ();

return 0;
}
这里注册了三个信号处理函数:window_destroy,window_show和window_draw


window_destroy为窗口销毁后调用。
window_show为窗口显示后调用,在窗口的生命周期只调用一次,可以用来做一些初始化操作。
window_draw为窗口重绘时调用,用来重新绘制窗口界面。


这三个信号为GtkWidget的处理信号,所有GtkWidget的实例都可以注册这几个信号,不同的widget还有自己特有的信号处理,比如按钮的点击产生的信号:clicked 或 编辑框内容改变触发的信号:changed


下一讲主讲GtkWidget之容器部件


_DEBUG 发表于 2014-10-17 19:18:52

强烈支持,还是很像Qt的

大个的糖果 发表于 2014-10-30 16:54:27

页: [1]
查看完整版本: C语言GUI程序设计-GTK图文系列-信号处理