Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
}int main(int argc, char* argv[]) { GtkWidget *window; GtkWidget *button; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); button = gtk_button_new_with_label("Hello World!"); gtk_container_add(GTK_CONTAINER(window), button); g_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(button_clicked), "Button 1"); gtk_widget_show(button); gtk_widget_show(window); gtk_main(); return 0;}Введите исходный текст программы и сохраните его в файле с именем gtk2.c. Откомпилируйте и скомпонуйте программу аналогично программе gtk1.с из предыдущего упражнения. Запустив ее, вы получите окно с кнопкой. При каждом щелчке кнопки мышью будет выводиться короткое сообщение (рис. 16.5).

Рис. 16.5
Как это работает
Вы добавили два новых элемента в программу gtk2.c: виджет
GtkButtonGtkButtonclickedФункция обратного вызова
button_clickedclickedg_signal_connectg_signal_connect(GTK_OBJECT(app), "clicked", GTK_SIGNAL_FUNC(button_clicked), "Button 1");Обратите внимание на то, что имя кнопки — "Button 1" — передается в функцию обратного вызова как данные пользователя.
Весь остальной добавленный программный код касается виджета кнопки, создаваемой так же, как окно — вызовом функции
gtk_button_new_with_labelgtk_widget_showДля расположения кнопки в окне вызывается функция
gtk_container_addGtkWidgetGtkContainervoid gtk_container_add(GtkContainer* container, GtkWidget *widget);Как вы уже знаете,
GtkWindowGtkContainerGtkContainerGTK_CONTAINERgtk_container_add(GTK_CONTAINER(window), button);Функция
gtk_container_addВиджеты упаковочных контейнеров
Компоновка GUI исключительно важна для удобства применения интерфейса, и добиться наилучшей компоновки труднее всего. Реальная трудность в размещении виджетов заключается в том, что вы не можете полагаться на наличие у всех пользователей одинаковых размеров окон, тем, шрифтов и цветовых схем. То, что может быть отличным интерфейсом для одной системы, в другой системе может оказаться просто нечитаемым.
Для создания GUI, который выглядит одинаково во всех системах, вам необходимо избегать размещения виджетов на основе абсолютных координат и использовать более гибкую систему компоновки. У GTK+ есть для этой цели виджеты контейнеров. Виджеты-контейнеры позволяют управлять компоновкой виджетов в окнах вашего приложения. Виджеты упаковочных контейнеров (box) представляют очень удобный тип виджета-контейнера. GTK+ предлагает множество виджетов-контейнеров других типов, описанных в интерактивной документации к GTK+.
Виджеты упаковочных контейнеров — невидимые виджеты, задача которых — хранить другие виджеты и управлять их компоновкой или схемой размещения. Для управления размером отдельных виджетов, содержащихся в виджете упаковочного контейнера, вы задаете правила вместо координат. Поскольку виджеты упаковочных контейнеров могут содержать любые объекты
GtkWidgetGtkBoxGtkWidgetУ типа
GtkBox□
GtkHBox□
GtkVBoxПосле создания упаковочных контейнеров следует задать два параметра:
homogeneousspacing<b>GtkWidget* gtk_hbox_new(gboolean homogeneous, gint spacing);</b><b>GtkWidget* gtk_vbox_new(gboolean homogeneous, gint spacing);</b>Эти параметры управляют компоновкой всех виджетов в конкретном упаковочном контейнере. Параметр
homogeneousTRUEspacingПосле того как упаковочный контейнер создан, добавьте в него виджеты с помощью функций
gtk_box_pack_startgtk_box_pack_end<b>void gtk_box_pack_start(GtkBox *box, GtkWidget *child,</b><b> gboolean expand, gboolean f ill, guint padding);</b><b>void gtk_box_pack_end(GtkBox *box, GtkWidget *child,</b><b> gboolean expand, gboolean fill, guint padding);</b>Функция
gtk_box_pack_startGtkHBoxGtkVBoxgtk_box_pack_end