众所周知gtk是基于事件驱动的,而windows则是基于消息驱动,至于这两者之间的区别,笔者能力有限,就不得而知了,但,今天的主题是GTK的毁掉函数的详解,所以还是抓紧步入正轨吧
1.一般情况下我们使用
来进行事件的绑定,我们来解析下这个函数的使用gulong g_signal_connect( gpointer *object, const gchar *name, GCallback func, gpointer func_data );
object:指定事件来源对象
name:指定的是信号名称,是一个字符串类型的变量
func:回调函数指针
func_data:则是需要传递给回调函数的数据
而func的一般形式是这样的
void callback_func( GtkWidget *widget, gpointer callback_data );widget:是信号来源,也就是触发事件的Widget控件
callback_data:则是g_signal_connect传递的参数
该种形式的回调函数有两个参数http://write.blog.youkuaiyun.com/postedit
但是对于某些特别的信号会有特定的信号处理过程
gulong g_signal_connect_swapped( gpointer *object, const gchar *name, GCallback func, gpointer *slot_object );我们可以看到,从形式上看到,信号处理函数的指定是没有什么区别的,但是,该种信号处理函数的指针是指定的,是一个指向gtk对象的指针
回调函数是:
void callback_func( GtkObject *object );没有其他的参数,这种形式的回调函数常来调用一个只接受一个单独的构件,或者对象作为参数的GTK函数
除了这种信号机制以外,还有的就是events 说明X事件机制,回调函数可以与这些事件进行连接,进行特别的处理,她回调函数的指定形式是
g_signal_connect的,只是回调函数会有些不同
gint callback_func( GtkWidget *widget, GdkEvent *event, gpointer callback_data );我们可以看到,这里面多了一个event,这里面的event是根据事件(name)的不同而传入不同的event对象的,他是一个结构体,依赖于事件的不同而又不同的类型
回调函数设置过程中name的取值有
- event
- button_press_event
- button_release_event
- scroll_event
- motion_notify_event
- delete_event
- destroy_event
- expose_event
- key_press_event
- key_release_event
- enter_notify_event
- leave_notify_event
- configure_event
- focus_in_event
- focus_out_event
- map_event
- unmap_event
- property_notify_event
- selection_clear_event
- selection_request_event
- selection_notify_event
- proximity_in_event
- proximity_out_event
- visibility_notify_event
- client_event
- no_expose_event
- window_state_event
GDK_NOTHING GDK_DELETE GDK_DESTROY GDK_EXPOSE GDK_MOTION_NOTIFY GDK_BUTTON_PRESS GDK_2BUTTON_PRESS GDK_3BUTTON_PRESS GDK_BUTTON_RELEASE GDK_KEY_PRESS GDK_KEY_RELEASE GDK_ENTER_NOTIFY GDK_LEAVE_NOTIFY GDK_FOCUS_CHANGE GDK_CONFIGURE GDK_MAP GDK_UNMAP GDK_PROPERTY_NOTIFY GDK_SELECTION_CLEAR GDK_SELECTION_REQUEST GDK_SELECTION_NOTIFY GDK_PROXIMITY_IN GDK_PROXIMITY_OUT GDK_DRAG_ENTER GDK_DRAG_LEAVE GDK_DRAG_MOTION GDK_DRAG_STATUS GDK_DROP_START GDK_DROP_FINISHED GDK_CLIENT_EVENT GDK_VISIBILITY_NOTIFY GDK_NO_EXPOSE GDK_SCROLL GDK_WINDOW_STATE GDK_SETTING使用案例如下:
g_signal_connect (G_OBJECT (button), "button_press_event", G_CALLBACK (button_press_callback), NULL);回调函数会是:
static gint button_press_callback( GtkWidget *widget, GdkEventButton *event, gpointer data );因为我们知道事件的类型,所以event也就可以具体到类型了,恩就到这里吧