Comment puis-je obtenir toutes les polices installées à largeur fixe?
Question
Je me demande s'il existe des moyens simples d'obtenir une liste de toutes les polices à largeur fixe (monospaces) installées sur le système d'un utilisateur en C #?
J'utilise .net 3.5. Vous devez donc avoir accès à l'espace de noms WPF System.Windows.Media et à LINQ pour obtenir des informations sur les polices, mais je ne suis pas sûr de ce que je recherche.
Je souhaite pouvoir fournir une liste filtrée de polices à espacement fixe et / ou sélectionner des polices à espacement unique dans une liste plus grande de polices (comme indiqué dans la boîte de dialogue Options du VS).
La solution
Découvrez:
http://www.pinvoke.net/default.aspx/Structures/ LOGFONT.html
Utilisez l'une des structures qu'il contient, puis parcourez les familles, instanciez une police, obtenez la valeur LogFont et vérifiez lfPitchAndFamily.
Le code suivant est écrit à la volée et n’a pas été testé, mais quelque chose comme ceci devrait fonctionner:
foreach (FontFamily ff in System.Drawing.FontFamily.Families)
{
if (ff.IsStyleAvailable(FontStyle.Regular))
{
Font font = new Font(ff, 10);
LOGFONT lf = new LOGFONT();
font.ToLogFont(lf);
if (lf.lfPitchAndFamily ^ 1)
{
do stuff here......
}
}
}
Autres conseils
Malheureusement, la fonction ToLogFont ne remplit pas le champ lfPitchAndFamily pour corriger les valeurs. Dans mon cas, c'est toujours 0.
Une approximation permettant de détecter les polices pouvant être corrigées est la suivante
foreach ( FontFamily ff in FontFamily.Families ) {
if ( ff.IsStyleAvailable( FontStyle.Regular ) ) {
float diff;
using ( Font font = new Font( ff, 16 ) ) {
diff = TextRenderer.MeasureText( "WWW", font ).Width - TextRenderer.MeasureText( "...", font ).Width;
}
if ( Math.Abs( diff ) < float.Epsilon * 2 ) {
Debug.WriteLine( ff.ToString() );
}
}
}
N'oubliez pas qu'il existe plusieurs faux positifs, par exemple Wingdings
Vous devez analyser les 2 derniers éléments de LOGFONT . Membre de lfPitchAndFamily. Il existe une constante FIXED_PITCH (qui signifie que la police est à largeur fixe) qui peut être utilisée comme masque de bits pour lfPitchAndFamily.
Voici un article utile:
L'énumération des polices peut être un peu déroutant, et à moins que vous ne vouliez énumérer toutes les polices de votre système, peut être un peu plus difficile que MSDN suggère. Cet article sera expliquer exactement les étapes à suivre utiliser pour trouver toutes les polices à largeur fixe votre système, et aussi énumérer tous les taille possible pour chaque individu police.