Под упаковкой компонентов подразумевается их размещение в подходящем порядке в окнах.Один из способов в GTK сделать это -- использовать ящики.Основная идея ящиков -- упаковка компонентов, упорядоченных в горизонтальном или вертикальном направлении.Существуют два типа ящиков: горизонтальные и вертикальные.Разберемся в этих типах:
В ящиках этого типа , компоненты упаковываются горизонтально.Для создания горизонтального ящика используется следующая функция:
gtk_widget *box; box=gtk_hbox_new(gboolean homogenous, gint spacing);
где параметр homogeneous используется для того ,чтобы определить, будут ли компоненты распределены однородно: если он равен TRUE, то компонетны заполняют весь ящик таким образом что между ними одинаковое расстояние, если FALSE то компоненты упаковываются вплотную друг к другу.spacing используется для установки минимального расстояния между компонентами.
В ящиках этого типа компоненты упаковываются вертикально.Для этого используется следующая функция:
gtk_widget *box; box=gtk_vbox_new(gboolean homogenous, gint spacing);
Параметры этой функции имеют такое же значения как и у горизонтального ящика.
Добавление компонент можно осуществить двумя путями:
Первый:
gtk_box_pack_start(GtkBox *box,GtkWidget *child, gboolean expand, gboolean fill, guint padding);Используя эту функцию ,мы можем добавлять компоненты в ящик.(слева направо для горизонтального ящика и сверху вниз для вертикального).box -- это ящик в который мы хотим добавить компонент. child -- добавляемый компонент .. expand используется для расширения компонент таким образом что они используют если возможно все пространство. padding добавляет дополнительное пространство слева и справа.
Дополняющей к gtk_box_pack_start является gtk_box_pack_end:
gtk_box_pack_end(GtkBox *box,GtkWidget *child, gboolean expand, gboolean fill, guint padding);Эта функция позволяет нам добавлять компоненты с конца (справа или снизу ) ящика.Параметры имеют тот же смысл что и в предыдущей функции.
Для добавления ящика в окно используется следующая функция:
gtk_container_add (GtkContainer *container,GtkWidget *component);container -- это окно в которое будет добавлен ящик,component это добавляемый ящик.Например, чтобы добавить ящик в window, созданное до этого, используется следующая команда:
gtk_container_add(GTK_CONTAINER(window),box);
gtk_box_set_homogeneous (GtkBox *box, gboolean homogenous); gtk_box_set_spacing(GtkBox *box, gint spacing);Первая функция используется для изменения свойства однородности ящика, а вторая функция используется для изменения размера пространства между компонентами в box. box -- изменяемый ящик.
gtk_box_set_child_packing(GkBox *box,GtkWidget *shild, gboolean expand, gboolean fill, guint padding, GtkPackType packingtype);Эта функция переопределяет свойства уже упакованных компонент.Параметры имеют такое же значение, как в функции gtk_box_pack_start. packingtype может быть GTK_PACK_START или GTK_PACK_END. GTK_PACK_START заставляет упаковывать компоненты с начала ,если для упаковки компонента используется функция gtk_pack_end. GTK_PACK_END заставляет упаковывать компоненты с конца при использовании функции gtk_pack_start.
Чтобы лучше это понять попробуйте kutular.c.
Таблицы как и в HTML коде помогают нам размещать компоненты в ячейках.Для этого достаточно создать таблицу с нужным числом строк и столбцов.После этого, мы можем помещать компонет в ячейку или группу ячеек ( допустимо использовать лишь ячейки имеющие общую сторону).Чтобы создать таблицу использутся следующая функция :
GtkWidget *table; GtkWidget* gtk_table_new(guint row, guint column, gboolean homogenous);row это число строк, column - число столбцов..homogenous используется для однородного размещения компонентов.
Для добавления компонентов в таблицу используется следующая функция:
void gtk_table_attach (GtkTable *table, GtkWidget *child, guint left_attach, guint left_attach, guint top_attach, guint bottom_attach, GtkAttachOptions xoptions, GtkAttachOptions yoptions, guint xpadding, guint ypadding);table -- таблица ,куда будут добавляться компоненты, а child -- это добавляемый компонент. left_attach номер ячейки слева к которой будет присоединяться компонент.right_attach -- номер ячейки справа. top_attach -- номер ячейки сверху а bottom_attach -- снизу.Компоненты могут накрывать более одной ячейки.
xoptions и yoptions могут принимать три разных значения:GTK_FILL, GTK_EXPAND, GTK_SHRINK. GTK_FILL заставляет компонеты заполнять всю ячейку(и). GTK_EXPAND помещает компонент в центр ячейки (ячеек) и GTK_SHRINK заставляет его принять размер ячейки если компонент больше.xoptions применяет эти изменения только по оси x а yoptions по оси y..
xpadding добавляет пространство слева и справа от компонента по оси x а ypadding по оси y.
Вот пример кода:
#include <gtk/gtk.h> void delete_event( GtkWidget *widget,GdkEvent *event,gpointer data ) { gtk_main_quit (); } int main( int argc,char *argv[] ) { GtkWidget *window; GtkWidget *button; GtkWidget *table; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); table = gtk_table_new (2, 2, TRUE); gtk_container_add (GTK_CONTAINER (window), table); button = gtk_button_new_with_label ("button 1"); gtk_table_attach(GTK_TABLE(table), button, 0, 1, 0, 2,GTK_SHRINK, GTK_SHRINK,0,0); gtk_widget_show (button); button = gtk_button_new_with_label ("button 2"); gtk_table_attach (GTK_TABLE(table), button, 1, 2, 1, 2, GTK_SHRINK,GTK_SHRINK,0,0); gtk_widget_show (button); button = gtk_button_new_with_label ("button 3"); gtk_table_attach (GTK_TABLE(table), button, 1, 2, 0, 1, GTK_SHRINK,GTK_SHRINK,0,0); gtk_widget_show (button); gtk_widget_show (table); gtk_widget_show (window); gtk_main (); return 0; }
Поскольку функция gtk_table_attach имеет много параметров, то создана новая более короткая функция: gtk_table_attach_defaults. Это функция делает тоже самое, но с меньшим числом параметров.
void gtk_table_attach_defaults (GtkTable *table,GtkWidget *child, guint left_attach, guint right_attach, guint top_attach, guint bottom_attach);Параметры здесь имеют то же значение.xoptions и yoptions имеет значение GTK_FILL|GTK_EXPAND. xpadding и ypadding имеют значение 0.
Следующая функция используется для изменения числа строк и столбцов существующей таблицы:
void gtk_table_resize(GtkTable *table, guint rows, guint columns);
Используя следующие функции вы можете изменить значение дополнительного пространства между определенными строками и столбцами:
void gtk_table_set_row_spacing (GtkTable *table, guint row, guint spacing); void gtk_table_set_col_spacing (GtkTable *table, guint column, guint spacing);
Следующие функции изменяют величину пространства для всех строк и столбцов:
void gtk_table_set_row_spacings (GtkTable *table, guint spacing); void gtk_table_set_col_spacings (GtkTable *table, guint spacing);
Эта функция изменяет значение однородности существующей таблицы:
void gtk_table_set_homogeneous (GtkTable *table, gboolean homogenous);
В этой статье мы изучили средства упаковки компонентов а затем мы ознакомились с некоторыми свойствами ящиков и таблиц.Я всегда счастлив получить вопросы, комментарии и идеи от читателей.Просто пошлите мне электронное письмо...