Chinaunix首页 | 论坛 | 博客
  • 博客访问: 889545
  • 博文数量: 380
  • 博客积分: 3495
  • 博客等级: 中校
  • 技术积分: 3996
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 09:35
文章分类

全部博文(380)

文章存档

2015年(2)

2014年(5)

2013年(9)

2012年(9)

2011年(67)

2010年(103)

2009年(182)

2008年(3)

我的朋友

分类: C/C++

2009-02-21 22:53:49

从前面的HellWorld我们可以看出
所有的GTK程序的处理都是用信号+callback函数来处理的。
那么这些东西具体的是什么呢,
看一下详细的说明吧。
信号:这个可跟*NIX系统所常用的信号是不同的,不过从概念上基本上差不用,通常的用语也是一样的。
甚至处理机制也没差多少,都是用callback来做的。不过*NIX少些,GTK多些罢了。
我们也可以简单的理解成就信号就是一个通知,或者说一个消息。
callback函数,对于GTK来讲,现在有两种函数可以处理callback

gulong g_signal_connect( gpointer      *object,
const gchar *name,
GCallback func,
gpointer func_data );
前面对应的调用例子。
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (delete_event), NULL);
我们要处理的信号是如下来定义与处理函数连接到一起的。
也就是object发出信号,信号名是name,调用的函数是func,传递给函数的参数是func_data
而实际调用的时候是用G_OBJECT,GCallback两个宏来实现的数据强制转换。
callback函数的定义是下面的形式,widget就是发出信号的对象,callback_data就是前面的第四个参数。
void callback_func( GtkWidget *widget,
                    ... /* other signal arguments */
gpointer callback_data );
当然了由于信号对应的参数不同,上面的函数还是有变化的。
不是千篇一律的。

另外一个函数也是前面出现过的了。
gulong g_signal_connect_swapped( gpointer *object,
const gchar *name,
GCallback func,
gpointer *callback_data );
这个跟g_signal_connect基本上一样,不过看一下例子吧。
g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (window));
看出差别来了,冰果,就是最后一个参数,不再是传给callback函数的参数,换成了假的发送信号的源对象。
当然了,相应的callback函数也要变一下了。
void callback_func( gpointer callback_data,
... /* other signal arguments */
GtkWidget *widget);

是上面这种形式。
需要注意的是,这种callback是不能传递参数的。
所以通常也不用,可以说是属于栽赃嫁祸类型的。

总结一下:
信号,callback函数,两种连接object与callback的函数
就到这儿吧。


阅读(412) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~