Programmation GTK2 en Pascal/GtkLabel
Présentation.
Le contrôle GtkLabel va nous permettre d'afficher du texte à l'intérieur de nos fenêtres.
Utilisation de base.
Création d'un label.
Après avoir déclarer un objet codice_1 de type codice_2, il faut utiliser la fonction :
 function gtk_label_new(str : Pchar) : PGtkWidget;
Le paramètre codice_3 n'est autre que le texte qui sera affiché par le codice_4.
Modification du label.
Il peut arriver qu'au cours d'un programme, l'on veuille modifier le texte qui est affiché. La fonction à utiliser est la suivante :
 procedure gtk_label_set_label(_label : PGtkLabel; str : Pgchar);
Le premier paramètre codice_5 correspond au contrôle dont on veut modifier le texte, et le paramètre codice_3 est le nouveau texte qui sera affiché.
Récupération du label.
Pour récupérer le texte qui est affiché par un label, la fonction est :
 function gtk_label_get_label(_label : PGtkLabel) : Pgchar;
Attention la valeur de retour est une variable constante, il ne faut donc pas essayer de la modifier.
Alignement du texte.
Maintenant, nous allons voir comment aligner notre texte lorsque celui-ci comporte plusieurs lignes. Comme d'habitude, GTK+ nous fourni une fonction très simple d'utilisation :
 procedure gtk_label_set_justify(_label : PGtkLabel; jtype : TGtkJustification);
Le paramètre codice_7 correspond à l'alignement du texte et peut prendre une de ces valeurs :
Au contraire, pour obtenir l'alignement du texte, la fonction est :
 function gtk_label_get_justify(_label : PGtkLabel) : TGtkJustification;
Programme exemple.
Nous allons, comme programme exemple, utiliser le classique « Hello Word! », traduit ici en « Bonjour tout le monde ! ».
Voilà le fichier codice_8 :
 program gtk011;
 uses glib2, gtk2;
 var
 pFenetre : PGtkWidget;
 pLabel : 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), 'Gtk011 : GtkLabel');
 gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);
 // Création du GtkLabel et ajout dans la fenêtre
 pLabel := gtk_label_new('Bonjour tout le monde !');
 gtk_container_add(GTK_CONTAINER(pFenetre), pLabel);
 gtk_widget_show_all(pFenetre);
 gtk_main;
 end.
Voilà ce que donne l'exécution du programme codice_9 :
Les caractères accentués.
Vous avez peut-être déjà essayé d'afficher du texte contenant des caractères tel que « é, è, à, ... » en n'ayant pas utilisé un éditeur de textes unicode (utf-8), et lors de l'exécution, votre texte ne s'affiche pas complètement. Nous allons maintenant voir le pourquoi du comment.
Application test.
Pour vous montrer tout cela, nous allons reprendre l'exemple précédent en remplaçant « Bonjour tout le monde » par « Texte à afficher », et cela ne marche pas ! En effet vous obtenez cela :
Et en plus sur la console, vous avez le message d'erreur suivant :
 ** (gtk012:3449): WARNING **: Invalid UTF8 string passed to pango_layout_set_text()
Comment ça marche ?
Pour afficher du texte, Gtk utilise la librairie Pango qui s'occupe du rendu et de l'affichage du texte. Le but de Pango est de permettre l'internationalisation des applications, et pour cela Pango utilise l'encodage utf-8. Ce charset est codé de 1 à 4 octets permettant d'afficher 4 milliards caractères, afin d'afficher des caractères accentués et bien plus (ex : pour le grec, le chinois, etc.).
Puisque Pango sait faire tout cela, pourquoi le test n'a-t-il pas fonctionné ? Et bien, tout simplement parce que votre système d'exploitation n'utilise pas ce charset. Lorsque vous souhaitez afficher « Texte à afficher », Pango va avant tout vérifier l'encodage d'un caractère et si l'un de ces caractères n'est pas correct, Pango va arrêter son processus de rendu et envoyer un message d'erreur.
Le moyen le plus simple pour voir les effets d'une erreur d'encodage est de changer celui de votre navigateur. Modifiez les options de votre navigateur afin d'utiliser l'encodage iso-8859-1. Cette page web utilisant le charset unicode (utf-8), les caractères accentués deviendront des signes cabalistiques.
Solution.
Une seule chose s'impose à nous : il faut convertir notre chaîne de caractère en utf-8. 
Pour cela, soit utiliser la première solution qu'on a utilisé des le début de ce cours qui est d'utiliser un éditeur de texte permettant la frappe et la sauvegarde de caractères codés en utf-8.
Soit utiliser une fonction de Glib qui est :
 function g_locale_to_utf8(opsysstring : Pgchar; len : gssize; bytes_read : Pgsize; 
 bytes_written : Pgsize; error : PPGError) : Pgchar;
La valeur de retour est le pointeur sur la chaîne de caractère fraîchement convertie. Si une erreur est survenue lors de la conversion, codice_10 renvoie NULL. Il faudra tout de même libérer le mémoire allouée par cette fonction lorsque la variable ne sera plus utile.
Le premier paramètre codice_11 est la chaîne de caractère à convertir et le second paramètre codice_12 correspond à la longueur de la chaîne. Ce paramètre sera en général égal à -1 (on laisse la bibliothèque calculer la longueur toute seule).
Les trois derniers paramètres sont utiles en cas d'erreur lors de la conversion. Tout d'abord codice_13 est le nombre d'octet qui ont été lus dans le texte à convertir, et codice_14 le nombre d'octet qui ont été écris dans la nouvelle chaîne de caractères.
Le dernier paramètre codice_15, donne plus de précision en cas d'erreur. Voici la liste des messages d'erreur possibles :
Attention cette fonction alloue de la mémoire. Lorsque vous n'avez plus besoin de la valeur de retour de cette fonction, il faut libérer la mémoire à l'aide de la fonction codice_16.
Programme exemple.
Pour notre exemple, nous n'allons pas utiliser les trois derniers paramètres. En cas d'erreur, il n'y aura donc aucun moyen d'avoir plus de précision sur l'erreur survenue.
Voilà le fichier codice_17 (sauvegardé en codage ISO-8859-15) :
 program gtk013;
 uses glib2, gtk2;
 var
 pFenetre : PGtkWidget;
 pLabel : PGtkWidget;
 Utf8 : PGChar;
 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), 'Gtk013 : GtkLabel (ISO-8859-15)');
 gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);
 // Création du GtkLabel et ajout dans la fenêtre
 Utf8 := g_locale_to_utf8('Texte à afficher', -1, NULL, NULL, NULL);
 pLabel := gtk_label_new(Utf8);
 g_free(Utf8);
 gtk_container_add(GTK_CONTAINER(pFenetre), pLabel);
 gtk_widget_show_all(pFenetre);
 gtk_main;
 end.
Voilà ce que donne l'exécution du programme codice_18 :
Formatage du texte.
Nous allons maintenant voir comment modifier l'apparence de notre texte (police, couleur, etc.).
Pour notre application test, nous allons afficher une ligne en Courier gras taille 10, une ligne en Times New Roman italique bleu taille 12, et une ligne en Verdana souligné taille 16. Et tout cela centré (bien sûr).
Définition du format.
Une fois encore, nous allons utiliser les propriétés de Pango (même si nous n'allons pas utiliser les fonctions de Pango directement).
Pour définir le format du texte, il suffit d'insérer des balises à l'intérieur même de notre texte. Pango s'occupe ensuite de rechercher les balises puis de formater le texte à notre convenance.
Les balises rapides.
Les balises rapides servent à mettre le texte en gras, italique ou autre de manière très simple. Voici l'intégralité de ces balises :
Pour utiliser ces balises, il suffit d'encadrer le texte à modifier des balises de formatage. Par exemple, pour mettre le texte en gras, il faudra entrer : 'Normal vs <b>Gras</b>'.
Mais cela ne suffit pas, il faut aussi dire que le texte utilise les balises Pango, ce qui est possible avec la fonction suivante :
 procedure gtk_label_set_use_markup(_label : PGtkLabel; setting : gboolean);
Il faut mettre le paramètre codice_19 à TRUE, et le texte sera alors formaté en conséquence.
Un autre moyen de spécifier l'utilisation des balises, est d'utiliser cette fonction :
 procedure gtk_label_set_markup(_label : PGtkLabel; str : Pgchar);
Cette fonction dit à Pango qu'il faut utiliser les balises, mais elle modifie aussi le label en affichant la chaîne de caractères codice_3 (deuxième paramètre).
La balise <span>.
Ici nous allons étudier la balise <span> en détail. Avec celle-ci, nous allons pouvoir changer la police de caractères, la couleur du texte et bien d'autres choses.
Cette balise s'utilise comme les précédentes si ce n'est qu'elle accepte des paramètres. Le tableau ci-dessous présente tous les paramètres et les effets sur le texte.
Tous ces paramètres peuvent être mis à l'intérieur d'une seule et même balise <span>.
Programme exemple.
Voilà le fichier codice_21 (sauvegardé en codage ISO-8859-15) :
 program gtk014;
 uses glib2, gtk2;
 var
 pFenetre : PGtkWidget;
 pLabel : PGtkWidget;
 Utf8 : PGChar;
 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), 'Gtk014 : Formatage texte');
 gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);
 // Création du GtkLabel et ajout dans la fenêtre
 pLabel := gtk_label_new(NULL);
 Utf8 := g_locale_to_utf8('<span face="Courier New"><b>Courier New 10 Gras</b></span>'#13#10 +
 '<span font_desc="Times New Roman italic 12" foreground="#0000FF">' +
 'Times New Roman 12 Italique</span>'#13#10 +
 '<span face="Sans" size="16"><u>Sans 16 Souligné</u></span>', -1, NULL, NULL, NULL);
 gtk_label_set_markup(GTK_LABEL(pLabel), Utf8);
 g_free(Utf8);
 gtk_container_add(GTK_CONTAINER(pFenetre), pLabel);
 gtk_widget_show_all(pFenetre);
 gtk_main;
 end.
Voilà ce que donne l'exécution du programme codice_22 :
Note : "On a beau jouer sur les différentes valeurs du paramètre codice_23 et même de codice_24 de la troisième ligne, celle-ci s'affiche en très petit. En cours de recherche..."