Programmation GTK+/Un Bonjour tout le monde amélioré
Un livre de Wikibooks.
3.3 Un « Bonjour tout le monde » amélioré
Étudions une version légèrement améliorée avec de meilleurs exemples de fonctions de rappel. Ceci permettra aussi d'introduire le sujet suivant : le placement des wigdets.
#include <gtk/gtk.h> /* Notre nouveau rappel amélioré. La donnée passée à cette fonction est * imprimée sur stdout. */ void rappel (GtkWidget *widget, gpointer *data) { g_print ("Re-Bonjour - %s a été pressé\n", (char *) data); } /* Un autre rappel */ void delete_event (GtkWidget *widget, GdkEvent *event, gpointer *data) { gtk_main_quit (); } int main (int argc, char *argv[]) { /* GtkWidget est le type pour déclarer les widgets */ GtkWidget *window; GtkWidget *button; GtkWidget *box1; /* Cette fonction est appelée dans toutes les applications GTK. * Les paramètre passés en ligne de commande sont analysés et * retournés à l'application. */ gtk_init (&argc, &argv); /* Création d'une nouvelle fenêtre. */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* Nouvel appel qui intitule notre nouvelle fenêtre * "Salut les boutons !" */ gtk_window_set_title (GTK_WINDOW (window), "Salut les boutons !"); /* Configuration d'un gestionnaire pour "delete_event" afin de * quitter immédiatement GTK. */ gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); /* Configuration de la largeur du contour de la fenêtre. */ gtk_container_border_width (GTK_CONTAINER (window), 10); /* Création d'une boîte pour y placer les widgets. * Ceci est décrit en détails plus loin dans la section * « placement ». La boîte n'est pas matérialisée, elle est juste * utilisée comme moyen d'arranger les widgets. */ box1 = gtk_hbox_new(FALSE, 0); /* On met la boîte dans la fenêtre principale. */ gtk_container_add (GTK_CONTAINER (window), box1); /* On crée un nouveau bouton portant le label « Bouton 1 ». */ button = gtk_button_new_with_label ("Bouton 1"); /* Lorsque le bouton est cliqué, on appelle la fonction « rappel » * avec un pointeur sur la chaîne « Bouton 1 » comme paramètre. */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (rappel), (gpointer) "Bouton 1"); /* Au lieu d'utiliser gtk_container_add, on place ce bouton dans * la boîte invisible qui a été placée dans la fenêtre. */ gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0); /* N'oubliez jamais cette étape qui indique à GTK que la configuration * de ce bouton est terminée et qu'il peut être affiché. */ gtk_widget_show(button); /* On fait la même chose pour créer un deuxième bouton. */ button = gtk_button_new_with_label ("Bouton 2"); /* On appelle la même fonction de rappel avec un paramètre différent, * un pointeur sur la chaîne « Bouton 2 ». */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (rappel), (gpointer) "Bouton 2"); gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0); /* L'ordre dans lequel on affiche les boutons n'est pas vraiment * important, mais il est préférable d'afficher la fenêtre en dernier * pour qu'elle surgisse d'un coup. */ gtk_widget_show(button); gtk_widget_show(box1); gtk_widget_show (window); /* Le reste est dans gtk_main et on attend que la fête commence ! */ gtk_main (); return 0; }
Compilez ce programme en utilisant les mêmes paramètres que pour l'exemple précédent. Vous remarquerez que, maintenant, il est plus difficile de quitter le programme : vous devez utiliser le gestionnaire de fenêtres ou une commande shell pour le détruire. Un bon exercice pour le lecteur serait d'insérer un troisième bouton « Quitter » qui permettrait de sortir du programme. Vous pouvez aussi jouer avec les options de gtk_box_pack_start() en lisant la section suivante. Essayez de redimensionner la fenêtre, et observez son comportement.
Juste une remarque : il existe une autre constante utilisable avec gtk_window_new() - GTK_WINDOW_DIALOG. Ceci permet d'interagir de façon un peu différente avec le gestionnaire de fenêtres et doit être utilisé pour les fenêtres temporaires comme les boîtes de dialogue, par exemple.