Програмирование ГПИ с использованием GTK - часть 2.

ArticleCategory:

SoftwareDevelopment

AuthorImage:

Ozcan Gungor

TranslationInfo:

original in tr Özcan Güngör
en to tr Özcan Güngör
en to ru Юрий Дешко

AboutTheAuthor:

Использую Linux с 1997.Свобода,гибкость и открытость кода. Это те качества, которые мне нравятся.

Abstract

В этой статье мы обсудим ящики ( боксы-boxes ).С их помощью мы сможем располагать компоненты в соответствующем порядке в окнах.Для того чтобы понять эти статьи вам необходимы следующие знания о языке программирования C: вдобавок рекомендуется прочитать предыдущую статью..

ArticleIllustration:

GTK

ArticleBody:

Упаковка компонентов с помощью ящиков.

Под упаковкой компонентов подразумевается их размещение в подходящем порядке в окнах.Один из способов в GTK сделать это -- использовать ящики.Основная идея ящиков -- упаковка компонентов, упорядоченных в горизонтальном или вертикальном направлении.Существуют два типа ящиков: горизонтальные и вертикальные.Разберемся в этих типах:

Горизонтальные ящики.

В ящиках этого типа , компоненты упаковываются горизонтально.Для создания горизонтального ящика используется следующая функция:

gtk_widget *box;
box=gtk_hbox_new(gboolean homogenous, gint spacing);

где параметр homogeneous используется для того ,чтобы определить, будут ли компоненты распределены однородно: если он равен TRUE, то компонетны заполняют весь ящик таким образом что между ними одинаковое расстояние, если FALSE то компоненты упаковываются вплотную друг к другу.spacing используется для установки минимального расстояния между компонентами.

Вертикальные ящики

В ящиках этого типа компоненты упаковываются вертикально.Для этого используется следующая функция:

gtk_widget *box;
box=gtk_vbox_new(gboolean homogenous, gint spacing);

Параметры этой функции имеют такое же значения как и у горизонтального ящика.

Общие свойства ящиков.

Добавление компонент можно осуществить двумя путями:
Первый:

gtk_box_pack_start(GtkBox *box,GtkWidget *child, 
                  gboolean expand, gboolean fill, guint padding);
Используя эту функцию ,мы можем добавлять компоненты в ящик.(слева направо для горизонтального ящика и сверху вниз для вертикального).box -- это ящик в который мы хотим добавить компонент. child -- добавляемый компонент .. expand используется для расширения компонент таким образом что они используют если возможно все пространство. padding добавляет дополнительное пространство слева и справа.

Дополняющей к gtk_box_pack_start является gtk_box_pack_end:

gtk_box_pack_end(GtkBox *box,GtkWidget *child, 
                gboolean expand, gboolean fill, guint padding);
Эта функция позволяет нам добавлять компоненты с конца (справа или снизу ) ящика.Параметры имеют тот же смысл что и в предыдущей функции.

Для добавления ящика в окно используется следующая функция:

gtk_container_add (GtkContainer *container,GtkWidget *component);
container -- это окно в которое будет добавлен ящик,component это добавляемый ящик.Например, чтобы добавить ящик в window, созданное до этого, используется следующая команда:
gtk_container_add(GTK_CONTAINER(window),box);
gtk_box_set_homogeneous (GtkBox *box, gboolean homogenous);
gtk_box_set_spacing(GtkBox *box, gint spacing);
Первая функция используется для изменения свойства однородности ящика, а вторая функция используется для изменения размера пространства между компонентами в box. box -- изменяемый ящик.
gtk_box_set_child_packing(GkBox *box,GtkWidget *shild, 
       gboolean expand, gboolean  fill, guint padding, 
       GtkPackType packingtype);
Эта функция переопределяет свойства уже упакованных компонент.Параметры имеют такое же значение, как в функции gtk_box_pack_start. packingtype может быть GTK_PACK_START или GTK_PACK_END. GTK_PACK_START заставляет упаковывать компоненты с начала ,если для упаковки компонента используется функция gtk_pack_end. GTK_PACK_END заставляет упаковывать компоненты с конца при использовании функции gtk_pack_start.

Чтобы лучше это понять попробуйте kutular.c.

Таблицы

Таблицы как и в HTML коде помогают нам размещать компоненты в ячейках.Для этого достаточно создать таблицу с нужным числом строк и столбцов.После этого, мы можем помещать компонет в ячейку или группу ячеек ( допустимо использовать лишь ячейки имеющие общую сторону).Чтобы создать таблицу использутся следующая функция :

GtkWidget *table;
GtkWidget* gtk_table_new(guint  row, guint column, gboolean homogenous);
row это число строк, column - число столбцов..homogenous используется для однородного размещения компонентов.

Для добавления компонентов в таблицу используется следующая функция:

void gtk_table_attach (GtkTable *table, GtkWidget *child, 
         guint left_attach, guint left_attach, guint top_attach,
         guint bottom_attach, GtkAttachOptions xoptions, 
         GtkAttachOptions yoptions, guint xpadding, guint ypadding);
table -- таблица ,куда будут добавляться компоненты, а child -- это добавляемый компонент. left_attach номер ячейки слева к которой будет присоединяться компонент.right_attach -- номер ячейки справа. top_attach -- номер ячейки сверху а bottom_attach -- снизу.Компоненты могут накрывать более одной ячейки.

xoptions и yoptions могут принимать три разных значения:GTK_FILL, GTK_EXPAND, GTK_SHRINK. GTK_FILL заставляет компонеты заполнять всю ячейку(и). GTK_EXPAND помещает компонент в центр ячейки (ячеек) и GTK_SHRINK заставляет его принять размер ячейки если компонент больше.xoptions применяет эти изменения только по оси x а yoptions по оси y..

xpadding добавляет пространство слева и справа от компонента по оси x а ypadding по оси y.

Вот пример кода:

#include <gtk/gtk.h>

void delete_event( GtkWidget *widget,GdkEvent  *event,gpointer data )
{
    gtk_main_quit ();
}

int main( int   argc,char *argv[] )
{
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *table;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                        GTK_SIGNAL_FUNC (delete_event), NULL);

    table = gtk_table_new (2, 2, TRUE);

    gtk_container_add (GTK_CONTAINER (window), table);

    button = gtk_button_new_with_label ("button 1");
    gtk_table_attach(GTK_TABLE(table), button, 0, 1, 0, 2,GTK_SHRINK,
                     GTK_SHRINK,0,0);
    gtk_widget_show (button);

    button = gtk_button_new_with_label ("button 2");
    gtk_table_attach (GTK_TABLE(table), button, 1, 2, 1, 2,
                      GTK_SHRINK,GTK_SHRINK,0,0);
    gtk_widget_show (button);
    
    button = gtk_button_new_with_label ("button 3");
    gtk_table_attach (GTK_TABLE(table), button, 1, 2, 0, 1,
                      GTK_SHRINK,GTK_SHRINK,0,0);
    gtk_widget_show (button);

    gtk_widget_show (table);
    gtk_widget_show (window);

    gtk_main ();

    return 0;
}

Поскольку функция gtk_table_attach имеет много параметров, то создана новая более короткая функция: gtk_table_attach_defaults. Это функция делает тоже самое, но с меньшим числом параметров.

void gtk_table_attach_defaults (GtkTable *table,GtkWidget *child, 
                guint left_attach, guint right_attach, guint top_attach, 
                guint bottom_attach); 
Параметры здесь имеют то же значение.xoptions и yoptions имеет значение GTK_FILL|GTK_EXPAND. xpadding и ypadding имеют значение 0.

Следующая функция используется для изменения числа строк и столбцов существующей таблицы:

void gtk_table_resize(GtkTable *table, guint rows, guint columns);

Используя следующие функции вы можете изменить значение дополнительного пространства между определенными строками и столбцами:

void gtk_table_set_row_spacing (GtkTable *table, guint row, 
                               guint spacing);
void gtk_table_set_col_spacing (GtkTable *table, guint column, 
                               guint spacing);

Следующие функции изменяют величину пространства для всех строк и столбцов:

void gtk_table_set_row_spacings (GtkTable *table, guint spacing);
void gtk_table_set_col_spacings (GtkTable *table, guint spacing);

Эта функция изменяет значение однородности существующей таблицы:

void gtk_table_set_homogeneous (GtkTable *table, gboolean homogenous);

Заключение

В этой статье мы изучили средства упаковки компонентов а затем мы ознакомились с некоторыми свойствами ящиков и таблиц.Я всегда счастлив получить вопросы, комментарии и идеи от читателей.Просто пошлите мне электронное письмо...