/* Création d'une boîte verticale (vbox) pour y placer les boîtes
 * horizontales.
 * Ceci permet de placer les boîtes horizontales contenant les boutons
 * les unes au dessus des autres dans cette vbox. */
 box1 = gtk_vbox_new (FALSE, 0);
 /* L'exemple à afficher. Ils correspondent aux images ci-dessus. */
 switch (which) {
 case 1:
 /* Création d'un label. */
 label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");
 /* Alignement du label à gauche. On précisera cette fonction ainsi
 * que les autres dans la section sur les attributs des widgets. */
 gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
 /* Placement du label dans la boîte verticale (vbox box1). Il ne
 * faut pas oublier que les widgets qui s'ajoutent à une vbox sont
 * placés les uns au dessus des autres. */
 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
 /* Affichage du label */
 gtk_widget_show (label);
 /* On appelle notre fonction de construction de boîte :
 * homogeneous = FALSE, spacing = 0,
 * expand = FALSE, fill = FALSE, padding = 0 */
 box2 = make_box (FALSE, 0, FALSE, FALSE, 0);
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 /* On appelle notre fonction de construction de boîte :
 * homogeneous = FALSE, spacing = 0,
 * expand = TRUE, fill = FALSE, padding = 0 */
 box2 = make_box (FALSE, 0, TRUE, FALSE, 0);
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 /* Paramètres : homogeneous = FALSE, spacing = 0, 
 * expand = TRUE, fill = TRUE, padding = 0 */
 box2 = make_box (FALSE, 0, TRUE, TRUE, 0);
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 /* Création d'un séparateur, on verra cela plus tard, mais ils sont
 * simples à utiliser. */
 separator = gtk_hseparator_new ();
 /* Placement du séparateur dans la vbox. Ne pas oublier que tous les
 * widgets sont placés dans une vbox et qu'il seront placés 
 * verticalement. */
 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
 gtk_widget_show (separator);
 /* Création d'un nouveau label et affichage de celui-ci. */
 label = gtk_label_new ("gtk_hbox_new (TRUE, 0);");
 gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
 gtk_widget_show (label);
 /* Paramètres : homogeneous = TRUE, spacing = 0, 
 * expand = TRUE, fill = FALSE, padding = 0 */
 box2 = make_box (TRUE, 0, TRUE, FALSE, 0);
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 /* Paramètres : homogeneous = TRUE, spacing = 0, 
 * expand = TRUE, fill = TRUE, padding = 0 */
 box2 = make_box (TRUE, 0, TRUE, TRUE, 0);
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 /* Un autre séparateur */
 separator = gtk_hseparator_new ();
 /* Les 3 derniers paramètres de gtk_box_pack_start sont : 
 * expand = FALSE, fill = TRUE, padding = 5. */
 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
 gtk_widget_show (separator);
 break;
 case 2:
 /* Création d'un label, box1 est une vbox identique à 
 * celle créée au début de main() */
 label = gtk_label_new ("gtk_hbox_new (FALSE, 10);");
 gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
 gtk_widget_show (label);
 /* Paramètres : homogeneous = FALSE, spacing = 10, 
 * expand = TRUE, fill = FALSE, padding = 0 */
 box2 = make_box (FALSE, 10, TRUE, FALSE, 0);
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 /* Paramètres : homogeneous = FALSE, spacing = 10, 
 * expand = TRUE, fill = TRUE, padding = 0 */
 box2 = make_box (FALSE, 10, TRUE, TRUE, 0);
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 separator = gtk_hseparator_new ();
 /* Les 3 derniers paramètres de gtk_box_pack_start sont : 
 * expand = FALSE, fill = TRUE, padding = 5. */
 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
 gtk_widget_show (separator);
 label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");
 gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
 gtk_widget_show (label);
 /* Paramètres : homogeneous = FALSE, spacing = 0, 
 * expand = TRUE, fill = FALSE, padding = 10 */
 box2 = make_box (FALSE, 0, TRUE, FALSE, 10);
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 /* Paramètres : homogeneous = FALSE, spacing = 0, 
 * expand = TRUE, fill = TRUE, padding = 10 */
 box2 = make_box (FALSE, 0, TRUE, TRUE, 10);
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 separator = gtk_hseparator_new ();
 /* Les 3 derniers paramètres de gtk_box_pack_start sont : 
 * expand = FALSE, fill = TRUE, padding = 5. */
 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
 gtk_widget_show (separator);
 break;
 case 3:
 /* Ceci est une démonstration de la possibilité d'utiliser 
 * gtk_box_pack_end() pour aligner les widgets à droite.
 * On crée d'abord une nouvelle boîte comme d'habitude. */
 box2 = make_box (FALSE, 0, FALSE, FALSE, 0);
 /* On crée le label qui sera mis à la fin. */
 label = gtk_label_new ("end");
 /* On le place en utilisant gtk_box_pack_end(), il est ainsi
 * mis à droite de la hbox créée par l'appel à make_box(). */
 gtk_box_pack_end (GTK_BOX (box2), label, FALSE, FALSE, 0);
 /* Affichage du label. */
 gtk_widget_show (label);
 /* Placement de box2 dans box1 (la vbox, vous vous rappelez ? :) */
 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
 gtk_widget_show (box2);
 /* Séparateur pour le bas. */
 separator = gtk_hseparator_new ();
 /* Configuration du séparateur en 400x5 pixels. 
 * La hbox que l'on a créée aura donc 400 pixels de large, 
 * et le label "end" sera séparé des autres de la hbox.
 * Sinon, tous les widgets de la hbox seraient placés les plus
 * près possible les uns des autres. */
 gtk_widget_set_usize (separator, 400, 5);
 /* Placement du séparateur dans la vbox (box1) 
 * créée au debut de main(). */
 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
 gtk_widget_show (separator);

/* Création d'une nouvelle hbox.. vous pouvez en utiliser autant que
 * que vous en avez besoin ! */
 quitbox = gtk_hbox_new (FALSE, 0);
 /* Notre bouton pour quitter. */
 button = gtk_button_new_with_label ("Quit");
 /* Configuration du signal pour détruire la fenêtre. Ceci enverra le
 * signal "destroy" à la fenêtre. Ce signal sera à son tour capturé
 * par notre gestionnaire de signal défini plus haut. */
 gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
 GTK_SIGNAL_FUNC (gtk_widget_destroy),
 GTK_OBJECT (window));
 /* Placement du bouton dans la « quitbox ».
 * Les 3 derniers paramètres de gtk_box_pack_start sont : 
 * expand = TRUE, fill = FALSE, padding = 0. */
 gtk_box_pack_start (GTK_BOX (quitbox), button, TRUE, FALSE, 0);
 /* Placement de la quitbox dans la vbox (box1) */
 gtk_box_pack_start (GTK_BOX (box1), quitbox, FALSE, FALSE, 0);
 /* Placement de la vbox (box1), qui contient maintenant tous nos
 * widgets, dans la fenêtre principale. */
 gtk_container_add (GTK_CONTAINER (window), box1);
 /* Affichage */
 gtk_widget_show (button);
 gtk_widget_show (quitbox);
 gtk_widget_show (box1);
 /* Affichage de la fenêtre en dernier */
 gtk_widget_show (window);
 /* Ne pas oublier notre fonction principale. */
 gtk_main ();
 /* Le contrôle revient ici lorsque gtk_main_quit() est appelée,
 * jusqu'à ce que gtk_exit() soitutilisée. */
 return 0;

Programmation GTK/Placement avec les tables