GTK+ 2.0 Tutorial |
||
---|---|---|
Packing Widgets |
#include <stdio.h>
#include <stdlib.h>
#include "gtk/gtk.h"
gint delete_event( GtkWidget *widget,
GdkEvent *event,
gpointer data )
{
gtk_main_quit ();
return FALSE;
}
/* Создаём контейнер hbox заполненный кнопками с ярлыками.
* Передаём функции интересующие аргументы.
* Отображается только содержимое контейнера. */
GtkWidget *make_box( gboolean homogeneous,
gint spacing,
gboolean expand,
gboolean fill,
guint padding )
{
GtkWidget *box;
GtkWidget *button;
char padstr[80];
/* Создаём новый контейнер hbox соответствующий homogeneous
* и установкам интервала */
box = gtk_hbox_new (homogeneous, spacing);
/* Создаём ряд кнопок с соответствующими параметрами */
button = gtk_button_new_with_label ("gtk_box_pack");
gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
gtk_widget_show (button);
button = gtk_button_new_with_label ("(box,");
gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
gtk_widget_show (button);
button = gtk_button_new_with_label ("button,");
gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
gtk_widget_show (button);
/* Создаём кнопку с надписью в зависимости от расширения */
if (expand == TRUE)
button = gtk_button_new_with_label ("TRUE,");
else
button = gtk_button_new_with_label ("FALSE,");
gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
gtk_widget_show (button);
/* Тоже, что и выше, но в другой форме */
button = gtk_button_new_with_label (fill ? "TRUE," : "FALSE,");
gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
gtk_widget_show (button);
sprintf (padstr, "%d);", padding);
button = gtk_button_new_with_label (padstr);
gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
gtk_widget_show (button);
return box;
}
int main( int argc,
char *argv[])
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *box1;
GtkWidget *box2;
GtkWidget *separator;
GtkWidget *label;
GtkWidget *quitbox;
int which;
/* Обязательный init, не забывайте об этом! :) */
gtk_init (&argc, &argv);
if (argc != 2) {
fprintf (stderr, "usage: packbox num, where num is 1, 2, or 3.\n");
/* Очищаем поток выхода GTK и выходим со статусом 1. */
exit (1);
}
which = atoi (argv[1]);
/* Создаём основное окно */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* Нужно всегда подключать сигнал delete_event к основному окну
* Это необходимо для интуитивного поведения */
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (delete_event), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
/* Создаём вертикальный контейнер (vbox) для упаковки в него горизонтальных контейнеров
* Это позволяет располагать горизонтальные контейнеры с кнопками один над другим. */
box1 = gtk_vbox_new (FALSE, 0);
/* Выбор отображения примеров */
switch (which) {
case 1:
/* создаём новый ярлык. */
label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");
/* Выравниваем ярлык по левому краю. Эту функцию мы обсудим в секции Widget Attributes. */
gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
/* Упаковываем ярлык в вертикальный контейнер (vbox box1).
* Помните, что виджеты упакованные в vbox располагаются один над другим. */
gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
/* Показываем ярлык */
gtk_widget_show (label);
/* Вызов функции контейнера - homogeneous = FALSE, spacing = 0,
* expand = FALSE, fill = FALSE, padding = 0 */
box2 = make_box (FALSE, 0, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
gtk_widget_show (box2);
/* Вызов функции контейнера - homogeneous = FALSE, spacing = 0,
* expand = TRUE, fill = FALSE, padding = 0 */
box2 = make_box (FALSE, 0, TRUE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
gtk_widget_show (box2);
/* Аргументы: homogeneous, spacing, expand, fill, padding */
box2 = make_box (FALSE, 0, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
gtk_widget_show (box2);
/* Создаём сепаратор, они достаточно просты, мы обсудим их позже. */
separator = gtk_hseparator_new ();
/* Помещаем сепаратор в vbox.*/
gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
gtk_widget_show (separator);
/* Создаём другой ярлык и отображаем его. */
label = gtk_label_new ("gtk_hbox_new (TRUE, 0);");
gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
gtk_widget_show (label);
/* Аргументы: homogeneous, spacing, expand, fill, padding */
box2 = make_box (TRUE, 0, TRUE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
gtk_widget_show (box2);
/* Аргументы: homogeneous, spacing, expand, fill, padding */
box2 = make_box (TRUE, 0, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
gtk_widget_show (box2);
/* Ещё один сепаратор. */
separator = gtk_hseparator_new ();
/* Последние три аргумента gtk_box_pack_start:
* expand, fill, padding. */
gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
gtk_widget_show (separator);
break;
case 2:
/* Создаём новый ярлык, помните box1 это vbox созданный
* в начале main() */
label = gtk_label_new ("gtk_hbox_new (FALSE, 10);");
gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
gtk_widget_show (label);
/* Аргументы: homogeneous, spacing, expand, fill, padding */
box2 = make_box (FALSE, 10, TRUE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
gtk_widget_show (box2);
separator = gtk_hseparator_new ();
/* Последние три аргумента gtk_box_pack_start:
* expand, fill, padding. */
gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
gtk_widget_show (separator);
label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");
gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
gtk_widget_show (label);
case 3:
/* Демонстрация использования gtk_box_pack_end() для правого выравнивания виджетов.
* Сначала создаём контейнер как и прежде*/
box2 = make_box (FALSE, 0, FALSE, FALSE, 0);
/* Создаём ярлык, который будет размещён в конце */
label = gtk_label_new ("end");
/* Упаковываем используя gtk_box_pack_end(), размещая таким образом
* hbox созданный вызовом make_box() по правой стороне. */
gtk_box_pack_end (GTK_BOX (box2), label, FALSE, FALSE, 0);
/* Показываем ярлык */
gtk_widget_show (label);
/* Упаковываем box2 в box1 (vbox помните ? :) */
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
gtk_widget_show (box2);
/* Сепаратор для основания. */
separator = gtk_hseparator_new ();
/* Явно определяем ширину сепаратора в 400 pixels и высоту в 5 pixels.
* hbox который мы создали также будет 400 pixels в ширину,
* а ярлык "end" будет отделен от других ярлыков в hbox.
* Иначе все виджеты в hbox будут расположены вплотную друг к другу */
gtk_widget_set_size_request (separator, 400, 5);
/* упаковываем сепаратор в hbox (box1) созданный в начале main() */
gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
gtk_widget_show (separator);
}
/* Создаём новый hbox. Помните, их может быть столько - сколько нужно! */
quitbox = gtk_hbox_new (FALSE, 0);
/* Кнопка выхода. */
button = gtk_button_new_with_label ("Quit");
/* Устанавливаем сигнал для закрытия программы при нажатии кнопки */
g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_main_quit),
G_OBJECT (window));
/* Упаковываем кнопку в quitbox.
* Последние три аргумента gtk_box_pack_start are:
* expand, fill, padding. */
gtk_box_pack_start (GTK_BOX (quitbox), button, TRUE, FALSE, 0);
/* Упаковываем quitbox в vbox (box1) */
gtk_box_pack_start (GTK_BOX (box1), quitbox, FALSE, FALSE, 0);
/* Упаковываем vbox (box1), который теперь содержит все наши виджеты, в главное окно. */
gtk_container_add (GTK_CONTAINER (window), box1);
/* Показываем всё остальное */
gtk_widget_show (button);
gtk_widget_show (quitbox);
gtk_widget_show (box1);
/* Последним выводим для отображения главное окно, таким образом всё отображается одновременно */
gtk_widget_show (window);
/* И конечно главная функция */
gtk_main ();
/* Сюда контроль попадает после вызова gtk_main_quit(),но не после использования exit(). */
return 0;
}
|
Details of Boxes |
Packing Using Tables |