







|

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)
- Vertikal Packing Widget
- 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:
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.

© 2001,2002 Jürgen Wolf
|