Литмир - Электронная Библиотека
Содержание  
A
A

В табл. 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).

Основы программирования в Linux - image056.jpg

Рис. 16.6

Как это работает

Вы создаете два виджета упаковочных контейнеров:

hbox
и
vbox
. С помощью функции
gtk_box_pack_start
вы заполняете
vbox
виджетами
label1
и
label2
, причем
label2
располагается у нижнего края контейнера, потому что вставляется после
label1
. Далее контейнер
vbox
целиком наряду с меткой
label3
вставляется в контейнер
hbox
.

В заключение

hbox
добавляется в окно и выводится на экран с помощью функции
gtk_widget_show_all
.

Схему размещения упаковочного контейнера легче понять с помощью блок-схемы, показанной на рис. 16.7.

Основы программирования в Linux - image057.jpg

Рис. 16.7

Познакомившись с виджетами, сигналами, обратными вызовами и виджетами-контейнерами, вы рассмотрели основы комплекта инструментов GTK+. Но для того чтобы стать программистом, профессионально применяющим GTK+, нужно понять, как наилучшим образом использовать имеющиеся в комплекте виджеты.

Виджеты GTK+

В этом разделе мы рассмотрим API самых популярных виджетов GTK+, которые вы будете применять чаще всего в своих приложениях.

GtkWindow

GtkWindow
— базовый элемент всех приложений GTK+. До сих пор вы использовали его для хранения своих виджетов.

GtkWidget

 +---- GtkContainer

284
{"b":"285844","o":1}