ein Kapitel zurück                                           ein Kapitel weiter

Nun haben sie im Kapitel zuvor das Konzept von GTK kennen gelernt. Sie haben auch im Kapitel zuvor folgenden Code gesehen:

gtk_container_add(GTK_CONTAINER(fenster), button);  

Damit haben wir unserem Widget fenster das Widget button zugeordnet. Genauer wir haben den Button in den Container des Fensters zugeordnet. Was ist aber nun ein Container? Ein Container ist nichts anderes als ein Widget, welches ein anderes Widget enthält.

Toll werden sie denken, einfach alle neuen Widget in den Container und dann anzeigen. Nur würde ein Konstrukt wie:

gtk_container_add(GTK_CONTAINER(fenster), button1);
gtk_container_add(GTK_CONTAINER(fenster), button2);  

...keine 2 Buttons im Fenster anzeigen, wie wahrscheinlich vermutet. Das liegt daran, dass in GTK pro Container nur ein Widget enthalten sein darf. Beispielsweise können sie dem Widget Fenster einen Button zuordnen und dem Widget Button können sie wiederum ein Label für die Beschriftung zuordnen. Wie aber können wir einen 2.Button anzeigen?

Dafür gibt es in GTK zum Glück so etwas wie einen Container in dem wir mehrer Widgets packen können. Also so etwas wie eine Grabbelbox, die wir als Kind hatten und beim Aufräumen alles reingeschmissen haben. Für einen solchen Fall gibt es zwei Arten von Container:

  • Packing Widgets (Packing Boxes)
    1. Vertikal Packing Widget
    2. Horizontal Packing Widget
  • Tabellarische Packing Widgets

Wir wollen uns zuerst die Packing Widgets (Packing Boxes) ansehen.

Vertikal Packing Widgets

Zuerst wollen wir uns den Syntax der Funktion ansehen, mit der wir unsere neuen Widgets vertikal anordnen:

GtkWidget *gtk_vbox_new(gboolen homogeneous, gint spacing);  

Für den Parameter homogeneous können sie angeben:

  • TRUE - Alle Widgets haben die gleiche Größe
  • FALSE - Die Widgets sind nicht gleich groß

Mit spacing legen sie den vertikalen Abstand der einzelnen Widgets fest.

Bis jetzt haben wir aber erst eine vertikal Box konstruiert. Nun benötigen wir noch eine Funktion mit der wir die einzelnen Widgets in die Box packen können. Dies erledigen wir mit der Funktion:

void gtk_box_pack_start(GtkBox *box, GtkWidget *child,
                        gboolen expand, gboolen fill, gint padding);  

box ist der Container den wir mit der Funktion gtk_vbox_new erzeugt haben. Darin packen wir nun ein neues Widget child. Die nächsten 3 Parameter, beeinflussen die Darstellung. Für den Parameter expand gilt folgendes:

  • TRUE - Der Bereich um das Widget darf eventuell benutzt werden.
  • FALSE - Der Bereich um das Widget ist tabu.

Für den Parameter fill gilt folgendes:

  • TRUE - Das Widget darf in seinem festgelegten Bereich völlig ausgefüllt werden.
  • FALSE - Das Widget darf nicht ausgefüllt werden.

Mit padding bestimmen sie den Abstand des Widgets zum Nachbarn. Bitte beachten sie das wir mit der Funktion gtk_box_pack_start, das neue Widget oben über das zuletzt eingefügte Widget gepackt wird.

Wollen sie das neue Widget unten vom zuletzt Hinzugefügten packen, verwenden sie bitte die Funktion:

void gtk_box_pack_end(GtkBox *box, GtkWidget *child,
                      gboolen expand, gboolen fill, gint padding);  

Die Parameter sind und haben die selbe Bedeutung wie bei der Funktion gtk_box_pack_start.

Nun wollen wir uns natürlich dazu wieder ein Programmbeispiel ansehen:

/*Download:box1.c*/

#include <gtk/gtk.h>

void ende_cb(GtkObject *object)
{
 gtk_main_quit();
}


int main(int argc, char **argv)
{
 GtkWidget *fenster;
 GtkWidget *button1, *button2, *button3, *button_quit;
 GtkWidget *box;
 /*Gtk initialisieren*/
 gtk_init(&argc, &argv);
 /*Ein neues Fenster erstellen*/
 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /*Buttons erstellen*/
 button1  = gtk_button_new_with_label("Knopf 1");
 button2  = gtk_button_new_with_label("Knopf 2");
 button3  = gtk_button_new_with_label("Knopf 3");
 button_quit  = gtk_button_new_with_label("Ende");
 /*Neue Box erstellen*/
 box = gtk_vbox_new(FALSE,0);

 /*Signale registrieren*/
 gtk_signal_connect_object(GTK_OBJECT(button_quit), "clicked",
                           GTK_SIGNAL_FUNC(gtk_main_quit), GTK_OBJECT(fenster));
 /*Fenstertitel*/
 gtk_window_set_title(GTK_WINDOW(fenster), "Vertikale Box");
 /*Fensterposition*/
 gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(fenster),25);

 /*Nun alles rein in die Box....*/
 gtk_box_pack_start(GTK_BOX(box), button1, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button2, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button3, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box), button_quit, FALSE, FALSE, 20);


 gtk_container_add(GTK_CONTAINER(fenster),box);

 /*Zeigs uns.....*/
 gtk_widget_show_all(fenster);

 gtk_main();

 return 0;
}

Und so ähnlich könnte es aussehen:


gtk_vbox_new


Natürlich sollten sie nicht vergessen die box am Ende auch in den Container fenster zu zuordnen:

 gtk_container_add(GTK_CONTAINER(fenster),box);  

Sie können ja gerne am Programm und seinen Optionen herumspielen.

Horizontales Packing Widget

Nun wollen wir sehen wie war das ganze in eine horizontale Box packen können. Zuerst die Funktion mit der wir eine solche Box erzeugen:

GtkWidget *gtk_hbox_new(gboolen homogeneous, gint spacing);  

Auch hier haben die Paramter dieselbe bedeutung wie schon bei gtk_vbox_new.

Für den Paramter homogeneous können sie angeben

  • TRUE - Alle Widgets haben die gleiche Größe
  • FALSE - Die Widgets sind nicht gleich gross

Mit spacing legen sie den vertikalen Abstand der einzelnen Widgets fest.

Und natürlich gilt auch hier dasselbe mit dem packen in die Box mit den Funtkionen gtk_box_pack_start und gtk_box_pack_end. Nur das bei gtk_box_pack_start das neue Widget links neben dem zuletzt eingefügtem Widget kommt. Bei gtk_box_pack_end passiert logischerweise das Gegenteil!

Nun wollen wir uns das Beispiel dazu ansehen:

/*Download:box2.c*/

#include <gtk/gtk.h>



void ende_cb(GtkObject *object)
{
 gtk_main_quit();
}


int main(int argc, char **argv)
{
 GtkWidget *fenster;
 GtkWidget *button1, *button2, *button3, *button_quit;
 GtkWidget *box1, *box2;
 /*Gtk initialisieren*/
 gtk_init(&argc, &argv);
 /*Ein neues Fenster erstellen*/
 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /*Buttons erstellen*/
 button1  = gtk_button_new_with_label("Knopf 1");
 button2  = gtk_button_new_with_label("Knopf 2");
 button3  = gtk_button_new_with_label("Knopf 3");
 button_quit  = gtk_button_new_with_label("Ende");
 /*Neue Box erstellen*/
 box1 = gtk_hbox_new(FALSE,0);
 box2 = gtk_vbox_new(FALSE,0);

 /*Signale registrieren*/
 gtk_signal_connect_object(GTK_OBJECT(button_quit), "clicked",
                           GTK_SIGNAL_FUNC(gtk_main_quit), GTK_OBJECT(fenster));
 /*Fenstertitel*/
 gtk_window_set_title(GTK_WINDOW(fenster), "Horizontale Box");
 /*Fensterposition*/
 gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(fenster),35);

 /*Nun alles rein in die Box....*/
 gtk_box_pack_start(GTK_BOX(box1), button1, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box1), button2, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box1), button3, FALSE, FALSE, 0);
 gtk_box_pack_start(GTK_BOX(box2), box1, FALSE,FALSE, 20);
 gtk_box_pack_start(GTK_BOX(box2), button_quit, FALSE, FALSE, 0);


 gtk_container_add(GTK_CONTAINER(fenster),box2);

 /*Zeigs uns.....*/
 gtk_widget_show_all(fenster);

 gtk_main();

 return 0;
}

Und so könnte es aussehen:




Ich habe bei diesem Beispiel gleichzeitig eine Horizontale und Vertikale Box verwendet. An der Zeile:

 gtk_box_pack_start(GTK_BOX(box2), box1, FALSE,FALSE, 20);  

können sie sehen, dass Boxen auch in Boxen gepackt werden können. Ich denke mal das Programm läßt sich recht einfach nachvollziehen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf