# Programmation GTK2 en Pascal/GtkBox

* Programmation GTK2 en Pascal
* Introduction
* Pré-requis
* Logiciels nécessaires
* Installation sous Linux
* Installation sous Windows
* Installation sous Mac/OS
* Une application minimale
* Les bases
* La notion d'objet
* La gestion des évènements
* Le placement des contrôles
* Les contrôles (widgets) Gtk
* Les fenêtres
* Les conteneurs
* Les visuels
* Les boutons
* La saisie de données
* Les listes déroulantes
* Les menus
* Les décorations
* La barre d'outils
* Les sélections
* Les zones de texte
* Les listes et arbres
* La Glib : objets et fonctions
* Dessiner avec le Gdk
* Conclusion
* Bibliographie

## Présentation

Le contrôle GtkBox est un contrôle conteneur que nous n'allons pas utiliser directement mais plutôt par la biais de deux contrôles fils qui sont GtkHBox et GtkVBox. Le but principal d'une GtkBox (qu'elle soit H ou V) et de pouvoir contenir plusieurs contrôles dans une même boite. Les contrôles sont pour ainsi dire empiler les uns sur les autres. Nous allons donc étudier les quelques fonctions de ce contrôle qui nous sont utiles.

### Hiérarchie

* Hiérarchie
* GObject
* └─GtkObject
* └─GtkWidget
* └─GtkContainer
* └─GtkBox

## Utilisation de base
### Ajout de contrôle

Avant de pouvoir ajouter un contrôle dans une GtkHBox ou GtkVBox, il faut savoir que pour une GtkBox il existe la notion de premier et de dernier contrôle. Nous allons donc pouvoir ajouter des contrôles soit par le début soit par la fin avec une de ces deux fonctions :
La première fonction ajoute un contrôle par le début de la GtkBox et la deuxième par la fin.
Pour les paramètres, ils sont les mêmes pour les deux fonctions. Le premier, box, est en fait le contrôle conteneur dans lequel nous allons insérer le contrôle child qui vient en deuxième paramètre.
Le troisième paramètre, expand nécessite un petite explication. Nous ne le voyons pas ici, mais lors de la création d'une GtkHBox ou GtkVBox, il faut définir une propriété appelée homogeneous. Cette propriété détermine si les contrôles qui sont à l'intérieur de la GtkBox vont se partager l'intégralité de l'espace fourni, ou alors réserver uniquement la place qui leur est nécessaire (la fonction pour mettre à jour cette propriété est gtk_box_set_homogeneous).
Petit exemple, nous avons un espace de 3 pixels dans lequel nous voulons insérer deux contrôles de 1 pixel. Si le paramètre homogeneous est à TRUE, chaque contrôle réservera un espace de 1,5 pixel. Au contraire si il est à FALSE, chaque contrôle réservera un espace de 1 pixel, laissant donc un espace libre de 1 pixel à la fin. Revenons donc au paramètre expand. Si la GtkBox est homogène, la valeur de ce paramètre n'a aucune importance. Par contre si la GtkBox n'est pas homogène, le fait de mettre expand à TRUE à un contrôle va lui permettre de partager l'espace restant dans la GtkBox avec les autres contrôles qui auront été insérés avec expand à TRUE.
Reprenons notre exemple. La GtkBox n'est pas homogène, donc normalement chaque contrôle va réserver 1 pixel de l'espace. Si nous mettons le premier contrôle avec expand à TRUE et le deuxième avec expand à FALSE, le deuxième contrôle réservera un espace de 1 pixel, le premier aussi mais il doit se partager l'espace libre (1 pixel) avec les autres contrôles qui ont aussi la propriété expand à TRUE. Comme il est tout seul avec cette propriété, il va donc réserver 2 pixels.
Le paramètre fill permet de définir si le contrôle enfant occupe toute la zone qui lui est réservée. Il n'est utilisé que si expand est à TRUE.
Et enfin, le paramètre padding permet d'ajouter de l'espace autour du contrôle.
À noter les deux fonctions :
Elles sont équivalentes aux deux fonctions ci-dessus avec les trois derniers paramètres positionnés par défaut : expand est à TRUE, fill est à TRUE et padding est à 0.

## Programme exemple

Dans cet exemple, nous allons insérer un bouton dans la GtkVBox, deux boutons dans une GtkHBox elle-même dans la GtkVBox puis enfin un bouton dans la GtkVBox, afin d'étudier les fonctions d'ajout du contrôle GtkBox.
Voilà le fichier gtk005.pas :
Voilà ce que donne l'exécution du programme gtk005 :
Récapitulatif des paramètres de gtk_box_pack_start pour chaque bouton :
| Bouton | expand | fill |
| n° 1 | True | False |
| n° 2 | True | True |
| n° 3 | True | False |
| n° 4 | True | True |
* Conteneurs :
* GtkContainer ~
* GtkBox ~
* GtkBin —
* GtkHBox ~
* GtkVBox ~
* GtkTable ~
* GtkNotebook