À cause de cette liberté, le placement des boîtes avec GTK peut paraître déroutant au premier abord. Il existe beaucoup d'options et il n'est pas tout de suite évident de comprendre comment elles s'accordent toutes ensemble. En fait, il y a 5 styles de base différents.
Chaque ligne contient une boîte horizontale ("hbox") contenant plusieurs boutons. L'appel à codice_1 indique la façon dont sont placés tous les boutons dans la hbox. Chaque bouton est placé dans la hbox de la même façon (mêmes paramètres que la fonction codice_2).
Voici la déclaration de la fonction codice_3.
 void gtk_box_pack_start (GtkBox *box,
 GtkWidget *child,
 gint expand,
 gint fill,
 gint padding);
Le premier paramètre est la boîte dans laquelle on place l'objet, le second est cet objet. Tous les objets sont tous des boutons jusqu'à maintenant, on place donc des boutons dans des boîtes.
Le paramètre expand de codice_2 ou codice_5 contrôle la façon dont le widget est placé dans la boîte. S'il vaut codice_6, les widgets sont disposés dans la boîte de façon à en occuper tout l'espace. S'il vaut codice_7, la boîte est rétrécie pour correspondre à la taille du widget. Mettre expand à codice_7 vous permettra d'aligner à droite et à gauche vos widgets. Sinon, ils s'élargiront pour occuper toute la boîte. Le même effet pourrait être obtenu en utilisant uniquement une des deux fonctions codice_3 ou codice_10.
Le paramètre fill des fonctions codice_1 contrôle si de l'espace supplémentaire doit être alloué aux objets eux-mêmes (codice_6), ou si on doit rajouter de l'espace (padding) dans la boîte autour des objets (codice_7). Il n'a de sens que si le paramètre expand vaut codice_6.
Lorsque l'on crée une nouvelle boîte, on utilise une fonction comme :
 GtkWidget * gtk_hbox_new (gint homogeneous,
 gint spacing);
Le paramètre homogeneous de codice_15 (et c'est la même chose pour gtk_vbox_new) vérifie que chaque objet de la boîte ait la même taille (i.e. la même largeur dans une hbox, la même hauteur dans une "vbox"). S'il vaut codice_6, le paramètre expand des fonctions codice_1 sera toujours mis à codice_6.
Quelle est alors la différence entre les paramètres spacing (configuré lorsque la boîte est créée) et padding (configuré lorsque les éléments sont placés) ? spacing ajoute de l'espace entre les objets, et padding en ajoute de chaque côté d'un objet. La figure suivante devrait éclairer tout cela&nbsp:
Voici le code utilisé pour créer les images ci-dessus. J'y ai mis beaucoup de commentaires en espérant que vous n'aurez pas de problème pour le relire. Compilez-le et jouez avec les différents paramètres.

Programmation GTK/Programme de démonstration des placements

Programme de démonstration de placements à l'aide de boîtes :
 #include "gtk/gtk.h"
 void
 delete_event (GtkWidget *widget, GdkEvent *event, gpointer *data)
 gtk_main_quit ();

/* Construction d'une nouvelle hbox remplie de boutons. Les paramètres qui 
 * nous intéressent sont passés à cette fonction.
 * On n'affiche pas la boîte, mais tout ce qu'elle contient. */
 GtkWidget *make_box (gint homogeneous, gint spacing,
 gint expand, gint fill, gint padding) 
 GtkWidget *box;
 GtkWidget *button;
 char padstr[80];
 /* Création d'une hbox avec les paramètres homogeneous et spacing
 * voulus. */
 box = gtk_hbox_new (homogeneous, spacing);
 /* Création d'une série de boutons configurés de façon appropriée */
 button = gtk_button_new_with_label ("gtk_box_pack");
 gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
 gtk_widget_show (button);
 button = gtk_button_new_with_label ("(box,");
 gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
 gtk_widget_show (button);
 button = gtk_button_new_with_label ("button,");
 gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
 gtk_widget_show (button);
 /* Création d'un bouton portant un label dépendant de la valeur
 * du paramètre expand. */
 if (expand == TRUE)
 button = gtk_button_new_with_label ("TRUE,");
 else
 button = gtk_button_new_with_label ("FALSE,");
 gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
 gtk_widget_show (button);
 /* Même chose que ci-dessus mais sous forme abrégée. */
 button = gtk_button_new_with_label (fill ? "TRUE," : "FALSE,");
 gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
 gtk_widget_show (button);
 /* Récupération du paramètre padding sous forme de chaîne. */
 sprintf (padstr, "%d);", padding);
 button = gtk_button_new_with_label (padstr);
 gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
 gtk_widget_show (button);
 return box;

int main (int argc, char *argv[])
 GtkWidget *window;
 GtkWidget *button;
 GtkWidget *box1;
 GtkWidget *box2;
 GtkWidget *separator;
 GtkWidget *label;
 GtkWidget *quitbox;
 int which;
 /* Initialisation, à ne jamais oublier ! :) */
 gtk_init (&argc, &argv);
 if (argc != 2) {
 fprintf (stderr, "usage : %s num, où num vaut 1, 2, ou 3.\n", *argv);
 /* Nettoyage dans GTK et sortie avec un code d'erreur de 1 */
 gtk_exit (1);

which = atoi (argv[1]);
 /* Création de notre fenêtre. */
 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 /* Il ne faut jamais oublier de connecter le signal "destroy" à la
 * fenêtre principale. C'est très important pour disposer d'un 
 * comportement intuitif adéquat. */
 gtk_signal_connect (GTK_OBJECT (window), "delete_event",
 GTK_SIGNAL_FUNC (delete_event), NULL);
 gtk_container_border_width (GTK_CONTAINER (window), 10);