GTK+ 2.0 Tutorial

<<< Previous

Создание собственных виджетов (Writing Your Own Widgets)

Next >>>


Анатомия виджета

Перед тем как создавать собственный виджет, нужно иметь представление как GTK работает с объектами. Здесь приведен только краткий обзор, для более полной информации обратитесь к документации.

GTK виджеты выполнены в объектно ориентированном стиле. Однако написаны полностью на стандартном C. Это очень улучшает мобильность и стабильность по использованию текущего поколения C++ компиляторов; однако означает, что автор виджета должен обратить внимание на некоторые из деталей выполнения. Информация, обычная для всех случаев одного класса виджетов (например, для всех виджетов Кнопки) сохраняется в структуре класса (class structure).  Есть только одна копия, в которой сохранена информация о сигналах класса (которые действуют как действительные функции в C).  Чтобы поддерживать наследование, первая область в структуре класса должна быть копией структуры класса родителя.  Декларация структуры класса GtkButtton:

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, а важные области использованы обработчиками сигналов.

Есть также структура для каждого виджета, который создан на примере основного.  Эта структура имеет области, чтобы хранить информацию, которая является отличной для каждого виджета.  Мы назовем эту структуру object structure.  Для класса Кнопки, это выглядит так:

struct _GtkButton { GtkContainer container; GtkWidget *child; guint in_button : 1; guint button_down : 1; };

Отметьте, что как и в структуре класса первая область в структуре объекта должна быть копией родителя так, чтобы структура могла быть приведена к структуре объекта родительского класса как необходимо.


<<< Previous

Home

Next >>>

Writing Your Own Widgets

Up

Creating a Composite widget