构件概述

在 GTK 中创建一个构件的一般步骤是:

  1. gtk_*_new() - 创建各种构件的函数。这些函数都将在本文档中作详细的介绍。

  2. 把所有想连接的信号都连接到对应的信号处理函数。

  3. 设定构件的属性。

  4. 用 gtk_container_add() or gtk_box_pack_start()等适当的函数把构件放置到一个容器构件中。

  5. gtk_widget_show() 显示构件。

gtk_widget_show() 让 GTK 知道我们已经完成设定构件属性的工作,并且能够让它显示出来了。你也可以用 gtk_widget_hide 使构件再次隐藏起来。各个构件显示的顺序并不重要,不过我建议在最后显示窗口,这样整个窗口就可以一次弹出来,而不是让用户看着窗口里的构件一个个生成并显示出来。在窗口(也是一个构件)用 gtk_widget_show() 函数显示出来之前,它的子构件并不会被显示。

类型转换

再继续下去你会发现,GTK 使用了一套类型转换系统。它利用的是一套宏,这些宏在转换前还会测试能否进行转换。一些常见的宏是:

  G_OBJECT (object)
  GTK_WIDGET (widget)
  GTK_OBJECT (object)
  GTK_SIGNAL_FUNC (function)
  GTK_CONTAINER (container)
  GTK_WINDOW (window)
  GTK_BOX (box)

这些都用来在函数中转换参数。你将在范例中看到它们的使用,只要看看函数的声明就可以知道什么时候需要使用它们。

在下节介绍的类的组织里,你将知道所有的 GtkWidget 都是从 GObject 这个基本类派生来的。也就是说,你能把widget传给任何需要以object类型作为参数的函数 - 只要用一下 G_OBJECT() 宏。

例如:

g_signal_connect( G_OBJECT (button), "clicked",
                  G_CALLBACK (callback_function), callback_data);

这样把 button 转换为一个 object,并提供一个函数指针作为回调函数。

很多构件也是容器,看一下节介绍的类的组织,你就会注意到很多构件是从容器类派生来的。这些构件都可以用 GTK_CONTAINER 宏转换后传递给需要以container作为参数的函数。

可惜的是,这些宏在本文档中并没有广泛地提及,不过我推荐去看一下 GTK 的头文件或者 GTK API 参考手册。这将很有用。实际上,通过看函数的声明来学习一个构件的使用也不难。