Wie bekomme ich alle installierten Schriftarten mit fester Breite?
Frage
Ich frage mich, ob es irgendwelche einfache Möglichkeiten gibt eine Liste aller mit fester Breite (nicht-proportional) Schriftarten auf dem System eines Benutzers in C # installiert zu bekommen?
Ich verwende .net 3.5 so Zugriff auf den Namespace WPF System.Windows.Media haben und LINQ Schrift Informationen zu bekommen, aber ich bin nicht sicher, was ich suche.
Ich mag eine gefilterte Liste von Fixschriften bieten zu können und / oder Fixschriften aus einer größeren Liste von Schriftart auswählen (wie in dem VS-Optionen-Dialog zu sehen ist).
Lösung
Haben Sie einen Blick auf:
http://www.pinvoke.net/default.aspx/Structures/ LOGFONT.html
eine der Strukturen verwenden dort, dann Schleife über Familien, eine Font Instanziieren und bekommt den LogFont Wert und Überprüfung lfPitchAndFamily.
Der folgende Code wird im laufenden Betrieb geschrieben und ungetestet, aber so etwas wie die folgenden funktionieren soll:
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......
}
}
}
Andere Tipps
Leider ToLogFont Funktion füllt nicht lfPitchAndFamily Feldwerte zu korrigieren. In meinem Fall ist es immer 0.
Eine Annäherung zu erkennen, welche Schriften festgelegt werden könnte, ist die folgende
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() );
}
}
}
Beachten Sie, dass sie mehrere Fehlalarme, zB Wingdings
sindAFAIK Sie es nicht tun können, BCL-Bibliotheken nur verwenden. Sie haben WinAPI Interop verwenden.
Sie müssen zwei niedrigsten Bits von analysieren LOGFONT .lfPitchAndFamily Mitglied. Es gibt eine Konstante FIXED_PITCH (bedeutet, dass Schrift mit fester Breite), die für lfPitchAndFamily als Bitmaske verwendet werden kann.
Hier ist ein nützlicher Artikel:
Aufzählen von Schriftarten kann ein wenig sein verwirrend, und es sei denn, Sie wollen aufzuzählen, alle Schriften auf Ihrem System, kann ein wenig schwieriger sein als MSDN schlägt. In diesem Artikel werden genau erklären, die Schritte, die Sie brauchen, um nutzen jede Schrift mit fester Breite zu finden auf Ihr System, und aufzählen auch jeden mögliche Größe für jeden einzelnen Schriftart.