original in tr Özcan Güngör
tr to en Özcan Güngör
en to de Viktor Horvath
Ich benutze Linux seit 1997. Freiheit, Flexibilit�t, Open Source. Diese Eigenschaften mag ich.
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.
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.
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.
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.
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.
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);
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...