Section courante

A propos

Section administrative du site

Utiliser des polices de caractères

Vous pouvez écrire des programmes QuickPascal générant des graphiques et affichent du texte. Dans n'importe quelle image graphique, le QuickPascal peut afficher différents styles et tailles de caractères. Ces collections de caractères de texte stylisés sont appelées «polices de caractères». Les polices sont simples à apprendre et faciles à utiliser. Pourtant, ils peuvent ajouter une touche de finition à votre programme.

Cette page explique comment utiliser les polices de caractères. Cela suppose que vous avez déjà lu la page «Utiliser des graphiques». Vous devez comprendre des termes tels que «mode graphique» et «mode texte» et être familiarisé avec des procédures telles que _SetVideoMode et _MoveTo.

Notez que les polices de caractères QuickPascal ne peuvent être utilisées que dans les modes graphiques. Les polices de caractères ne peuvent pas être utilisées dans les modes texte.

Présentation des polices QuickPascal

Chaque police de caractères de QuickPascal se compose d'une police de caractères et de plusieurs tailles de caractères. "Typeface" est un terme d'imprimeur faisant référence au style du texte affiché - Courier, par exemple, ou Roman. La liste plus bas montre six des polices de caractères disponibles avec les fonctions de police de caractères QuickPascal.

La «taille du texte» mesure la zone d'écran occupée par les caractères individuels. Ce terme est également emprunté au lexique de l'imprimante, mais pour vos besoins, il est spécifié en unités de pixels d'écran. Par exemple, «Courier 16 x 9» indique un texte de type Courier, chaque caractère occupant une zone d'écran de 16 pixels verticaux sur 9 pixels horizontaux.

Les fonctions de police QuickPascal utilisent deux méthodes pour créer des polices de caractères. La première technique génère les polices de caractères Courier, Helv et Tms Rmn grâce à une technique de «bitmapping». La cartographie de bits définit les images de caractères avec des données binaires. Chaque bit de la carte correspond à un pixel d'écran. Si un bit vaut 1, son pixel associé est défini sur la couleur actuelle de l'écran. Une valeur de bit de 0 efface le pixel. Les adaptateurs vidéo utilisent cette même technique pour afficher du texte en mode graphique.

La deuxième méthode crée les trois styles de caractères restants (Modem, Script et Roman) en tant que polices de caractères «à cartographie vectoriel». La cartographie vectorielle représente chaque caractère en termes de lignes et d'arcs. Au sens littéral, des caractères vectoriels sont dessinés à l'écran. Vous pourriez penser que les caractères bitmap sont au pochoir.

Chaque méthode de création de texte avec police de caractères présente des avantages et des inconvénients. Les caractères bitmap sont formés plus complètement puisque la cartographie de pixels est prédéterminé. Cependant, ils ne peuvent pas être mis à l'échelle à des tailles arbitraires. Le texte cartographié vectoriel peut être mis à l'échelle à n'importe quelle taille, mais les caractères n'ont pas l'apparence solide des caractères cartographiés en bits.

Toute fonction ou procédure affectant la position actuelle des graphiques (telle que la procédure _MoveTo ou la procédure _LineTo) affectera également l'affichage de la police de caractères lorsque _OutGText est appelé. D'autres routines (telles que _SetColor ou _RemapPalette) affectant les caractéristiques de dessin affectent également la sortie du texte de la police de caractères.

Les polices de caractères de QuickPascal apparaissent sur votre écran comme suit :

Police de caractères Exemple de texte
Courier
Helv
Tms Rmn
Modern
Script
Roman

Le tableau suivant décrit les caractéristiques de chaque police de caractères. Notez que les polices de caractères bitmap sont disponibles dans des tailles prédéfinies mesurées en pixels. La taille exacte de tout caractère de police de caractères dépend de la résolution de l'écran et du type d'affichage.

Police de caractères Cartographie Taille (en pixels) Espacement
Courier Bit 13x8, 16x9, 20x12 Fixé
Helv Bit 13x5, 16x7, 20x8
13x15,16x6,19x8
Proportionnel
Tms Rmn Bit 10x5, 12x6, 15x8
16x9, 20x12, 26x16
Proportionnel
Modern Vecteur A l'échelle Proportionnel
Script Vecteur A l'échelle Proportionnel
Roman Vecteur A l'échelle Proportionnel

Utilisation des polices de caractères dans QuickPascal

Les données des polices de caractères bitmap et vectorielles résident dans des fichiers sur le disque. Une extension .FON identifie les fichiers. Les noms des fichiers .FON indiquent leur contenu. Par exemple, les fichiers MODERN.FON, ROMAN.FON et SCRIPT.FON contiennent des données pour les trois polices de caractères de vectorielles.

Les fichiers .FON de QuickPascal sont identiques aux fichiers de police de caractères fournis avec Microsoft QuickC, version 2.0, ainsi qu'aux fichiers .FON utilisés dans l'environnement d'exploitation Windows. Par conséquent, vous pouvez utiliser n'importe quel fichier .FON de Windows avec les fonctions de police de caractères de QuickPascal. Les fichiers .FON de Windows sont également disponibles à l'achat séparément. En outre, plusieurs fournisseurs proposent des logiciels créant ou modifient les fichiers .FON, vous permettant de concevoir vos propres polices de caractères.

Vos programmes doivent suivre ces quatre étapes pour afficher le texte en police de caractères :

Les sections suivantes décrivent en détail chacune des étapes spécifiques à la police de caractères. La procédure d'utilisation des modes vidéo pour les graphiques est décrite dans la section suivante. Un exemple de programme dans la dernière section de cette page montre comment afficher les différentes polices disponibles dans les fichiers .FON de QuickPascal.

Enregistrement des polices de caractères

Les polices de caractères que vous prévoyez d'utiliser doivent être organisées dans une liste en mémoire, un processus appelé "enregistrement". La liste des registres contient des informations sur les fichiers .FON disponibles. Vous enregistrez les polices de caractères en appelant la fonction _RegisterFonts. Cette fonction lit les informations d'entête des fichiers .FON spécifiés. Il construit une liste d'informations sur les fichiers mais ne lit pas les données de cartographie des fichiers.

L'unité MSGraph définit la fonction _RegisterFonts comme la syntaxe suivante :

Function _RegisterFonts(PathName:CSTRING):Integer;

Le paramètre PathName est une chaîne de caractères contenant un nom de fichier. Le nom de fichier est le nom du fichier .FON pour la police de caractères souhaitée. Le nom de fichier peut inclure des caractères génériques, vous permettant d'enregistrer plusieurs polices de caractères avec un seul appel à _RegisterFonts. Par exemple, l'appel de fonction ci-dessous enregistre tous les fichiers .FON dans le répertoire actuel et vérifie la réussite de l'enregistrement :

  1. result:=_RegisterFonts('*.FON');
  2. If(result < 0)Then Begin
  3.  Writeln('Impossible d''enregistrer les polices de caractères');
  4.  Halt(0) ;
  5. End;
  6.  { le reste de votre programme de polices de caractères va ici }

Comme illustré ci-dessus, la fonction _RegisterFonts renvoie un nombre négatif si elle ne peut enregistrer aucune police de caractères ou si le fichier .FON est corrompu. S'il lit avec succès un ou plusieurs fichiers .FON, _RegisterFonts renvoie le nombre de polices de caractères enregistrées.

Définition de la police de caractères actuelle

Pour définir une police de caractères comme police de caractères courante, appelez la fonction _SetFont. Cette fonction vérifie si la police de caractères demandée est enregistrée, puis lit les données de cartographie à partir du fichier .FON approprié. Une police de caractères doit être enregistrée et marquée comme courante avant que votre programme puisse afficher du texte à l'aide de cette police de caractères.

L'unité MSGraph définit la fonction _SetFont comme la syntaxe suivante :

Function _SetFont(Options:CSTRING):Integer;

Le paramètre Options est une chaîne de caractères décrivant les caractéristiques souhaitées de la police de caractères. La chaîne de caractères utilise des codes de lettres décrivant la police de caractères souhaitée, comme indiqué ici :

Code d'option Description
t'FontName' Type de police de caractères de la police de caractères entre guillemets simples. La chaîne de caractères FontName est l'une des suivantes :

courier
helv
modern
roman
script
tms rmn

Notez que la chaîne de caractères FontName est entourée d'une paire de deux guillemets simples. Cela est nécessaire pour incorporer la chaîne de caractères FontName dans la chaîne de caractères Options, et Pascal utilise des guillemets simples pour spécifier une chaîne de caractères. Remarquez l'espace dans "tms rmn".

Les fichiers de polices de caractères d'autres produits utilisent d'autres noms pour FontName. Reportez-vous à la documentation du fournisseur pour ces noms.
hy Hauteur des caractères, où y est la hauteur en pixels
wx Largeur des caractères, où x est la largeur en pixels.
f Sélectionnez uniquement une police de caractères à espacement fixe.
p Sélectionnez uniquement une police de caractères à espacement proportionnel.
v Sélectionnez uniquement une police de caractères à cartographie vectoriel.
r Sélectionnez uniquement une police de caractères bitmap.
b Sélectionnez le meilleur ajustement parmi les polices de caractères enregistrées. Cette option indique à _SetFont d'accepter la police de caractères la plus adaptée si une police de caractères de la taille spécifiée n'est pas enregistrée. Si au moins une police de caractères est enregistrée, l'option b garantit toujours que _SetFont pourra définir une police de caractères courante. Si vous ne spécifiez pas l'option b et qu'aucune police de caractères correspondante exacte n'est enregistrée, _SetFont échouera. Dans ce cas, toute police de caractères actuelle existante reste actuelle. La fonction _SetFont utilise quatre critères pour sélectionner le meilleur ajustement. Dans l'ordre décroissant de priorité, les quatre critères sont la hauteur de pixel, la police de caractères, la largeur de pixel et l'espacement (fixe ou proportionnel). Si vous demandez une police de caractères à cartographie vectoriel, _SetFont dimensionne la police de caractères pour qu'elle corresponde à la hauteur et à la largeur en pixels spécifiées. Si vous demandez une police de caractères bitmap, _SetFont choisit la taille disponible la plus proche. Si la taille de police de caractères demandée pour une police de caractères bitmap correspond exactement entre deux polices de caractères enregistrées, la plus petite taille a priorité.
nx Sélectionnez le numéro de police de caractères x, où x est inférieur ou égal à la valeur renvoyée par _RegisterFonts. Par exemple, l'option n3 active la troisième police de caractères enregistrée, en supposant que trois polices de caractères ou plus sont enregistrées. Cette option est principalement utile pour parcourir toutes les polices enregistrées en boucle. Étant donné que les fichiers .FON contiennent souvent plusieurs polices de caractères et que les fichiers sont chargés en mémoire dans l'ordre inverse à partir duquel ils sont enregistrés, il est difficile de savoir quelle police de caractères sera numéro 3.

Les codes d'option ne sont pas sensibles à la casse et peuvent être répertoriés dans n'importe quel ordre. Vous pouvez séparer les codes par des espaces ou tout autre caractère qui n'est pas un code d'option valide. La fonction _SetFont ignore tous les codes invalides.

Par exemple, l'appel de fonction ci-dessous spécifie que la police doit être une police de caractères "script" avec une hauteur de caractère de 30 pixels et une largeur de caractère de 24 pixels. Si la fonction n'est pas en mesure de le faire, une police de caractères «mieux adaptée» est demandée. Les multiples guillemets simples autour du script sont requis puisque le paramètre entier utilisé par _SetFont est une chaîne de caractères. Le double guillemet simple indique à QuickPascal que la chaîne de caractères contient un guillemet simple.

  1. result:=_SetFont( 't''script''h30w24b' );
  2. If(result=-1)Then Begin
  3.  Writeln('Impossible de définir la police de caractères demandée');
  4.  Halt(0);
  5. End;
  6. Writeln('Police de caractère fixé');
  7. { le reste de votre programme de police de caractères va ici }

Comme illustré ci-dessus, la fonction _SetFont renvoie un -1 si elle ne parvient pas à définir la police de caractères demandée. S'il définit avec succès une police de caractères actuelle, la valeur 0 est renvoyée.

Une fois qu'une police de caractères est définie comme police de caractères courante, la fonction _SetFont met à jour une zone de données avec les paramètres de la police de caractères courante. La zone de données se présente sous la forme d'un enregistrement _FontInfo, défini dans l'unité MSGraph comme :

  1. { Structure pour GetFontInfo }
  2. FontInfo=Record
  3.  FontType:Integer;     { b0 fixé = vecteur, effacé=bitmap }
  4.  Ascent:Integer;       { Distance en pixels du haut à la ligne de base }
  5.  PixWidth:Integer;     { Largeur de caractère en pixels, 0 = proportionnel }
  6.  pixHeight:Integer;    { Hauteur des caractères en pixels }
  7.  AvgWidth:Integer;     { Largeur moyenne des caractères en pixels }
  8.  FileName:CSTRING[81]; { Nom de fichier incluant le chemin }
  9.  FaceName:CSTRING[32]; { Nom de la police de caractères }
  10. End;

Si vous souhaitez récupérer les paramètres de la police de caractères courante, appelez la fonction _GetFontInfo, étant définie dans l'unité MSGraph comme la syntaxe suivante :

Function _GetFontInfo(Var FInfo:FontInfo):Integer;

Affichage du texte à l'aide de la police de caractères actuelle

Vous pouvez maintenant afficher le texte basé sur la police de caractères. Cette étape se compose de deux parties :

Quelques conseils sur l'utilisation des polices de caractères

Le texte avec police de caractères est simplement une autre forme de graphique, et l'utilisation efficace des polices de caractères nécessite peu d'efforts de programmation. Il y a tout de même quelques éléments à surveiller :

Exemple de programme

Les fonctions de police de caractères QuickPascal brillent lorsqu'elles sont utilisées conjointement avec vos autres fonctions graphiques. Ils vous permettent d'habiller n'importe quelle image à l'écran, mais ils peuvent faire une impression visuelle lorsqu'ils sont utilisés seuls, comme l'illustre le programme d'exemple SAMPLER.PAS. Ce programme affiche un exemple de texte dans toutes les polices de caractères disponibles, puis se ferme lorsqu'une touche est enfoncée. Assurez-vous que les fichiers .FON se trouvent dans le répertoire courant avant d'exécuter le programme.

Notez que SAMPLER.PAS appelle la procédure graphique _MoveTo pour établir la position de départ de chaque chaîne de caractères de texte. La section suivant «Comprendre les systèmes de coordonnées» décrit la procédure _MoveTo. La fonction _SetFont prend une chaîne de caractères en paramètre. La chaîne de caractères est une liste d'options spécifiant le type de caractères et le meilleur ajustement pour une hauteur de caractère de 30 pixels et une largeur de 24 pixels.

  1. Program Sampler; { Démonstration l'utilisation de différentes polices de caractères }
  2.  
  3. Uses
  4.  Crt, MSGraph;
  5.  
  6. Const
  7.  CRLF=#13+#10;
  8.  nfonts=6;
  9.  texttypes:Array[1..2,1..nfonts] of CSTRING[8] =(
  10.    ('roman',' courier','helv','tms rmn','modern','script'),
  11.    ('ROMAN', 'COURIER','HELV','TMS RMN','MODERN','SCRIPT')
  12.  );
  13.  faces:Array[1..nfonts] of CSTRING[12]=(
  14.    ' t''roman''',
  15.    ' t''cour''',
  16.    ' t''helv''',
  17.    ' t''tms rmn''',
  18.    ' t''modern''',
  19.    ' t''script'''
  20.   );
  21.  fontpath:CSTRING='*.FON';
  22.  
  23. Var
  24.  list:CSTRING;
  25.  vc:_VideoConfig;
  26.  i,a:Integer;
  27.  stra:STRING[3];
  28.  ch:Char;
  29.  
  30. BEGIN { Début du programme principal }
  31.   { Lire les informations d'entête de tous les fichiers .FON dans le répertoire courant }
  32.  a:=_RegisterFonts(fontpath);
  33.  If a<0 Then Begin
  34.   _OutText('Erreur : Impossible d''enregistrer les polices de caractères.' + CRLF);
  35.   Halt(1);
  36.  End;
  37.   { Définir le mode vidéo disponible le plus élevé }
  38.  a:=_SetVideoMode(_MaxResMode);
  39.  Str(a,stra);
  40.  _OutText('MaxresMode = ' + stra);
  41.   { Copier la configuration vidéo dans la structure vc }
  42.  _GetVideoConfig(vc);
  43.   { Afficher six lignes d'exemple de texte }
  44.  For i:=1 to nfonts do Begin
  45.   list:=faces[i]+'bh24w24';
  46.   a:=_SetFont(list);
  47.   If(a<>-1)Then Begin
  48.    _SetColor(i+1);
  49.    _MoveTo(0,i*30);
  50.    _OutGText(texttypes[2,i]);
  51.    _MoveTo(vc.NumXPixels div 2,i*30);
  52.    _OutGText(texttypes[1,i]+CRLF);
  53.   End
  54.    Else
  55.   Begin
  56.    a:=_SetVideoMode(_DefaultMode);
  57.    _OutText('Erreur : Impossible de définir la police.');
  58.    Halt(1);
  59.   End;
  60.  End;
  61.  ch:=ReadKey;
  62.  a:=_SetVideoMode(_DefaultMode) ;
  63.  _UnRegisterFonts; { Renvoie la mémoire utilisée par les polices de caractères }
  64. END. 

on obtiendra un résultat ressemblant à ceci :



Dernière mise à jour : Dimanche, le 28 août 2022