简介
GTK+, 即,GIMP ToolKit,是一个简单易用、特征丰富的图形用户接口工具集,
它具有很好的跨平台性和简单易用的 API。之所以叫 GIMP ToolKt,是因为它最
初是为了开发 GIMP 而写的,现在已经在很多项目中使用,如 GNOME。
尽管 GTK+ 采用 C 语言开发,但采用了很多面向对象的设计思想,通过一些技
巧用 C 语言实现了面向对像中的封装、继承、多态等机制。它使用了类和回调函数。
GTK+ 采用 LGPL 协议发布,可用于开发 open, free 和商业软件。
除了提供 C 接口之外,GTK 还支持与多种语言的绑定,如 C++, Guile, Perl, Python, TOM, Ada95, Objective C, Free Pascal, Eiffel, Java and C# 等。
体系结构
GTK+ 由以下几个部分组成:
- GLib:一个底层库,封装了基本的数据结构操作、底层功能接口以及平台相
关的代码。它是 GTK+ 的基础;
- GDK (GIMP Drawing Kit),封装了底层访问窗口系统的函数,如 X window
系统中的 Xlib;
- gdk-pixbuf,一个客户端的图像处理库;
- Pango:一个文本布局和渲染库,着重解决国际化功能。它是 GTK+2.0 文本
和字体处理的核心;
- Cairo:一个 2D 图形库,支持多种输出设备(如 X window, Win32),支持硬
件加速功能;
- ATK:一组提供访问性的接口,支持 screen reader, magnifiers 和其它的输入设备。
信号与 callback
当一个事件发生时,比如鼠标按键按下,被点击的 widget 就会发出对应的信号。
有些信号是所有 widget 都有的,如 destroy ,也有些信号是 widget 特有的,
如 toggle 按钮的 toggled 信号。
要按钮完成一个动作,需要设置一个信号处理函数来捕获和处理信号,这通过下
面的函数实现:
g_signal_connect( gpointer *object,
const gchar *name,
GCallback func,
gpointer func_data );
- object:发出信号的 widget;
- name:信号名称;
- func:信号处理函数;
- func_data:传递给函数的数据。
信号处理函数格式如下:
void callback_func( GtkWidget *widget,
... /* other signal arguments */
gpointer callback_data );
- widget:是发出信号的 widget;
- callback_data:是传递进函数的数据。
事件
除了上面讲的信号机制,GTK 还有事件机制。回调函数也可以挂载到事件上。这
些事件包括:
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
要将回调函数与事件建立联系使用 g_signal_connect() 函数。使用事件名作为
name 参数。事件的回调函数与信号的回调函数在格式上略有不同:
gint callback_func( GtkWidget *widget,
GdkEvent *event,
gpointer callback_data
中间加了 event 参数。
举个例子:
g_signal_connect (G_OBJECT (button), "button_press_event",
G_CALLBACK (button_press_callback), NULL);
这里 button 是 Button widget,当鼠标在 button 上按下时,button_press_callback() 将会被调用。这个函数声明如下:
static gboolean button_press_callback( GtkWidget *widget,
GdkEventButton *event,
gpointer data );
函数返回值表示事件是否被转发。返回 TRUE 表示事件已被处理,不需转发。返
回 FALSE ,事件转发给父窗口,由 GTK 事件处理机制处理。
一个事件可以有多个信号处理函数,它们按顺序依次执行。
Widget
GTK 创建一个 widget 的步骤:
- gtk_*_new ();
- 为信号和事件建立处理函数并建立映射;
- 设置 widget 的属性;
- 将 widget 放在到一个 container 中,通常使用 gtk_container_add() 或
者 gtk_box_pack_start() 等函数;
- gtk_widget_show ()。
组装构件 (Packing Widgets) 有两种方式:
- 组装盒 (Packing Boxes)
- 表 (Tables)
|