Следующий код создает таблицу с четырьмя ячейками и тремя детьми; один
ребенок покрывает две ячейки. Дети упакованы с использованием различных
параметров:
GtkWidget *window;
GtkWidget *button;
GtkWidget *container;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
container = gtk_table_new(2, 2, FALSE);
gtk_container_add(GTK_CONTAINER(window), container);
gtk_window_set_title(GTK_WINDOW(window), "Table Attaching");
gtk_container_set_border_width(GTK_CONTAINER(container), 10);
/* This would be a bad idea in real code; but it lets us
* experiment with window resizing. */
gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, TRUE);
gtk_signal_connect(GTK_OBJECT(window), "delete_event",
GTK_SIGNAL_FUNC(delete_event_cb), NULL);
button = gtk_button_new_with_label("1. Dosn't shrink\nor expand");
gtk_table_attach(GTK_TABLE(container), button, 0, 1, 0, 1,
GTK_FILL, GTK_FILL, 0, 0);
button = gtk_button_new_with_label("2. Expands and shrinks\nvertically");
gtk_table_attach(GTK_TABLE(container), button, 0, 1, 1, 2,
GTK_FILL, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
0, 0);
button = gtk_button_new_with_label("3. Expands and shrinks\n"
"in both directions");
gtk_table_attach(GTK_TABLE(container), button, 1, 2, 0, 2,
GTK_FILL | GTK_EXPAND | GTK_SHRINK,
GTK_FILL | GTK_EXPAND | GTK_SHRINK, 0, 0);
Поучительно посмотреть на результирующую таблицу после изменения размеров окна. Сначала, краткое изложение того, как присоединяются дети:
Натуральный размер окна показан на рисунке 3..9; заметьте, что некоторым ячейкам выделено больше места, чем потребовали виджеты внутри них, потому что ячейки таблицы должны оставаться выровненными. (Вспомните, что кнопка с меткой будет требовать достаточно места только для показа метки целиком.) Флаг "GTK_FILL" заставляет GtkTable выделять дополнительное место для самих виджетов, вместо заполнения пустым местом промежутков вокруг них.
Теперь представьте, что пользователь расширяет окно по вертикали; заметьте, что дополнительное пространство добавилось к виджетам с включенным "GTK_EXPAND" в направлении Y -- а именно виджетам два и три -- в то время как виджет в левом верхнем углу остается неизменным. Рисунок 3..10 показывает это состояние дел.
Далее, представьте, что пользователь расширил окно горизонтально; только дочерний виджет номер три может расширяться горизонтально. Рисунок 3..11 это показывает.
Рисунок 3..12 показывает результат после уменьшения вертикальных размеров таблицы, таким образом недостаточно места по вертикали, чтобы выделить виджетам то, что они запросили. Ребенок номер два получился укороченным, тогда как ребенок номер один получает все вертикальное место, которое ему требуется.
И, наконец, рисунок 3..13 показывает результат того, что пользователь уменьшил горизонтальные размеры таблицы. Ребенок номер три в этой ситуации получает короткий конец палки.
Неплохо было бы попытаться менять размеры вашего окна вышеприведенным образом всякий раз, когда вы проектируете раскладку, чтобы быть уверенным, что все проходит нормально. Определение нормальности варьируется в зависимости от конкретных виджетов, которые вы помещаете в раскладку.