GTK+浅谈之二信号回调和事件

来源:互联网 发布:java 定义泛型返回值 编辑:程序博客网 时间:2024/05/21 10:35

一、简介

        因为GTK+是一个面向对象的构件集,它有一个继承的层次,这个继承机制也应用于信号。例如,destroy信号是由GtkObject而不是GtkWidget发出的,但因为GtkWidget继承了GtkObject,所以GtkObject派生的窗口小部件或对象都可以发出destroy信号。
        回调表的使用很容易,如果回调表中有:show void GtkWidget *widget,gpointer data,则为了处理show,将需要一个回调函数:void MyCallBack(GtkWidget *widget, gpointer data)。

二、详解

1、Gtk+构件层次树







2、Gtk+信号






















3、Gtk+事件

       事件不同于信号,信号一般是在较低的层次(如X Window System)上发布的,而事件基本上是由GTK+、GDK或GNOME(主要是GDK)产生的定制信号,处理事件可能比处理信号涉及的工作更多。
       所有事件处理程序都传递一个指向GdkEvent的指针(使用事件的关键)。把该指针转换成特定的类型是由自己的代码负责。
       通用的GdkEvent结构如下:

       为了确定触发的是何种事件,可检查类型成员DdkEventType。比如为了确定刚发生的事件是键入事件,可以判断:if (event->type == GDK_KEY_PRESS){}。


       所有事件处理程序都有一个Boolean返回值,用它指出你的代码是否处理了相应的事件。如果代码确实处理了该事件,返回TRUE;若事件程序返回FALSE,则Gtk+和Gdk以通常的方式处理该事件。如处理delete_event信号的事件处理程序返回TRUE,则不在继续处理,若返回FLASE,则Gtk+和Gdk将发布一个destroy信号给窗口,关闭它。
       在确定了产生的事件类型后,关于该事件的信息可通过传入相应的处理程序的GdkEvent指针转换为一个专用于该事件类型的GDK事件结构来查看。








三、总结

(1)常常会出现一个与实际所完全不同的调用,虽然仍可编译,但若一个回调函数的参数比实际传递给它的少,会有损坏内存的危险;同样,若回调函数指定的参数比实际传递给它的多,则会使回调函数中某些参数所含的信息作废。因此处理信号应使用正确的回调,已避免代码产生不可预测的影响。
(2)Gtk+和Gdk的信号与标准的POSIX信号没有任何关系。
(3)若有建议,请留言,在此先感谢!

1 0