IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Cours GTK 2

Date de publication : 20 Février 2007



Les box

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 :

  • les GtkHBox qui permettent de disposer les widgets horizontalement ;
  • les GtkVBox pour les disposer verticalement.

1. Utilisation des GtkBox

1.1 Création

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.

1.2 Insertion d'un widget

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
fill = FALSE
GtkVBox :
homogeneous = FALSE
Bouton 1 :
expand = FALSE
Bouton 2 :
expand = TRUE
fill = TRUE

1.3 Exemple

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.

1.4 Programme exemple.

#include <stdlib.h>
#include <gtk/gtk.h>

int main(int argc, char **argv)
{
    GtkWidget *pWindow;
    GtkWidget *pVBox;
    GtkWidget *pHBox;
    GtkWidget *pButton[4];

    gtk_init(&argc,&argv);

    pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(pWindow), "Les GtkBox");
    gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    /* Creation de la GtkBox verticale */
    pVBox = gtk_vbox_new(TRUE, 0);
    /* Ajout de la GtkVBox dans la fenetre */
    gtk_container_add(GTK_CONTAINER(pWindow), pVBox);

    /* Creation des boutons */
    pButton[0] = gtk_button_new_with_label("Bouton 1");
    pButton[1] = gtk_button_new_with_label("Bouton 2");
    pButton[2] = gtk_button_new_with_label("Bouton 3");
    pButton[3] = gtk_button_new_with_label("Bouton 4");

    /* Ajout de Bouton 1 dans la GtkVBox */
    gtk_box_pack_start(GTK_BOX(pVBox), pButton[0], TRUE, FALSE, 0);

    /* Creation de la box horizontale */
    pHBox = gtk_hbox_new(TRUE, 0);

    /* Ajout de la GtkHBox dans la GtkVBox */
    gtk_box_pack_start(GTK_BOX(pVBox), pHBox, TRUE, TRUE, 0);

    /* Ajout des boutons 2 et 3 dans la GtkHBox */
    gtk_box_pack_start(GTK_BOX(pHBox), pButton[1], TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(pHBox), pButton[2], TRUE, FALSE, 0);

    /* Ajout du dernier bouton dans la GtkVBox */
    gtk_box_pack_start(GTK_BOX(pVBox), pButton[3], TRUE, TRUE, 0);

    gtk_widget_show_all(pWindow);

    gtk_main();

    return EXIT_SUCCESS;
}

Résultat :

2 En savoir plus :

2.1 Fonctions documentées

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.

2.2 Fonctions non documentées

void gtk_box_pack_start_defaults (GtkBox *box, GtkWidget *widget);
void gtk_box_pack_end_defaults (GtkBox *box, GtkWidget *widget);
void gtk_box_reorder_child (GtkBox *box, GtkWidget *child, gint position);
void gtk_box_query_child_packing (GtkBox *box, GtkWidget *child, gboolean *expand, gboolean *fill, guint *padding, GtkPackType *pack_type);
void gtk_box_set_child_packing (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding, GtkPackType pack_type);

Date de mise à jour : 05 janvier 2003.