GUI-Programmierung mit GTK - Teil 2

ArticleCategory: [ArtikelKategorie]

SoftwareDevelopment

AuthorImage: [Bild des Autors]

Ozcan Gungor

TranslationInfo: [Autor und �bersetzer]

original in tr Özcan Güngör

tr to en Özcan Güngör

en to de Viktor Horvath

AboutTheAuthor: [�ber den Autor]

Ich benutze Linux seit 1997. Freiheit, Flexibilit�t, Open Source. Diese Eigenschaften mag ich.

Abstract: [Zusammenfassung]

In diesem Artikel werden wir Boxen und Tabellen besprechen. Damit werden wir in der Lage sein, Komponenten in einer geeigneten Ordnung in Fenstern abzulegen. Um den Artikel zu verstehen, solltest du folgendes in der Programmiersprache C kennen:

Und zus�tzlich ist es empfehlenswert, den vorherigen Artikel zu lesen.

ArticleIllustration: [Titelbild des Artikels]

GTK

ArticleBody: [Text des Artikels]

Komponenten in Boxen verpacken

Komponenten zu verpacken bedeutet, sie in einer geeigneten Ordnung in Fenstern abzulegen. Eine der M�glichkeiten, dies in GTK zu bewerkstelligen, ist die Verwendung von Boxen. Der Grundgedanke dahinter ist, die Komponenten vertikal oder horizontal geordnet darin abzulegen. Also gibt es zwei Arten von Boxen: horizontale und vertikale. Ich will das erl�utern.

Horizontale Boxen

In dieser Art von Box werden die Komponenten horizontal verpackt. Mit folgender Funktion wird eine horizontale Box erzeugt.

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

Dabei legt der Parameter homogenous fest, ob die Komponenten gleichm��ig verteilt werden oder nicht: ist er TRUE, f�llen sie die Box so aus, da� der Abstand zwischen ihnen gleich ist; ist er FALSE, werden die Komponenten nebeneinander gelegt. spacing gibt einen Minimalabstand an.

Vertikale Boxen

Hier werden die Komponenten vertikal verpackt. Mit folgender Funktion wird eine vertikale Box erzeugt:

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

Die Parameter haben dieselbe Bedeutung wie in der vorigen Funktion.

Typische Beispiele f�r Boxen

Das Hinzuf�gen von Komponenten kann auf zwei Weisen geschehen. Die erste ist:

gtk_box_pack_start(GtkBox *box,GtkWidget *child, 
                  gboolean expand, gboolean fill, guint padding);

Damit k�nnen wir Komponenten in eine Box legen (an die linke Seite einer horizontalen Box oder auf die obere Seite einer vertikalen). box ist die Box, der wir etwas hinzuf�gen wollen. child ist die hinzuzuf�gende Komponente. expand vergr��ert die Komponente, so da� sie den ganzen Platz nutzt, wenn m�glich. padding f�gt zus�tzlichen Platz links und rechts hinzu.

Das Gegenst�ck zu gtk_box_pack_start ist gtk_box_pack_end:

gtk_box_pack_end(GtkBox *box,GtkWidget *child, 
                gboolean expand, gboolean fill, guint padding);

So k�nnen wir Komponenten am Ende (rechts oder unten) einer Box hineinlegen. Die Parameter haben dieselbe Bedeutung wie zuvor.

Um eine Box einem Fenster hinzuzuf�gen, benutzen wir folgende Funktion:

gtk_container_add (GtkContainer *container,GtkWidget *component);

container ist das Fenster, dem die Box hinzugef�gt wird, component ist die entsprechende Box. Um z.B. die oben erzeugte Box zu window hinzuzuf�gen, benutzen wir diese Funktion:

gtk_container_add(GTK_CONTAINER(window),box);
gtk_box_set_homogeneous (GtkBox *box, gboolean homogenous);
gtk_box_set_spacing(GtkBox *box, gint spacing);

Die erste Funktion im zweiten Kasten �ndert die Eigenschaft homogenous (Gleichm��igkeit) einer Box, und die zweite Funktion �ndert ihren Platzbedarf. box ist die jeweils zu �ndernde Box.

gtk_box_set_child_packing(GkBox *box,GtkWidget *shild, 
       gboolean expand, gboolean  fill, guint padding, 
       GtkPackType packingtype);

Diese Funktion redefiniert die Eigenschaften einer bereits verpackten Komponente. Die Parameter haben dieselbe Bedeutung wie in der Funktion gtk_box_pack_start. packingtype kann GTK_PACK_START oder GTK_PACK_END sein. Mit GTK_PACK_START wird die Komponente an den Boxanfang gelegt, wenn sie mit gtk_pack_end verpackt wurde. Mit GTK_PACK_END wird sie ans Boxende gelegt, wenn sie mit gtk_pack_start verpackt wurde.

Um das hier Erkl�rte besser zu verstehen, kannst du dir kutular.c ansehen.

Tabellen

Wie in HTML helfen uns Tabellen, Komponenten in Zellen zu fixieren. Daf�r reicht es aus, eine Tabelle mit gen�gend Zeilen und Spalten zu erzeugen. Dann k�nnen wir eine Komponente in einer Zelle oder einer Gruppe von nebeneinanderliegenden Zellen unterbringen. Um eine Tabelle zu erzeugen, benutzen wir folgende Funktion:

GtkWidget *table;
GtkWidget* gtk_table_new(guint  row, guint column, gboolean homogenous);

row ist die Zahl der Zeilen, column die der Spalten. homogenous wird benutzt, um die Komponenten gleichm��ig zu verteilen.

Mit dieser Funktion f�gen wir eine Komponente einer Tabelle hinzu:

void gtk_table_attach (GtkTable *table, GtkWidget *child, 
         guint left_attach, guint right_attach, guint top_attach,
         guint bottom_attach, GtkAttachOptions xoptions, 
         GtkAttachOptions yoptions, guint xpadding, guint ypadding);

table ist die Tabelle und child die darin einzuf�gende Komponente. left_attach ist die Nummer der Zelle, von links gez�hlt, in der sich die Komponente befinden soll, right_attach ebenso, von rechts gez�hlt, und top_attach bzw. bottom_attach analog von oben bzw. unten gez�hlt. Komponenten k�nnen mehr als eine Zelle bedecken.

xoptions und yoptions k�nnen drei verschiedene Werte annehmen: GTK_FILL, GTK_EXPAND oder GTK_SHRINK. GTK_FILL sorgt daf�r, da� die Komponente s�mtliche Zellen ausf�llt. GTK_EXPAND ordnet sie im Mittelpunkt der Zellen an, und GTK_SHRINK l��t sie in die Dimensionen der Zelle schrumpfen, wenn sie gr��er war. xoptions bewirkt dies nur auf der X-Achse, und yoptions nur auf der Y-Achse.

xpadding f�gt Platz auf der linken und rechten Seite der Komponente hinzu (also entlang der X-Achse), w�hrend ypadding es entlang der Y-Achse macht.

Hier ist ein Beispielcode:

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

Weil gtk_table_attach eine Menge Parameter hat, wird eine neue, kurze Funktion erzeugt: gtk_table_attach_defaults. Sie erf�llt dieselbe Aufgabe, nur mit weniger Parametern.

void gtk_table_attach_defaults (GtkTable *table,GtkWidget *child, 
                guint left_attach, guint right_attach, guint top_attach, 
                guint bottom_attach); 

Hier haben die Parameter dieselbe Bedeutung. xoptions und yoptions haben den Wert GTK_FILL|GTK_EXPAND. xpadding und ypadding haben den Wert 0.

Mit dieser Funktion wird die Zahl der Zeilen und Spalten einer bestehenden Tabelle ge�ndert:

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

Mit folgenden Funktionen kannst du die Werte f�r die Abst�nde einer Zeile oder einer Spalte �ndern:

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

Diese �ndern die Abstandswerte ganzer Zeilen oder Spalten:

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

Und diese �ndern schlie�lich die Gleichm��igkeits-Schalter einer bestehenden Tabelle:

void gtk_table_set_homogeneous (GtkTable *table, gboolean homogenous);

Fazit

In diesem Artikel haben wir die Methoden kennengelernt, um Komponenten zu verpacken, und dann haben wir uns Funktionen angesehen, um einige Eigenschaften von Boxen und Tabellen festzulegen. Ich freue mich immer �ber Fragen, Kommentare und Ideen von Lesern. Schick mir einfach eine e-mail...