众所周知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传递的参数


但是对于某些特别的信号会有特定的信号处理过程


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

而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也就可以具体到类型了,恩就到这里吧

整理自:GTK2.0教程,Hello World详解