Les box
- Introduction
- Création d’une box (boite)
1. Introduction
Si vous avez essayé d’écrire plusieurs widgets dans une fenêtre, vous avez certainement reçu ce type de message
d’erreur : “ Gtk-WARNING **: Attempting to add a widget with type nom-du-widget to a GtkWindow, but as a GtkBin
subclass a GtkWindow can only contain one widget at a time; it already contains a widget of type nom-du-widget” .
Comme vous venez de voir, ce message d’erreur indique que GtkWindow ne peut pas contenir qu’un seul widget. Le problème
est qu’un widget de type GtkContainer ne peut pas contenir qu’un seul widget. Pour résoudre ce problème, nous
allons placer des boites dans la fenêtre. Chaque boite (box) aura le droit d’avoir des widgets. Comme ça, nous
pouvons insérer du texte, des boutons, des images (…) dans une fenêtre.
Pour créer une boite, on utilise un widget de type GtkBox. Il y a deux types de wigdet GtkBox :
- GtkHBox qui permet de placer les widgets horizontalement.
- GtkVBox qui permet de placer les widgets verticalement.
GtkBox hérite de son parent
GtkContainer et des ancêtres de
GtkContainer.
2. Création d’une box (boite)
Pour créer une boite, on doit commencer par déclarer un pointeur vers GtkWidget.
Dans notre cas, ça sera :
Ensuite, on passe à l’initialisation. Voici les syntaxes respectives pour une GtkHBox et une
GtkVBox :
GtkWidget* gtk_hbox_new(gboolean homogeneous, gint spacing);
GtkWidget* gtk_vbox_new(gboolean homogeneous, gint spacing);
Dans notre cas, ça sera :
- maboite=gtk_vbox_new(TRUE, 0);
Si vous vous demandez pourquoi le true et le 0, voici l’explication :
- Le paramètre homogeneous définit si tous les widgets existant sur la boite utilisent un espace
équivalent. On met true si c’est le cas ou false si ce n’est pas le cas.
- Le paramètre spacing définit la taille (en pixel) entre les widgets.
Maintenant il ne reste qu’à insérer les widgets dans la fenêtre.
Voici les syntaxes couramment utilisés :
- Pour insérer un widget en haut :
void gtk_box_pack_start(GtkBox* box, GtkWidget* child, gboolean expand, gboolean fill, guint padding);
- Pour insérer un widget en bas :
void gtk_box_pack_end(GtkBox* box, GtkWidget* child, gboolean expand, gboolean fill, guint padding);
Ici box définit la boite, child définit le widget à insérer dans la boite,
expand définit l’espace du child, fill definit si child
occupe tout l’espace qui lui est réservé ou pas et enfin padding qui ajoute de l’espace autour de
child.
La théorie, c’est bien. Maintenant passons à la pratique. Nous allons revenir sur notre ancienne fenêtre et
ajouter un bouton qui nous permet de quitter la fenêtre.
Voici une capture de notre fenêtre.
Voici le code source :
- #include<stdlib.h>
- #include<gtk/gtk.h>
-
- int main(int argc, char *argv[])
- {
- GtkWidget *mafenetre;
- GtkWidget *maboite;
- GtkWidget *montexte;
- GtkWidget *monbouton;
- gchar* codage;
- gtk_init(&argc,&argv);
- mafenetre=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- maboite=gtk_vbox_new(TRUE, 0);
- monbouton= gtk_button_new_with_label("Quitter");
- gtk_container_add(GTK_CONTAINER(mafenetre), maboite);
- gtk_window_set_title(GTK_WINDOW(mafenetre), "Samomoi");
- gtk_window_set_position(GTK_WINDOW(mafenetre), GTK_WIN_POS_CENTER);
- gtk_window_set_default_size(GTK_WINDOW(mafenetre), 400, 100);
- gtk_window_set_icon_from_file(GTK_WINDOW(mafenetre), "icone.gif", NULL);
- codage=g_locale_to_utf8("Marseille! À la bien cousin.La famille...",
- -1,
- NULL,
- NULL,
- NULL);
- montexte=gtk_label_new(codage);
- g_free(codage);
-
- gtk_box_pack_start(GTK_BOX(maboite), montexte, TRUE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(maboite), monbouton, TRUE, FALSE, 0);
- g_signal_connect(G_OBJECT(monbouton), "clicked", G_CALLBACK(gtk_main_quit), NULL);
- gtk_widget_show_all(mafenetre);
- g_signal_connect(G_OBJECT(mafenetre), "destroy", G_CALLBACK(gtk_main_quit), NULL);
- gtk_main();
- return 0;
- }