Date de publication : 20 Février 2007
Vous avez sûrement dû essayer de mettre plusieurs widgets dans une fenêtre mais sans succès. Cela est dû au fait qu'un widget de type GtkContainer ne peut contenir qu'un seul widget. La solution à ce problème est l'utilisation des widgets de type GtkBox qui permettent d'inclure plusieurs widgets à l'intérieur.
Il existe deux catégories de GtkBox :
Comme toujours, la création de ces widgets est très simple. Les fonctions suivantes permettent de créer respectivement une GtkHBox et une GtkVBox :
GtkWidget* gtk_hbox_new(gboolean homogeneous, gint spacing);
GtkWidget* gtk_vbox_new(gboolean homogeneous, gint spacing);
Le paramètre homogeneous
définit si tous les widgets
contenus dans la GtkBox utilisent un espace équivalent. C'est à
dire que si ce paramètre est à TRUE, la zone d'affichage de la
GtkBox sera divisée en x zone(s) de taille égale (x étant
le nombre de widgets contenus).
Le paramètre spacing
permet de définir l'espacement
entre chacun des widgets contenus.
Les widgets GtkHBox et GtkVBox n'ont pas de fonctions spécifiques pour l'ajout de widget. Il faut, pour cela, utiliser les fonctions de GtkBox dont dérivent les différents types de box. Les fonctions les plus couramment utilisées sont :
void gtk_box_pack_start(GtkBox* box, GtkWidget* child, gboolean
expand, gboolean fill, guint padding);
void gtk_box_pack_end(GtkBox* box, GtkWidget* child, gboolean expand, gboolean
fill, guint padding);
La première fonction insère les widgets de haut en bas (pour les GtkVBox) ou de gauche à droite (pour les GtkHBox). La seconde fonction fait exactement le contraire, c'est à dire, de bas en haut pour les GtkVBox et de droite à gauche pour les GtkHBox.
Le paramètre box
est bien entendu la GtkBox dans laquelle
on veut insérer le widget child
(2ème paramètre).
Le paramètre expand
n'est utile que si la GtkBox en question
n'est pas défini comme homogène (homogeneous=FALSE
lors de la création). Dans ce cas, tous les widgets qui auront été
insérés avec la valeur expand=TRUE
se partageront
tout l'espace libre de la GtkBox (les widgets avec expand=FALSE
n'utiliseront que l'espace qui leur est nécessaire).
Le paramètre fill
permet de définir si le widget
enfant occupe toute la zone qui lui est réservée.
Et enfin, le paramètre padding
permet d'ajouter de l'espace
autour du widget (en plus de celui défini par le paramètre spacing
lors de la création de la GtkBox).
Pour vous montrer les effets des différents paramètres voici un tableau avec des captures d'écran avec différentes configurations :
Paramètres | Captures |
GtkVBox :homogeneous = TRUE Bouton 1 : fill = FALSE Bouton 2 : fill = FALSE |
|
GtkVBox :homogeneous = TRUE Bouton 1 : fill = FALSE Bouton 2 : fill = TRUE |
|
GtkVBox :homogeneous = FALSE Bouton 1 : expand = FALSE Bouton 2 : expand = FALSE |
|
GtkVBox :homogeneous = FALSE Bouton 1 : expand = FALSE Bouton 2 : expand = TRUE |
|
GtkVBox :homogeneous = FALSE Bouton 1 : expand = FALSE Bouton 2 : expand = TRUE |
Pour montrer les possibilités qu'offrent les GtkBox, nous allons créer une fenêtre contenant quatre boutons organisés comme cela :
Maintenant, la question est de savoir comment organiser les différentes GtkBox pour avoir ce résultat. C'est très simple, nous avons besoin de deux GtkBox, la première verticale, la deuxième horizontale. Voici une image qui vous explique comment nous devons organiser nos deux GtkBox :
Ici, en rouge c'est la GtkVBox qui est directement ajouté à la fenêtre principale. On va y empiler les widget de haut en bas avec la fonction gtk_box_pack_start. On va tout d'abord placer le "Bouton 1", ensuite pour pouvoir ajouter les autres boutons de gauche à droite, il faut ajouter la GtkHBox (en bleu) car on ne peut pas le faire avec la GtkVBox puisqu'elle est verticale. On ajoute donc ensuite "Bouton 2" et "Bouton 3" dans la GtkHBox, et pour finir, on ajoute "Bouton 4" dans la GtkVBox.
Voilà, une fois que l'on a compris comment organiser les choses, on peut tout faire.
#include <stdlib.h> #include <gtk/gtk.h> int
main(int argc, char
**argv) gtk_init(&argc,&argv); pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* Creation de la GtkBox
verticale */ /* Creation des boutons
*/ /* Ajout de Bouton 1 dans
la GtkVBox */ /* Creation de la box horizontale
*/ /* Ajout de la GtkHBox
dans la GtkVBox */ /* Ajout des boutons 2
et 3 dans la GtkHBox */ /* Ajout du dernier bouton
dans la GtkVBox */ gtk_widget_show_all(pWindow); gtk_main(); return EXIT_SUCCESS;
|
Résultat : |
gboolean gtk_box_get_homogeneous (GtkBox *box); |
Utilisée pour savoir si une GtkBox est homogène. Entrée(s) : box : la GtkBox. Sortie : TRUE si box est homogène, FALSE sinon. |
void gtk_box_set_homogeneous (GtkBox *box, gboolean homogeneous); |
Utilisée pour définir si une GtkBox est
homogène ou pas. Entrée(s) : box : la GtkBox. homogeneous : TRUE si l'on veut que box soit homogène, FALSE sinon. Sortie : rien. |
gint gtk_box_get_spacing (GtkBox *box); |
Utilisée pour connaître l'espace entre les
widgets d'une GtkBox. Entrée(s) : box : la GtkBox. Sortie : gint. |
void gtk_box_set_spacing (GtkBox *box, gint spacing); |
Utilisée pour définir l'espacement entre
les widgets. Entrée(s) : box : la GtkBox. spacing : espace entre les widgets. Sortie : rien. |