Previous Next Contents

5. 物件概论

在GTK下,一般产生物件的步骤为:

  1. gtk_*_new - 最普遍产生物件的函数.
  2. 连接信号到信号处理器.
  3. 设定物件属性.
  4. 要将物件包装到一个container可用gtk_container_add()或gtk_box_pack_start().
  5. gtk_widget_show().

gtk_widget_show()让GTK知道我们已经完成设定的工作, 并且已经准备好要显示. 您也可以用gtk_widget_hide来隐藏它. 显示物件的顺序并不太重要, 但我建议最後才显示, 这样才不会看到这些视窗们一个一个被画出来. 子物件在使用gtk_widget_show使视窗出现之前是不会被显示出来的.

5.1 分派系统

再继续下去您会发现, GTK使用一种分派系统. 一般是用巨集来完成. 您可以看到诸如以下:

这些在函数中的都是分派参数. 您可以在范例中看到, 而且只要看到该函数就会知道它们是做什麽用的.

从以下的组织图来看, 所有GtkWidgets都是由GtkObject而来. 这意味著您可以在任何地方, 透过GTK_OBJECT()巨集要求一个物件.

例如:

gtk_signal_connect(GTK_OBJECT(button), "clicked",
                   GTK_SIGNAL_FUNC(callback_function), callback_data);

这样分派一个按钮给一个物件, 并且提供一个指标给callback函数.

许多物件同时也是containers. 如果您看看以下的组织图, 您会看到许多物件由GtkContainer而来 所有这一类的物件都可以用GTK_CONTAINER巨集产生使用containers.

5.2 物件组织图

这里是一些参考, 物件组织图.

    GtkObject
    +-- GtkData
    |   \-- GtkAdjustment
    |
    \-- GtkWidget
        +-- GtkContainer
        |   +-- GtkBin
        |   |   +-- GtkAlignment
        |   |   +-- GtkFrame
        |   |   |   *-- GtkAspectFrame
        |   |   |
        |   |   +-- GtkItem
        |   |   |   +-- GtkListItem
        |   |   |   +-- GtkMenuItem
        |   |   |   |   +-- GtkCheckMenuItem
        |   |   |   |       *-- GtkRadioMenuItem
        |   |   |   |
        |   |   |   *-- GtkTreeItem
        |   |   |
        |   |   +-- GtkViewport
        |   |   \-- GtkWindow
        |   |       +-- GtkDialog
        |   |       \-- GtkFileSelection
        |   |
        |   +-- GtkBox
        |   |   +-- GtkHBox
        |   |   \-- GtkVBox
        |   |       +-- GtkColorSelection
        |   |       \-- GtkCurve
        |   |
        |   +-- GtkButton
        |   |   +-- GtkOptionMenu
        |   |   \-- GtkToggleButton
        |   |       \-- GtkCheckButton
        |   |           \-- GtkRadioButton
        |   |
        |   +-- GtkList
        |   +-- GtkMenuShell
        |   |   +-- GtkMenu
        |   |   \-- GtkMenuBar
        |   |
        |   +-- GtkNotebook
        |   +-- GtkScrolledWindow
        |   +-- GtkTable
        |   \-- GtkTree
        |
        +-- GtkDrawingArea
        +-- GtkEntry
        +-- GtkMisc
        |   +-- GtkArrow
        |   +-- GtkImage
        |   +-- GtkLabel
        |   \-- GtkPixmap
        |
        +-- GtkPreview
        +-- GtkProgressBar
        +-- GtkRange
        |   +-- GtkScale
        |   |   +-- GtkHScale
        |   |   \-- GtkVScale
        |   |
        |   \-- GtkScrollbar
        |       +-- GtkHScrollbar
        |       \-- GtkVScrollbar
        |
        +-- GtkRuler
        |   +-- GtkHRuler
        |   \-- GtkVRuler
        |
        \-- GtkSeparator
            +-- GtkHSeparator
            \-- GtkVSeparator

5.3 没有视窗的物件

以下的物件跟视窗没有关系. 如果您希望接取它们的事件, 您需要使用GtkEventBox. 请见 EventBox物件

GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkImage
GtkItem
GtkLabel
GtkPaned
GtkPixmap
GtkScrolledWindow
GtkSeparator
GtkTable
GtkViewport
GtkAspectFrame
GtkFrame
GtkVPaned
GtkHPaned
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator

再过来我们会一个一个物件来示范如何产生及显示. 一个很好的范例是testgtk.c, 您可以在gtk/testgtk.c里面找到.


Previous Next Contents