GTK 的回调函数

来源:互联网 发布:github编程语言排行榜 编辑:程序博客网 时间:2024/06/06 00:54

众所周知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.csdn.net/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
而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详解

0 0
原创粉丝点击