GTK 的回调函数

35 篇文章 0 订阅
2 篇文章 0 订阅

众所周知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详解

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值