Programmation GTK2 en Pascal/GtkHScale
Présentation.
Le contrôle GtkHScale est un curseur horizontal qui permet de sélectionner une valeur numérique.
Utilisation de base.
Création.
La création d'un curseur se fait grâce à la fonction : 
 function gtk_hscale_new(adjustment : PGtkAdjustment) : PGtkWidget;
Le paramètre codice_1 est l'ajustement que le curseur doit représenter. Le même ajustement peut être attribué à plusieurs curseurs sur la même fenêtre. Le déplacement de l'un entrainera le déplacement des autres.
La création d'un ajustement qui est un type codice_2 se fait grâce à la fonction :
 function gtk_adjustment_new(value : gdouble; lower : gdouble; upper : gdouble; 
 step_increment : gdouble; page_increment : gdouble; page_size : gdouble) : PGtkObject;
Le paramètre codice_3 représente la valeur actuelle de l'ajustement, les paramètres codice_4 et codice_5 sont les valeurs mini et maxi, donc les valeurs quand le curseur sera respectivement à gauche et à droite. Le paramètre codice_6 est la valeur qui est utilisée pour incrémenter ou décrémenter la valeur de l'ajustement quand on bouge le curseur d'une position. Les autres paramètres doivent être utilisés pour les ascenseurs.
On peut en fait créer un curseur plus rapidement en utilisant la fonction :
 function gtk_hscale_new_with_range(min : gdouble; max : gdouble; step : gdouble) : PGtkWidget;
Il n'y a pas d'ajustement à fournir, juste les valeurs codice_7 et codice_8, ainsi que le pas, codice_9.
Affichage de la valeur.
Par défaut, la valeur est affichée près du curseur. On peut changer cela avec la fonction :
 procedure gtk_scale_set_draw_value(scale : PGtkScale; draw_value : gboolean);
Le paramètre codice_10 est le curseur et si on met FALSE dans codice_11, la valeur ne sera pas affichée. TRUE l'affiche.
On peut également déterminer le nombre de chiffres après la virgule on désire afficher avec la fonction :
 procedure gtk_scale_set_digits(scale : PGtkScale; digits : gint);
Le paramètre codice_12 permet d'indiquer le nombre de chiffres désirés.
Une dernière fonction permet de décider de l'emplacement de l'affichage de la valeur, par défaut celui-ci étant au dessus du curseur :
 procedure gtk_scale_set_value_pos(scale : PGtkScale; pos : TGtkPositionType);
Le paramètre codice_13 peut prendre les valeurs :
Position du curseur.
C'est l'objet codice_14 dont codice_15 hérite les propriétés qui gère la position du curseur. Pour positionner le curseur, on a donc la fonction :
 procedure gtk_range_set_value(range : PGtkRange; value : gdouble);
Le paramètre codice_3 donne la valeur.
Pour récupérer la position du curseur, on utilisera :
 function gtk_range_get_value(range : PGtkRange) : gdouble;
À noter qu'à chaque déplacement, un signal « value_changed » est émis.
Programme exemple.
Dans une fenêtre, on va placer une jauge horizontale pouvant aller de 0 à 100 avec comme valeur initiale 50 et l'ffichage de la valeur en dessous. On aura un bouton et un label, le bouton permettant d'afficher la valeur dans le label.
Voilà le fichier codice_17 :
 program gtk026;
 uses glib2, gtk2;
 type
 TFenetrePrincipale = record
 pFenetre : PGtkWidget;
 pVBox : PGtkWidget;
 pCurseur : PGtkWidget;
 pBouton : PGtkWidget;
 pLabel : PGtkWidget;
 end;
 PFenetrePrincipale = ^TFenetrePrincipale;
 procedure OnBtnClick(APWidget : PGtkwidget; AData : pgpointer); cdecl;
 var
 pFenPrinc : PFenetrePrincipale;
 Valeur : GDouble;
 Texte : PGChar;
 begin
 // Récuperation des données de la fenêtre principale (qui sont dans AData)
 pFenPrinc := PFenetrePrincipale(AData);
 // Récuperation du texte contenu dans le GtkHScale
 Valeur := gtk_range_get_value(GTK_RANGE(pFenPrinc^.pCurseur));
 Texte := g_strdup_printf('%f', [Valeur]); 
 // Modification du texte contenu dans le GtkLabel */
 gtk_label_set_text(GTK_LABEL(pFenPrinc^.pLabel), Texte);
 g_free(Texte);
 end;
 var
 pFenPrinc : PFenetrePrincipale;
 begin
 pFenPrinc := g_malloc(SizeOf(TFenetrePrincipale));
 gtk_init(@argc, @argv);
 pFenPrinc^.pFenetre := gtk_window_new(GTK_WINDOW_TOPLEVEL);
 gtk_window_set_position(GTK_WINDOW(pFenPrinc^.pFenetre), GTK_WIN_POS_CENTER);
 gtk_window_set_default_size(GTK_WINDOW(pFenPrinc^.pFenetre), 320, 200);
 gtk_container_set_border_width(GTK_CONTAINER(pFenPrinc^.pFenetre), 4);
 gtk_window_set_title(GTK_WINDOW(pFenPrinc^.pFenetre), 'Gtk026 : Curseur');
 gtk_signal_connect(pGTKOBJECT(pFenPrinc^.pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);
 pFenPrinc^.pVBox := gtk_vbox_new(TRUE, 0);
 gtk_container_add(GTK_CONTAINER(pFenPrinc^.pFenetre), pFenPrinc^.pVBox);
 // Création du GtkHScale
 pFenPrinc^.pCurseur := gtk_hscale_new_with_range(0, 100, 1);
 // Position du curseur
 gtk_range_set_value(GTK_RANGE(pFenPrinc^.pCurseur), 50);
 // Affichage de 2 chiffres après la virgule
 gtk_scale_set_digits(GTK_SCALE(pFenPrinc^.pCurseur), 2);
 // Affichage de la valeur en dessous
 gtk_scale_set_value_pos(GTK_SCALE(pFenPrinc^.pCurseur), GTK_POS_BOTTOM);
 gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pCurseur, TRUE, FALSE, 0);
 pFenPrinc^.pBouton := gtk_button_new_with_label('Copier');
 gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pBouton, TRUE, FALSE, 0);
 g_signal_connect(pGTKOBJECT(pFenPrinc^.pBouton), 'clicked', 
 GTK_SIGNAL_FUNC(@OnBtnClick), gpointer(pFenPrinc));
 pFenPrinc^.pLabel := gtk_label_new(NULL);
 gtk_box_pack_start(GTK_BOX(pFenPrinc^.pVBox), pFenPrinc^.pLabel, TRUE, FALSE, 0);
 gtk_widget_show_all(pFenPrinc^.pFenetre);
 gtk_main;
 g_free(pFenPrinc);
 end.
Voilà ce que donne l'exécution du programme codice_18 :
Puis après avoir déplacé le curseur et cliqué sur le bouton :