再继续下去你会发现,GTK 使用了一套类型转换系统。

    GTK 利用的是一套宏,这些宏在转换前还会测试能否进行转换。

    一些常见的宏是:

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

    这些都用来在函数中转换参数。

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

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

    例如:

    //这里把 button 转换为一个 object,并提供一个函数指针作为回调函数。
    g_signal_connect( G_OBJECT (button), "clicked",
                      G_CALLBACK (callback_function), callback_data);

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

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

    SofTool.CN Note:
    GTK_BOX (box) 宏的定义,我们可以在 /usr/include/gtk-2.0/gtk/gtkbox.h 头文件中看到。