Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

У типа

GtkBox
существуют два основных подкласса:

 

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
.

Таблица 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
.

Поделиться:
Популярные книги

Законы Рода. Том 3

Андрей Мельник
3. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 3

Надуй щеки! Том 5

Вишневский Сергей Викторович
5. Чеболь за партой
Фантастика:
попаданцы
дорама
7.50
рейтинг книги
Надуй щеки! Том 5

Неучтенный элемент. Том 1

NikL
1. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 1

Лихие. Смотрящий

Вязовский Алексей
2. Бригадир
Фантастика:
попаданцы
5.00
рейтинг книги
Лихие. Смотрящий

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Законы Рода. Том 14

Андрей Мельник
14. Граф Берестьев
Фантастика:
аниме
фэнтези
эпическая фантастика
5.00
рейтинг книги
Законы Рода. Том 14

Апокриф

Вайс Александр
10. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Апокриф

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

Антимаг его величества

Петров Максим Николаевич
1. Модификант
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Антимаг его величества

Позывной "Князь"

Котляров Лев
1. Князь Эгерман
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Позывной Князь

Я уже царь. Книга XXIX

Дрейк Сириус
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже царь. Книга XXIX