ein Kapitel zurück                                           ein Kapitel weiter

Nun wollen wir in diesem Kapitel ein Fenster erstellen mit einem Button, mit "Hallo Welt" - Beschriftung. Bei einem Klick auf diesem Button wird das Fenster wieder geschlossen. Sie werden zum ersten mal sehen wie sie Signale in der Praxis einrichten können, und wie sie damit umgehen können.

Genug der Reden, sehen wir uns dazu erst mal das Programm an:

/*Download:gtk_sig.c*/

#include <gtk/gtk.h>

gint delete_cb(GtkWidget *widget, GdkEvent *event, gpointer *data)
{
 return(TRUE);
}

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


int main(int argc, char **argv)
{
 GtkWidget *fenster;
 GtkWidget *button;
 /*Gtk initialisieren*/
 gtk_init(&argc, &argv);
 /*Ein neues Fenster erstellen*/
 fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 /*Einen Button erstellen*/
 button  = gtk_button_new_with_label("Hallo Welt");

 /*Signale registrieren*/
 gtk_signal_connect(GTK_OBJECT(fenster), "delete_event",
                    GTK_SIGNAL_FUNC(delete_cb),NULL);
 gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
                           GTK_SIGNAL_FUNC(ende_cb), GTK_OBJECT(fenster));
 /*Fenstertitel*/
 gtk_window_set_title(GTK_WINDOW(fenster), "Hallo Welt mit Button");
 /*Fensterposition*/
 gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);

 gtk_container_set_border_width(GTK_CONTAINER(fenster),25);
 /*Fenster dem dem Button zuordnen*/
 gtk_container_add(GTK_CONTAINER(fenster),button);
 /*Zeigs uns.....*/
 gtk_widget_show_all(fenster);

 gtk_main();

 return 0;
}

Wenn sie diese Programm wie gewohnt aus dem Kapitel der Fenster übersetzen, könnte es wie folgt aussehen:




Nun wollen wir das Beispiel ein wenig analysieren. Uns Interessieren vorerst nur die Ereignisse und Ihre Reaktionen.

Zuerst zu unserem ersten Ereignishandler den wir eingerichtet haben:

 gtk_signal_connect(GTK_OBJECT(fenster), "delete_event",
                    GTK_SIGNAL_FUNC(delete_cb),NULL);  

Das Ereignis "delete_event" wird vom Windowsmanager an unser Programm gesendet wenn wir das "Fenster schließen" drücken. Dies ignorieren wir aber, da unser Callback-Funktion delete_cb als Rückgabewert TRUE liefert. Würden wir FALSE angeben, würde das Fenster geschlossen. Mit unserem 2. Siganlhandler:

 gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
                           GTK_SIGNAL_FUNC(ende_cb), GTK_OBJECT(fenster));  

reagieren wir, wenn der Button ge"clicked" wurde mit der Callback-Funktion ende_cb. Die Callback-Funktion wirkt sich anschließend auf das Widget fenster aus. Unsere Callback-Funktion ende_cb schließt unser Fenster (gtk_main_quit). Die Callback-Funktion ende_cb hätten wir uns aber mit folgender Schreibweise sparen können:

 gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
                           GTK_SIGNAL_FUNC(gtk_main_quit), GTK_OBJECT(fenster));  

Hier haben wir die Callback-Funktion gleich direkt registriert. Bildlich können sie sich denn Programmablaufplan "Hallo Welt" folgendermaßen vorstellen:




Den Rest des Programms werden wir in den nächsten Kapiteln durchnehmen.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf