GTK tutorial 一

参考:https://www.geany.org/manual/gtk/gtk-tutorial/book1.html

Introduction

GTK(GIMP ToolKit)是一个用于创建图形化的用户接口的库。GIMP的全称是GNU Image Manipulation Program.GTK最开始是用于开发GIMP的。GTK依赖于GDK(GIMP Drawing Kit)、gdk-pixbuf、Glib和Pango.GTK是一个面向对象的API.虽然GTK是用C语言写的。它的面向对象的实现是通过类的思想及回调函数来实现的。gdk-pixbuf用于客户端图片管理。在GTK2.0以后,GLib的类型系统是GTK中类的层次结构的基础。GLib的信号系统贯穿整个GTK.Pango用于标准文本输出。

Theory of Signals and callbacks

GTK是事件驱动的toolkit。这就是说,当有事件发生时,GTK会从gtk_main()上睡眠态恢复,并将程序控制权传递到合适的函数上。
控制权的传递是通过信号这个概念来实现的。此信号非Unix signal,也不是通过Unix signal 来实现的。比如说,当用户按下鼠标上的按键,鼠标光标所在的widget就会发送信号。GTK中使用的信号有些是能在所有widget中进行继承的,比如 “destroy”信号,还有一些信号是widget特有的,比如所 toggle button 上的 “toggled” 信号。
为了让按下按钮后,按钮会做出反应。 我们需要设置信号处理函数来获取信号,并让信号调用函数。这个过程是通过函数g_signal_connect来实现的。

gulong g_signal_connect(gpointer *object, const gchar *name, GCallback func, gpointer func_data);

参数object是会发送信号的widget, name 是你希望截获的信号的名称,func是截获信号后,需要执行的函数,此参数也叫做回调函数,func_data是传递给func的参数。
g_signal_connect的回调函数的声明如下: 

void callback_func(GtkWidget *widget, .../*other signal argument*/, gpointer callback_data);

参数widget指向发送信号的widget, callback_data指向g_signal_connect的最后一个参数。 

Event 

除了信号机制外,GTK还有用于反映X 事件机制的 事件机制。

  • event
  • button_press_event
  • button_release_event
  • scroll_event
  • motion_notify_event
    .....

为了能使回调函数与这些事件挂钩,我们需要使用g_signal_connect函数。与信号的回调函数不同,事件的回调函数声明如下:

gint callback_func(GtkWidget *widget, GdkEvent *event, gpointer callback_data)

GdkEvent是个union 结构, 他在callback_func执行时,具体是union中的那个数据结构是取决于回调函数在执行时是发生了什么事件。我们为了方便确定什么事件发生了,union中的数据结构都会有一个用于指示事件类型的成员。在gtk+2.9.0中,此成员类型为GdkEventType。union数据结构中除了GdkEventType类型的成员外,其他成员根据事件的不同也是不同的。GdkEventType的值如下:

  • GDK_NOTHING
  • GDK_DELETE
    ......

举例说明如下:

g_signal_connect(G_OBJECT(button), "button_press_event", G_CALLBACK(button_press_callback),NULL);

static gboolean button_press_callback(GtkWidget *widget, GdkEventButton *event, gpointer data);

button_press_callback的返回值决定是否需要继续传递此信号。 返回TRUE,不要需继续传递,返回FALSE则需要。 

 packing Widgets

当创建应用时,你希望在窗口中放入更多的widget,这就不是gtk_container_add()函数能够完成的。一个窗口中的多个widget 该怎么放置呢,这就需要packing. 

box 

大部分的packing都是通过box来完成的。box是不可见的widget 容器,他有两类,一个是horizontal box, 另一个是vertical box.
函数gtk_hbox_new()用于创建horizontal box, gtk_vbox_new()用于创建vertical box. 函数gtk_box_pack_start()、gtk_box_pack_end()用于将对象放入box。对象可以是容器也可以是widget. 

table 

在使用table时,table会创建一个网格用于放置widget. 

GtkWidget *gtk_table_new(guint rows, guint columns, gboolean homogeneous)

参数rows指定网格的行数,columns指定网格的列数。homogeneous指定网格中每个格子的大小。当其值为TRUE时,格子的大小与所有格子中最大的widget一样。当其值为FALSE时,所有widget中,最大的高为格子的宽,所有widget中,最大的长为格子的长。参数rows和columns都是从0开始进行编号的。且(0,0)坐标是在网格的左上角。 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值