Je ne sais pas vraiment dans quelle rubrique poster ce topic qui, par ailleurs, n'est pas vraiment un "Truc et astuce" mais plutôt un avis sur l'usage conjoint des instructions PB natives RegisterFontFile() et LoadFont() sous Windows.
Plaise au(x) modo(s) de le déplacer là où sa place serait plus appropriée, s'il y a lieu.
Ce topic a juste pour vocation d'attirer l'attention sur les contraintes et conséquences de l'usage de ces instructions sous Windows (pour aux autres OS, je n'en sais fichtre rien

Donc voilà, travaillant depuis un certain moment sur le sujet des fontes de caractères, j'ai été confronté à des problématiques lorsque je recourais à RegisterFontFile() et/ou LoadFont() dans certaines de mes applis sous Windows.
Pour rappel, RegisterFontFile() a pour but, d'enregistrer temporairement une fonte non installée dans le dossier "C:\Windows\Fonts"
et/ou "C:\Users\XXXXX\AppData\Local\Microsoft\Windows\Fonts" (depuis Windows 10 pour ce dernier) pour pouvoir ensuite la charger avec LoadFont().
Comme indiqué dans la doc, une fonte appelée via cette instruction n'est libérée que lors de la fermeture de l'application car elle ne possède pas malheureusement son pendant, un UnregisterFontFile() en somme qui libèrerait la fonte.
Ce qui signifie, par exemple, qu'elle ne peut être supprimée physiquement durant l'exécution du programme. Normal et logique ! Mais ce qui implique aussi, dans deux cas précis, un inconvénient majeur.
J'avais à développer une appli dont le but était de comparer graphiquement/supprimer des fontes (près de 200 000 amassées au fil des années ou plutôt décennies) identiques ou non en caractéristiques, noms, formats (OTF/TTF), emplacements, versions, etc.
Si l'utilisation de RegisterFontfile() ne pose aucun problème, il y a, en revanche, un souci avec LoadFont() dès lors que vous souhaitez utiliser une fonte dont le nom de famille est déjà "répertorié" (via la base de registre) dans un des dossiers de fontes Windows dédiés (c-à-d, une fonte avec le même nom de famille déjà installée) ou déjà enregistrée avec RegisterFontFile.
Car, rappelons en effet, que LoadFont() (Windows en fait) charge une fonte d'après son nom de famille et non à partir de son [dossier + ] nom de fichier et que la priorité va d'abord aux fontes installées et, à défaut, à la première enregistrée avec RegisterFontFile().
Or, on peut très bien avoir des fontes avec le même nom de famille mais visuellement différentes parce que, notamment, des retouches graphiques ont été apportées ou des glyphes ont été ajoutés/supprimés lors d'une nouvelle version ou bien encore des créateurs ont eu la bonne idée de donner le même nom de famille à leur fonte alors qu'elles sont totalement différentes.
Donc, dans l'éventualité où vous auriez besoin de comparer graphiquement, installer/désinstaller/supprimer des fontes sans avoir à fermer et redémarrer votre appli (vous aurez également compris que le multi-instance ne fonctionnera pas non plus), il sera nécessaire alors de recourir aux API Windows AddFontResource_() et RemoveFontResource_()
Leur usage est presque aussi simple que celui de RegisterFontFile() :
Code : Tout sélectionner
AddFontResource_([Dossier+]NomFichierFonte.{otf;ttf;ttc})
SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0) ; Très important car, en gros, c'est ce qui rend la fonte dispo pour votre appli
LoadFont(NoFonte,NomdeFamille,X[,Y])
[...]
FreeFont(NoFonte)
puis
Code : Tout sélectionner
RemoveFontResource_([Dossier+]NomFichierFonte.{otf;ttf;ttc})
SendMessage_(#HWND_BROADCAST,#WM_FONTCHANGE,0,0) ; Très important car, en gros, c'est ce qui va libérer totalement la fonte au "yeux" de Windows
