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).

Était-ce utile?

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

Autant que je sache, vous ne pouvez pas le faire en utilisant uniquement les bibliothèques BCL. Vous devez utiliser WinAPI interop.

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:

Énumération des polices

  

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top