Под упаковкой компонентов подразумевается их размещение в подходящем порядке в окнах.Один из способов в 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);
В этой статье мы изучили средства упаковки компонентов а затем мы ознакомились с некоторыми свойствами ящиков и таблиц.Я всегда счастлив получить вопросы, комментарии и идеи от читателей.Просто пошлите мне электронное письмо...