Chinaunix首页 | 论坛 | 博客
  • 博客访问: 200776
  • 博文数量: 489
  • 博客积分: 410
  • 博客等级: 下士
  • 技术积分: 2590
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-01 22:50
文章分类

全部博文(489)

文章存档

2011年(489)

我的朋友

分类:

2011-09-04 12:33:11

原文地址:gtk下实现按钮长按操作 作者:agu9899

   GTK+函数工具库是基于 “事件”系统的。所有的 GUI 应用程序无一例外都是基于“事件”驱动的。假如没有“事件”发生,则应用程序就什么都不会做。在GTK+中一个事件就是从X窗口服务器传出来的一个消息。 当一个“事件”发生时,他就会通过发送一个“信号”来表示他已经做出了反应。利用GTK+还可以为“信号”绑定专门的回调函数。也就是说回调函数只对他特 定的“信号”才有反应并执行。在GTK2.0版本中信号系统已从 GTK 移到 GLib,因此在函数和类型的说明中有前缀 "g_" 而不是 "gtk_"。这里所说的“信号”区别于unix(linux)系统中所说的signal.在unix系统中的信号可以理解为“软中断”(感兴趣的博友可以去查阅<>,在以后的日子中,我也会写些有关singal方面的东东).GTK中的信号,类似于windows编程中的消息机制,类似于java中的awt的事件处理机制。

   所有的gtk应用程序都有如下个格式的函数使用
gtk_init();
......
gtk_main();

   函数gtk_init(gint *argc,gchar *** argv)。该函数定位和打开图形显示,并对颜色、信号等进行初始化。在命令行输入的参数由该函数传递给GTK+,该函数读取并获得与它有关的命令行参数。

   gtk_main()使GTK+进入消息处理循环。使Gtk程序进入休眠状态。当有事件发生,如果程序中有相应的处理函数,gtk_main()就调用相应的消息处理函数。


   当一个事件发生时,如在选中的一个button上单击鼠标,围绕这个button会有多个信号(press,release,click...)。软件可以根据需要去实现相关信号的处理函数,因为gtk本身就是基于面向对象思想设计的,继承的思想随处可见,在glib中对信号的处理更是如此,在众多的gtk组件中(widget)。有所有组件都继承的信号,如 “as hide” , “grab-focu",”destroy",也有组件自己专有的信号,如GtkRadioButton按钮发出的“group-changed”切换信号。

  要使一个按钮执行一组操作,首先我们需设置信号和信号处理函数之间的连接。请务必记住程序员所做的连接信号和回调函数的工作一定要在gtk_main之前。可以这
  样使用函数来设置连接:
  gulong g_signal_connect( gpointer *object,
   const gchar *name,
   GCallback func,
   gpointer func_data );
  第一个参数是要发出信号的组件,第二个参数是你想要连接的信号的名称,第三个参数是信号被捕获时所要调用的函数,第四个参数是你想传递给这个函数的数据(一般情况下如果有多个参数传递到回调函数中,可以将所有的参数通过一个结构体进行封装,在实际的使用中可以传递结构体指针即可)。第三个参数指定的函数叫做回调函数:
  void callback_func( GtkWidget *widget,
   gpointer callback_data );
第一个参数是一个指向发出信号的组件的指针,第二个参数是一个指向数据的指针,也就是 g_signal_connect() 函数的最后一个参数。注意上面回调函数的声明是一种常用的形式,有些构件的特殊信号会用不同的调用参数。

另一个调用在形式 helloworld 程序中使用,是:
  gulong g_signal_connect_swapped( gpointer *object,
   const gchar *name,
   GCallback func,
   gpointer *slot_object );

   g_signal_connect_swapped() 和 g_signal_connect() 相同,只是回调函数只用一个参数,一个指向 GTK 对象的指针。所以当使用这个函数连接信号时,回调函数应该是这样的形式
  void callback_func( GtkObject *object );
这个对象常是一个构件。然而我们通常不用函数 g_signal_connect_swapped() 设置连接。它们常被用在只接受一个单独的构件或者对象的回调函数中作为参数,如同我们的 helloworld 示例中那样。拥有两个设置信号连接函数的目的是简单的允许回调函数有不同数目的参数。GTK 库中许多函数仅接受一个单独的构件指针作为其参数,所以对于这些函数你要用 g_signal_connect_swapped(),然而对你自己定义的函数,你需要附加的数据提供给你的回调函数。
文件:gu.gz
大小:6KB
下载:下载
阅读(235) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~