The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

GTK+ 2.0 Tutorial

<<< Previous

Packing Widgets

Next >>>


Демонстрационная программа упаковки

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

<<< Previous

Home

Next >>>

Details of Boxes

Up

Packing Using Tables






Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру