|
1.GTK的消息处理机制 下面我们先看一个基本的例子,该例子产生一个200×200像素的窗口。它不能自己退出,只能通过shell来杀死进程(调用kill命令)。 /*例子 base.c */ #include int main( int argc,char *argv[ ] ){ GtkWidget *window; gtk_init (&argc, &argv); /* 初始化显示环境 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* 创建一个新的窗口*/ gtk_widget_show (window); /*显示窗口*/ gtk_main (); /*进入睡眠状态,等待事件激活*/ return(0); } 从上面的程序可以看出,GTK是一个事件驱动工具包,当它运行到gtk_main()函数时会自动睡眠,直到有事件发生,控制权转让给相应的函数调用,在该函数中可以用标准C写出相应的事物逻辑。这与windows 上的程序处理是一样的。 对窗口对象上发生的事件(如按下鼠标,激活键盘等),GTK也有相应的消息信号产生。这时就需要程序员创建一个信号处理器来捕获该信号,并告诉GTK程序事件发生后调用哪个回调函数。信号处理器的创建函数定义如下: gint gtk_signal_connect( GtkObject *object, gchar *name,GtkSignalFunc callback_func, gpointer func_data ); 返
回值是一个区分同一对象中的事件与不同回调函数的关联标签。这样可以做到一个对象的一个信号就有任意多个回调函数,并且每一个都会按照声明的顺序执行。函
数调用的第一个参数是产生信号的widget组件(即按钮等窗口构件),而name则是希望捕获的信号或事件的名称,callback_func则是事件
发生后所调用的回调函数名称,而第四个参数func_data则是传递给回调函数的参数。 回调函数要定义在主程序的前面,它们的一般格式都如下所示: void callback_func( GtkWidget *widget, gpointer func_data ); 调用下面这个方法将允许你将回调函数与事件的关联断开: void gtk_signal_disconnect( GtkObject *object, gint id ); 该函数的 第二个参数就是上述gtk_signal_connect()函数的返回值,即关联标签。 第一个参数指向了去除关联的对象名称。这样可以做到断开事件与回调函数的关联,使得事件发生后,不会调用相关的回调函数。
|