Programmation GTK2 en Pascal/GtkBox
Programmation GTK2 en Pascal |
|
Présentation
modifierLe 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
modifierHiérarchie |
GObject └─GtkObject └─GtkWidget └─GtkContainer └─GtkBox |
Utilisation de base
modifierAjout de contrôle
modifierAvant 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 :
procedure gtk_box_pack_start(box : PGtkBox; child : PGtkWidget; expand : gboolean; fill : gboolean; padding : guint); procedure gtk_box_pack_end(box : PGtkBox; child : PGtkWidget; expand : gboolean; fill : gboolean; padding : guint);
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 :
procedure gtk_box_pack_start_defaults(box : PGtkBox; widget : PGtkWidget); procedure gtk_box_pack_end_defaults(box : PGtkBox; widget : PGtkWidget);
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
modifierDans 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
:
program gtk005;
uses glib2, gtk2;
var
pFenetre : PGtkWidget;
pVBox : PGtkWidget;
pHBox : PGtkWidget;
pBouton : array [1..4] of PGtkWidget;
begin
gtk_init(@argc, @argv);
pFenetre := gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(pFenetre), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(pFenetre), 320, 200);
gtk_window_set_title(GTK_WINDOW(pFenetre), 'Gtk005 : GtkBox');
gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);
// Création de la GtkVBox
pVBox := gtk_vbox_new(TRUE, 0);
// Ajout de la GtkVBox dans la fenêtre
gtk_container_add(GTK_CONTAINER(pFenetre), pVBox);
// Création des boutons
pBouton[1] := gtk_button_new_with_label('Bouton 1');
pBouton[2] := gtk_button_new_with_label('Bouton 2');
pBouton[3] := gtk_button_new_with_label('Bouton 3');
pBouton[4] := gtk_button_new_with_label('Bouton 4');
// Ajout du bouton 1 dans la GtkVBox
gtk_box_pack_start(GTK_BOX(pVBox), pBouton[1], TRUE, FALSE, 0);
// Creation de la « boîte » 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), pBouton[2], TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(pHBox), pBouton[3], TRUE, FALSE, 0);
// Ajout du dernier bouton dans la GtkVBox
gtk_box_pack_start(GTK_BOX(pVBox), pBouton[4], TRUE, TRUE, 0);
gtk_widget_show_all(pFenetre);
gtk_main;
end.
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 |