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+, нужно понять, как наилучшим образом использовать имеющиеся в комплекте виджеты.
В этом разделе мы рассмотрим API самых популярных виджетов GTK+, которые вы будете применять чаще всего в своих приложениях.
GtkWindow
— базовый элемент всех приложений GTK+. До сих пор вы использовали его для хранения своих виджетов.
GtkWidget
+---- GtkContainer
+---- GtkBin
+---- GtkWindow
Существуют десятки вызовов API GtkWindow
, но далее приведены функции, заслуживающие особого внимания.
GtkWidget* gtk_window_new(GtkWindowType type);
void gtk_window_set_title(GtkWindow *window, const gchar *title);
void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position);
void gtk_window_set_default_size(GtkWindow *window, gint width, gint height);
void gtk_window_resize(GtkWindow *window, gint width, gint height);
void gtk_window_set_resizable(GtkWindow *window, gboolean resizable);
void gtk_window_present(GtkWindow *window);
void gtk_window_maximize(GtkWindow *window);
void gtk_window_unmaximize(GtkWindow *window);
Как вы видели, функция gtk_window_new
создает в памяти новое пустое окно. Заголовок окна не задан и размер и местоположение окна не определены. Обычно вы будете заполнять окно виджетами и задавать меню и панель инструментов перед выводом окна на экран с помощью вызова функции gtk_widget_show
.
Функция gtk_window_set_title
изменяет текст полосы заголовка, информируя оконный менеджер запроса.
Поскольку за отображение оформления окна отвечает оконный менеджер, а не библиотека GTK+, шрифт, цвет и размер текста зависят от вашего выбора оконного менеджера.
Функция gtk_window_setposition
управляет начальным местоположением на экране. Параметр position
может принимать пять значений, перечисленных в табл. 16.2.