В табл. 16.1 описаны параметры, которые вы можете передавать в функцию
gtk_box_pack_start
или
gtk_box_pack_end
.
Таблица 16.1
Параметр | Описание |
GtkBox *box
| Заполняемый упаковочный контейнер |
GtkWidget *child
| Виджет, который следует поместить в упаковочный контейнер |
gboolean expand
| Если равен TRUE , данный виджет занимает все доступное пространство, используемое совместно с другими виджетами, у которых этот флаг также равен TRUE
|
gboolean fill
| Если равен TRUE , данный виджет будет занимать всю доступную площадь вместо использования ее как отступа от краев. Действует, только если флаг expand равен TRUE
|
guint padding
| Размер отступа вокруг виджета в пикселах |
Давайте теперь рассмотрим эти виджеты упаковочных контейнеров и создадим более сложный пользовательский интерфейс, демонстрирующий вложенные упаковочные контейнеры (упражнение 16.3).
Упражнение 16.3. Макет виджета-контейнера
В этом примере вы спланируете размещение нескольких простых виджетов-меток типа
GtkLabel
с помощью контейнеров типа
GtkHBox
и
GtkVBox
. Виджеты-метки — простые графические элементы, подходящие для вывода коротких текстовых фрагментов. Назовите эту программу container.c:
#include <gtk/gtk.h>
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);
g_signal_connect(GTK_OBJECT(window), "delete_event",
GTK_SIGNAL_FUNC(delete_event), NULL);
label1 = gtk_label_new("Label 1");
label2 = gtk_label_new("Label 2");
label3 = gtk_label_new("Label 3");
hbox = gtk_hbox_new(TRUE, 5);
vbox = gtk_vbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(vbox), label1, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), label2, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox), label3, FALSE, FALSE, 5);
gtk_container_add(GTK_CONTAINER(window), hbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Когда вы выполните эту программу, то увидите следующую схему расположения виджетов-меток в вашем окне (рис. 16.6).
Рис. 16.6
Как это работает
Вы создаете два виджета упаковочных контейнеров:
hbox
и
vbox
. С помощью функции
gtk_box_pack_start
вы заполняете
vbox
виджетами
label1
и
label2
, причем
label2
располагается у нижнего края контейнера, потому что вставляется после
label1
. Далее контейнер
vbox
целиком наряду с меткой
label3
вставляется в контейнер
hbox
.
В заключение
hbox
добавляется в окно и выводится на экран с помощью функции
gtk_widget_show_all
.
Схему размещения упаковочного контейнера легче понять с помощью блок-схемы, показанной на рис. 16.7.
Рис. 16.7
Познакомившись с виджетами, сигналами, обратными вызовами и виджетами-контейнерами, вы рассмотрели основы комплекта инструментов GTK+. Но для того чтобы стать программистом, профессионально применяющим GTK+, нужно понять, как наилучшим образом использовать имеющиеся в комплекте виджеты.
Виджеты GTK+
В этом разделе мы рассмотрим API самых популярных виджетов GTK+, которые вы будете применять чаще всего в своих приложениях.
GtkWindow
GtkWindow
— базовый элемент всех приложений GTK+. До сих пор вы использовали его для хранения своих виджетов.
GtkWidget
+---- GtkContainer