Пример на GtkTable

Следующий код создает таблицу с четырьмя ячейками и тремя детьми; один ребенок покрывает две ячейки. Дети упакованы с использованием различных параметров: 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);

Поучительно посмотреть на результирующую таблицу после изменения размеров окна. Сначала, краткое изложение того, как присоединяются дети:

  1. Первый ребенок всегда получает свой затребованный размер; он не расширяется и не урезается.
  2. Второй ребенок может расширяться и урезаться только в направлении оси Y.
  3. Третий ребенок может расширяться и обрезаться в любом направлении.

Натуральный размер окна показан на рисунке 3..9; заметьте, что некоторым ячейкам выделено больше места, чем потребовали виджеты внутри них, потому что ячейки таблицы должны оставаться выровненными. (Вспомните, что кнопка с меткой будет требовать достаточно места только для показа метки целиком.) Флаг "GTK_FILL" заставляет GtkTable выделять дополнительное место для самих виджетов, вместо заполнения пустым местом промежутков вокруг них.

Рисунок 3..9: GtkTable перед изменением размеров

Теперь представьте, что пользователь расширяет окно по вертикали; заметьте, что дополнительное пространство добавилось к виджетам с включенным "GTK_EXPAND" в направлении Y -- а именно виджетам два и три -- в то время как виджет в левом верхнем углу остается неизменным. Рисунок 3..10 показывает это состояние дел.

Рисунок 3..10: GtkTable после вертикального расширения

Далее, представьте, что пользователь расширил окно горизонтально; только дочерний виджет номер три может расширяться горизонтально. Рисунок 3..11 это показывает.

Рисунок 3..11: GtkTable после горизонтального расширения

Рисунок 3..12 показывает результат после уменьшения вертикальных размеров таблицы, таким образом недостаточно места по вертикали, чтобы выделить виджетам то, что они запросили. Ребенок номер два получился укороченным, тогда как ребенок номер один получает все вертикальное место, которое ему требуется.

Рисунок 3..12: GtkTable после вертикального сжатия

И, наконец, рисунок 3..13 показывает результат того, что пользователь уменьшил горизонтальные размеры таблицы. Ребенок номер три в этой ситуации получает короткий конец палки.

Рисунок 3..13: GtkTable после горизонтального сжатия

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


Linux Land
2000-09-15