







|

Natürlich sollen sie auch wissen wie so ein Widget "überlebt". Das allozieren
des Speichers und wieder freigeben, geschieht meistens Automatisch.
Wenn wir Beispielsweise ein Widget "zerstören" wollen rufen wir die Funktion
gkt_widget_destroy auf. Damit wird das Widget aus dem Container entfernt
und der Speicher und andere Ressourcen werden freigegeben.
Hierzu der Syntax:
void gtk_widget_destroy(GtkWidget *widget);
Und hierzu ein Programmbeispiel:
/*Download:gtklife.c*/
#include <gtk/gtk.h>
#include <gtk/gtkwidget.h>
void ende_cb(GtkObject *object)
{
gtk_main_quit();
}
void weg_damit_cb(GtkWidget *widget, gpointer data)
{
gtk_widget_destroy(widget);
}
int main(int argc, char **argv)
{
GtkWidget *fenster;
GtkWidget *button1, *button2;
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("gtk_widget_destroy");
button2 = gtk_button_new_with_label("Quit");
/*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);
gtk_signal_connect(GTK_OBJECT(button1), "clicked",
GTK_SIGNAL_FUNC(weg_damit_cb), NULL);
gtk_signal_connect_object(GTK_OBJECT(button2), "clicked",
GTK_SIGNAL_FUNC(gtk_main_quit), GTK_OBJECT(fenster));
/*Fenstertitel*/
gtk_window_set_title(GTK_WINDOW(fenster), "gtk_widget_destroy");
/*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_EXPAND, 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:
Und nach dem Klick auf dem Button gtk_widget_destroy welcher die Callback-
Funktion weg_damit_cb aufruft:
Intern besitzt jedes Widget einen Referenz-Zähler. Haben wir zum Beispiel
ein Widget erzeugt ist dieser Zähler auf 1. Wenn wir das Widget wieder
aus dem Container entfernen, wird der Zähler wieder auf 0 dekrementiert.
Wenn also eine Referenz den Wert 0 erreicht ist das Widget "zerstört".
Die bedeutet auch, wenn sie ein Widget zerstören welches viele andere
Widget beinhaltet, wird dieser Inhalt auch mitzerstört. Dies sollten
sie beachten wenn sie ein Programm schreiben und ein Widget entfernen wollen.
Nun will man manch mal ein Widget aus dem Container entfernen und es
später wieder hinzufügen. Für solch einen Fall könnten sie eine
Referenz auf ein Widget einrichten mit:
void gtk_object_ref(GtkObject *object);
Wenn sie nun eine Widget aus dem Container entfernen, gehen sie folgendermaßen vor:
gtk_object_ref(widget);
gtk_containter_remove(container,widget);
Wenn sie das Widget nicht mehr benötigen müssen sie es un-referenzieren mit
gtk_object_unref.
Sinn macht dies aber nur wenn sie Beispielsweise ein Widget aus einem Container entfernen und in einem anderen wieder einfügen. Wenn sie ein Widget kurz
entfernen und später wieder hinzufügen wollen, empfehle ich Ihnen die schnelleren
Funktionen gtk_widget_hide und gtk_widget_show. Hier ein Beispiel wie sie das
machen können:
/*Download:gtklife2.c*/
#include <gtk/gtk.h>
#include <gtk/gtkwidget.h>
void ende_cb(GtkObject *object)
{
gtk_main_quit();
}
int main(int argc, char **argv)
{
GtkWidget *fenster;
GtkWidget *button1, *button2;
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("Verstecke mich");
button2 = gtk_button_new_with_label("Zeig ihn wieder");
/*Tabelle erstellen...*/
table = gtk_table_new(2,2,TRUE);
/*Signale registrieren*/
gtk_signal_connect(GTK_OBJECT(fenster), "delete_event",
GTK_SIGNAL_FUNC(ende_cb), NULL);
gtk_signal_connect_object(GTK_OBJECT(button1), "clicked",
GTK_SIGNAL_FUNC(gtk_widget_hide), GTK_OBJECT(button1));
gtk_signal_connect_object(GTK_OBJECT(button2), "clicked",
GTK_SIGNAL_FUNC(gtk_widget_show), GTK_OBJECT(button1));
/*Fenstertitel*/
gtk_window_set_title(GTK_WINDOW(fenster), "gtk_widget_destroy");
/*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_defaults(GTK_TABLE(table),button1, 0,1, 0,1);
gtk_table_attach_defaults(GTK_TABLE(table), button2, 1,2, 1,2);
gtk_container_add(GTK_CONTAINER(fenster),table);
/*Zeigs uns.....*/
gtk_widget_show_all(fenster);
gtk_main();
return 0;
}
|
Es gibt natürlich noch eine Menge weiterer Widget Konzepte. Alle hier
aufzuzählen währe zu Umfangreich. Sie finden viele dieser Widgets
Funktionen in der GTK-Referenz, welche meist schon anhand des Namens
eindeutig zu verstehen sind. Wir werde natürlich viele von diesen
im Laufe des Tutorials noch kennen lernen.

© 2001,2002 Jürgen Wolf
|