GTK+ 2.0 教学-元件的解析

要想创建一个新的元件,最重要的是要对 GTK 物件的工作原理有所了解。这一节只是一个简述,详见参考手册。

GTK 元件具有物件导向的特性。然而,它是用标准的 C 来写的。比起用C++来说,这可以大大改善可移植性及稳定性;但是,这也意味着写元件的人需要小心许多实作上的问题。所有同一类别的元件的一般资讯(比如所有的按钮元件)是放在在类别结构里,类别的信号讯息只以该结构存储了一份(充当 C 中的虚函式)。为了支援继承,类别结构的第一个栏位必须是它的父类别结构的一个拷贝。GtkButton 的类别结构宣告如下:

struct _GtkButtonClass
{
  GtkContainerClass parent_class;

  void (* pressed)  (GtkButton *button);
  void (* released) (GtkButton *button);
  void (* clicked)  (GtkButton *button);
  void (* enter)    (GtkButton *button);
  void (* leave)    (GtkButton *button);
};

当将一个按钮视为容器时(例如,当调整它的大小时),它的类别结构被转换为 GtkContainerClass,并且相应的栏位用于处理信号。

每一个元件也有一个结构,它是创建每个实体的基础。该结构有为每个元件的实体存储不同讯息的栏位。我们把该结构称为物件结构。如下是按钮类别:

struct _GtkButton
{
  GtkContainer container;

  GtkWidget *child;

  guint in_button : 1;
  guint button_down : 1;
};

请注意,它同类别结构相似,第一个栏位是父类别的物件结构,因此该结构在需要时可以转换为父类别的物件结构。

Comments are closed.