□ GtkHBox
— однострочный горизонтальный упаковочный контейнер;
□ GtkVBox
— одностолбцовый вертикальный упаковочный контейнер.
После создания упаковочных контейнеров следует задать два параметра: homogeneous
и spacing
:
GtkWidget* gtk_hbox_new(gboolean homogeneous, gint spacing);
GtkWidget* gtk_vbox_new(gboolean homogeneous, gint spacing);
Эти параметры управляют компоновкой всех виджетов в конкретном упаковочном контейнере. Параметр homogeneous
— логический, если он равен TRUE
, виджеты занимают одинаковую площадь независимо от их индивидуальных размеров. Параметр spacing
задает расстояние между виджетами в пикселах.
После того как упаковочный контейнер создан, добавьте в него виджеты с помощью функций gtk_box_pack_start
и gtk_box_pack_end
:
void gtk_box_pack_start(GtkBox *box, GtkWidget *child,
gboolean expand, gboolean f ill, guint padding);
void gtk_box_pack_end(GtkBox *box, GtkWidget *child,
gboolean expand, gboolean fill, guint padding);
Функция gtk_box_pack_start
вставляет виджеты, начиная от левого края контейнера GtkHBox
и нижнего края контейнера GtkVBox
; функция gtk_box_pack_end
, наоборот, начинает от правого и верхнего краев контейнера. Параметры функций управляют расстоянием между виджетами и форматом каждого виджета, находящегося в упаковочном контейнере.
В табл. 16.1 описаны параметры, которые вы можете передавать в функцию gtk_box_pack_start
или gtk_box_pack_end
.
Параметр | Описание |
---|---|
GtkBox *box | Заполняемый упаковочный контейнер |
GtkWidget *child | Виджет, который следует поместить в упаковочный контейнер |
gboolean expand | Если равен TRUE , данный виджет занимает все доступное пространство, используемое совместно с другими виджетами, у которых этот флаг также равен TRUE |
gboolean fill | Если равен TRUE , данный виджет будет занимать всю доступную площадь вместо использования ее как отступа от краев. Действует, только если флаг expand равен TRUE |
guint padding | Размер отступа вокруг виджета в пикселах |
Давайте теперь рассмотрим эти виджеты упаковочных контейнеров и создадим более сложный пользовательский интерфейс, демонстрирующий вложенные упаковочные контейнеры (упражнение 16.3).
В этом примере вы спланируете размещение нескольких простых виджетов-меток типа GtkLabel
с помощью контейнеров типа GtkHBox
и GtkVBox
. Виджеты-метки — простые графические элементы, подходящие для вывода коротких текстовых фрагментов. Назовите эту программу container.c:
#include
void closeApp(GtkWidget *window, gpointer data) {
gtk_main_quit();
}
/* Обратный вызов позволяет приложению отменить событие
close/destroy. (Для отмены возвращает TRUE.) */
gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) {
printf("In delete_event\n");
return FALSE;
}
int main (int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *label1, *label2, *label3;
GtkWidget *hbox;
GtkWidget *vbox;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW window), "The Window Title");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WTNDOW(window), 300, 200);
g_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(closeApp), NULL);