Utilisation des fontes TrueType avec Firemonkey

Le framework Firemonkey utilise des librairies graphiques pour afficher les composants et textes à l'écran. Tout est dessiné sauf dans le cas de composants "natifs" spécifiques.

Et quand je dis "tout", c'est vraiment tout, y compris les champs de saisie. C'est pour cette raison que Firemonkey offre une telle puissance visuelle avec la possibilité d'intégrer des composant 2D dans un environnement 3D, de les faire tourner à l'écran, d'ajouter des effets, des ombres, etc... C'est aussi grâce à ce choix technique que les composants visuels peuvent être entièrement redessinés à travers les styles : chaque élément a un nom, une série de formes, dont on peut redéfinir les caractéristiques.

Les affichages de textes ne dépendent donc que de la librairie graphique utilisée et des API du système d'exploitation pour apparaître sur nos écrans sous forme d'images.

Firemonkey gère donc les polices TrueType, un format normalisé pour la typographie sur ordinateurs et imprimantes. chaque système d'exploitation est livré avec un certain nombre de fontes et de déclinaisons. Les plus connues sont Comic Sans Serif, Times New Roman, Helvetica, Courier, Garamond et maintenant Calibri, fournie et utilisée par Microsoft dans sa suite Office.

D'une façon générale, c'est le système d'exploitation qui gère les polices de caractères disponibles et en fournit la liste aux programmes à travers une API. Le programme peut (en théorie) ajouter ou retirer des fontes de la liste du système. Il peut enfin choisir celle à utiliser pour chaque texte à afficher à l'écran. Bien entendu chaque système a sa façon de faire.

Du côté de Delphi, on a deux façon d'afficher un texte à l'écran : utiliser un composant ayant une propriété "text" ou "caption" ou passer par un dessin directement sur le "canvas" d'un composant (la zone de dessin que tout composant possède). La fonte à utiliser doit être indiquée avant l'affichage des textes.

Si on prend une fiche vierge et qu'on y place un TLabel, on retrouve la propriété "text" qui correspond à ce qu'il doit afficher et la propriété TextSettings dans laquelle on trouve une sous-propriété Font puis Family. Depuis le concepteur de fiches il suffit de cliquer sur la case des familles de fontes pour afficher la liste actuellement disponible sur l'ordinateur de développement. On peut aussi faire une affectation par programmation.

  Label1.TextSettings.Font.Family := 'Courier New';

Cette affectation peut être modifiée à tout moment dans le programme, être gérée dans un style en fonction de la plateforme d'exécution et dans le concepteur de fiches.

Pour dessiner un texte à la main sur le canvas d'un composant, il suffit d'utiliser ces quelques lignes de code ou jouer avec les TTextLayout, TTextLayoutClass et TTextLayoutManager (dont la documentation officielle est quasi inexistante à ce jour).

  Canvas.BeginScene;
  canvas.Fill.Color := TAlphaColorRec.Blue;
  Canvas.Font.Family := 'Candara';
  Canvas.Font.Size := 15;
  Canvas.FillText(ClientRect, 'Hello World', false, 1, [], TTextAlign.Center);
  Canvas.EndScene;

Des fonctions sont disponibles pour calculer la largeur et la hauteur du texte afin de l'afficher proprement où l'on veut en adaptant sa zone de cliping.

Quand une fonte est demandée par un programme mais n'existe pas sur l'appareil utilisé, la fonte par défaut est utilisée.

Maintenant que vous avez les bases en tête, reste à voir pour chaque plateforme comment on ajoute ses fontes TTF personnelles sans avoir à les ajouter à la liste des fontes de l'ordinateur sur lequel le programme doit s'exécuter (puisque ce n'est pas faisable sous iOS ni Android). Je vous laisse donc revenir à cette page et faire votre choix.


Mug Toucan DX dans la baie de RioMug Toucan DX dans la baie de Rio