#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;
}
|