ein Kapitel zurück                                           ein Kapitel weiter

Das Packing Widget funktioniert im Prinzip genauso wie beim vertikalen bzw. horizontalen Packet Widgets. Nur geben wir hier für das Packen eines Widgets in die Box x/y-Koordinaten an. Man kann sich das ganze wie bei einem Tabellenkalkulations-Programm vorstellen. Sie erzeugen ein Tabelle mit einer bestimmten Anzahl von Reihen und Spalten. Mit Hilfe der x/y Koordinaten geben die Reihe und Spalte an wo sie das Widget platzieren wollen.

Zuerst wollen wir uns den Syntax der Funktion ansehen, mit der wir eine neue Tabelle erzeugen:

GtkWidget *gtk_table_new(quint rows, quint columns, gboolen homogeneous);  

Mit dieser Funktion legen wir also eine Tabelle mit rows Reihen und columns Spalten an. Für die Variable homogeneous können sie folgendes angeben:

  • TRUE - Alle Spalten haben die selbe Breite
  • FALSE - Spalten haben eine unterschiedliche Breite

Nun benötigen wir noch die Funktion mit der wir einzelnen Widgets in die Tabelle packen können:

void gtk_table_attach_defaults(GtkTable *table, GtkWidget *widget,
                               quint left_attach, quint right_attach,
                               quint top_attach, quint bottom_attach);  

Mit dieser Funktion packen wir unser Widget in die Tabelle. Die Koordinaten für die Spalte ist von links -> left_attach bis rechts -> right_attach. Und die Koordinaten der Reihe ist von oben -> top_attach bis unten -> bottom_attach.

Nehmen wir mal an wir erzeugen eine 3x2 Tabelle mit:

table = gtk_table_new(3,2,TRUE);  

Somit ergibt sich folgendes Bild:




Wollen sie nun ein Widget in dieser Tabelle links oben an der Ecke einfügen, müssen sie dies folgendermaßen machen:

gtk_table_attach_defaults(GTK_TABLE(table), button, 0,1, 0,1);  

Somit ergibt sich folgendes Bild:




Nun wenn sie ein weiteres Widget links unten zur Tabelle hinzufügen wollen schreiben sie folgende Koordinaten:

gtk_table_attach_defaults(GTK_TABLE(table), button2, 0,1, 1,2);  

Ich denke mal sie haben verstanden wie die Koordinaten zu verwenden sind. Für rechts unten müssten sie folgende Koordinaten verwenden:

gtk_table_attach_defaults(GTK_TABLE(table), button2, 2,3, 1,2);  

Nun die Funktionsendung _defaults sagt uns schon das es sich dabei um ein packen in der Defaulteinstellung handelt. Dann stellt sich wohl die Frage wie die Funktion aussieht, mit der wir die Eigenschaften der einzelnen Tabellen-Zellen beeinflussen können:

GtkWidget *gtk_table_attach(GtkTable *table, GtkWidget *widget,
                            quint left_attach, quint right_attach,
                            quint top_attach, quint bottom_attach,
                            GtkAttachOptions xoptions,
                            GtkAttachOptions yoptions,
                            quint xpadding, quint ypadding);  

Hier sind als noch 4 weiter Parameter hinzugekommen. Für die Parameter gtkAttachOptions können sie folgende Werte angeben:

  • GTK_EXPAND - Widget breitet sich aus falls überschüssiger Platz vorhanden
  • GTK_FILL - Das Widget wird mit seinem normalen Platz gefüllt
  • GTK_SHRINK - Das Widget läßt sich zusammenschrumpfen

Die einzelnen Optionen lassen sich auch mit dem ODER Operator (|) verknüpfen.

Mit xpadding und ypadding können sie den Abstand in Pixeln vom Nachbarn rechts/links bzw. oben/unten einstellen.

Am besten ich demonstriere Ihnen die Funktion gtk_table_attach anhand eines Beispiels:

/*Download:table.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;
 GtkWidget *table;
 /*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("Kein schrumpfen\nkein expandieren");
 button2  = gtk_button_new_with_label("Expandiert und schrumpft\nvertikal");
 button3  = gtk_button_new_with_label("Expandiert und schrumpft\n in beide Seiten");
 /*Tabelle erstellen...*/
 table = gtk_table_new(2,2,FALSE);

 /*Signale registrieren*/
 gtk_signal_connect(GTK_OBJECT(fenster), "delete_event",
                    GTK_SIGNAL_FUNC(ende_cb), NULL);
 /*Fenstertitel*/
 gtk_window_set_title(GTK_WINDOW(fenster), "Tabellendemo");
 /*Fensterposition*/
 gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(fenster),15);

 /*Inhalt der Tabelle mit verschiedenen Optionen erstellen....*/
 gtk_table_attach(GTK_TABLE(table),button1, 0,1, 0,1,
                  GTK_FILL, GTK_FILL, 0,0);
 gtk_table_attach(GTK_TABLE(table), button2, 0,1, 1,2,
                  GTK_FILL, GTK_FILL|GTK_EXPAND|GTK_SHRINK,0,0);
 gtk_table_attach(GTK_TABLE(table), button3, 1,2, 1,2,
                  GTK_FILL|GTK_EXPAND|GTK_SHRINK,GTK_FILL|GTK_EXPAND|GTK_SHRINK,
                  0,0);


 gtk_container_add(GTK_CONTAINER(fenster),table);

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

 gtk_main();

 return 0;
}

Und so könnte es aussehen:




Nun wollen wir unser Tabellendemo auch demonstrieren. Zuerst wollen wir unser Fenster vertikal vergrößern:




Jetzt wollen wir es noch horizontal vergrößern:




Ich empfehle Ihnen nun dazu selbst mit den Optionen herumzuspielen.

Ich möchte Ihnen nun noch ein paar Funktionen nennen, die sie mit Packing Tabellen verwenden können.

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

Damit können sie die Größe einer bereits erzeugten Tabelle um rows Reihen und columns Spalten ändern.

void gtk_table_set_row_spacing(GtkTable *table, quint rows, quint spacing);
void gtk_table_set_col_spacing(GtkTable *table, quint cols, quint spacing);  

Damit können sie den Abstand zwischen einzelnen Widgets in der Reihe (row) bzw. Spalte (col) ändern.

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

Damit können sie die Abstände einzelner Widgets auf alle Reihen bzw. Spalten ändern.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf