Vorgehensweise: Erstellen einer privaten Schriftartenauflistung
Die PrivateFontCollection-Klasse erbt von der abstrakten Basisklasse FontCollection. Sie können ein PrivateFontCollection-Objekt verwenden, um eine Reihe von Schriftarten speziell für Ihre Anwendung zu verwalten. Eine private Schriftartsammlung kann installierte Systemschriftarten sowie Schriftarten enthalten, die nicht auf dem Computer installiert wurden. Rufen Sie die AddFontFile-Methode eines PrivateFontCollection-Objekts auf, um einer privaten Schriftartsammlung eine Schriftartdatei hinzuzufügen.
Die Eigenschaft Families eines PrivateFontCollection-Objekts enthält ein Array von FontFamily-Objekten.
Die Anzahl der Schriftfamilien in einer privaten Schriftartsammlung entspricht nicht unbedingt der Anzahl der Schriftartdateien, die der Sammlung hinzugefügt wurden. Angenommen, Sie fügen die Dateien „ArialBd.tff“, „Times.tff“ und „TimesBd.tff“ zu einer Sammlung hinzu. Es gibt drei Dateien, aber nur zwei Familien in der Sammlung, da „Times.tff“ und „TimesBd.tff“ zu derselben Familie gehören.
Beispiel
Im folgenden Beispiel werden dem PrivateFontCollection-Objekt die folgenden drei Schriftartdateien hinzugefügt:
C:\systemroot\Fonts\Arial.tff (Arial, normal)
C:\systemroot\Fonts\CourBI.tff (Courier New, fett kursiv)
C:\systemroot\Fonts\TimesBd.tff (Times New Roman, fett)
Der Code ruft ein Array von FontFamily-Objekten aus der Families-Eigenschaft des PrivateFontCollection-Objekts ab.
Für jedes FontFamily-Objekt in der Sammlung ruft der Code die IsStyleAvailable-Methode auf, um zu bestimmen, ob verschiedene Formatvorlagen (normal, fett, kursiv, fett kursiv, unterstrichen und durchgestrichen) verfügbar sind. Die an die IsStyleAvailable-Methode übergebenen Argumente sind Elemente der Enumeration FontStyle.
Wenn eine bestimmte Kombination aus Familie und Formatvorlage verfügbar ist, wird ein Font-Objekt mithilfe dieser Familie und der Formatvorlage erstellt. Das erste Argument, das an den Font-Konstruktor übergeben wird, ist der Name der Schriftartfamilien (nicht ein FontFamily-Objekt wie bei anderen Variationen des Font-Konstruktors). Nachdem das Font-Objekt erzeugt wurde, wird es an die DrawString-Methode der Graphics-Klasse übergeben, um den Familiennamen zusammen mit dem Namen der Formatvorlage anzuzeigen.
Die Ausgabe des folgenden Codes ähnelt der in der folgenden Abbildung gezeigten Ausgabe:
„Arial.tff“ (das der privaten Schriftartensammlung im folgenden Codebeispiel hinzugefügt wurde) ist die Schriftartdatei für die reguläre Arial-Formatvorlage. Beachten Sie jedoch, dass die Programmausgabe mehrere verfügbare Formatvorlagen anzeigt, die nicht regulär für die Arial-Schriftartfamilie sind. Das liegt daran, dass GDI+ die fett formatierten, kursiven und fett kursiven Formatvorlagen aus der regulären Formatvorlage simulieren kann. GDI+ kann auch Unterstreichungen und durchgestrichene Begriffe aus der regulären Formatvorlage erzeugen.
Ebenso kann GDI+ die Formatvorlage „fett kursiv“ entweder aus der fett formatierten Formatvorlage oder der kursiv formatierten Formatvorlage simulieren. Die Programmausgabe zeigt, dass die fett kursiv formatierte Formatvorlage für die Times-Familie verfügbar ist, obwohl „TimesBd.tff“ (Times New Roman, fett) die einzige Times-Datei in der Sammlung ist.
// Helper function to print text in a font and style
private float DrawFont(Graphics graphicsObj,
FontFamily family,
FontStyle style,
SolidBrush colorBrush,
PointF location,
string styleName)
{
// The string to print, which contains the family name and style
string familyNameAndStyle = $"{family.Name} {styleName}";
// Create the font object
using (Font fontObject = new Font(family.Name, 16, style, GraphicsUnit.Pixel))
{
// Draw the string
graphicsObj.DrawString(familyNameAndStyle, fontObject, colorBrush, location);
// Return the height of the font
return fontObject.Height;
}
}
// The OnPaint method of a form, which provides the graphics object
protected override void OnPaint(PaintEventArgs e)
{
PointF location = new PointF(10, 0);
SolidBrush solidBrush = new SolidBrush(Color.Black);
FontFamily[] fontFamilies;
PrivateFontCollection privateFontCollection = new PrivateFontCollection(); // Dispose later
// Add three font files to the private collection.
privateFontCollection.AddFontFile(System.Environment.ExpandEnvironmentVariables("%systemroot%\\Fonts\\Arial.ttf"));
privateFontCollection.AddFontFile(System.Environment.ExpandEnvironmentVariables("%systemroot%\\Fonts\\CourBI.ttf"));
privateFontCollection.AddFontFile(System.Environment.ExpandEnvironmentVariables("%systemroot%\\Fonts\\TimesBD.ttf"));
// Get the array of FontFamily objects.
fontFamilies = privateFontCollection.Families;
// Process each font in the collection
for (int i = 0; i < fontFamilies.Length; i++)
{
// Draw the font in every style
// Regular
if (fontFamilies[i].IsStyleAvailable(FontStyle.Regular))
location.Y += DrawFont(e.Graphics, fontFamilies[i], FontStyle.Regular, solidBrush, location, "Regular");
// Bold
if (fontFamilies[i].IsStyleAvailable(FontStyle.Bold))
location.Y += DrawFont(e.Graphics, fontFamilies[i], FontStyle.Bold, solidBrush, location, "Bold");
// Italic
if (fontFamilies[i].IsStyleAvailable(FontStyle.Italic))
location.Y += DrawFont(e.Graphics, fontFamilies[i], FontStyle.Italic, solidBrush, location, "Italic");
// Bold and Italic
if (fontFamilies[i].IsStyleAvailable(FontStyle.Bold) &&
fontFamilies[i].IsStyleAvailable(FontStyle.Italic))
location.Y += DrawFont(e.Graphics, fontFamilies[i], FontStyle.Bold | FontStyle.Italic, solidBrush, location, "BoldItalic");
// Underline
if (fontFamilies[i].IsStyleAvailable(FontStyle.Underline))
location.Y += DrawFont(e.Graphics, fontFamilies[i], FontStyle.Underline, solidBrush, location, "Underline");
// Strikeout
if (fontFamilies[i].IsStyleAvailable(FontStyle.Strikeout))
location.Y += DrawFont(e.Graphics, fontFamilies[i], FontStyle.Strikeout, solidBrush, location, "Strikeout");
// Extra space between font families
location.Y += 10;
}
privateFontCollection.Dispose();
}
' Helper function to print text in a font and style
Private Function DrawFont(graphicsObj As Graphics,
family As FontFamily,
style As FontStyle,
colorBrush As SolidBrush,
location As PointF,
styleName As String) As Single
' The string to print, which contains the family name and style
Dim familyNameAndStyle As String = $"{family.Name} {styleName}"
' Create the font object
Using fontObject As New Font(family.Name, 16, style, GraphicsUnit.Pixel)
' Draw the string
graphicsObj.DrawString(familyNameAndStyle, fontObject, colorBrush, location)
' Return the height of the font
Return fontObject.Height
End Using
End Function
' The OnPaint method of a form, which provides the graphics object
Protected Overrides Sub OnPaint(e As PaintEventArgs)
Dim location As New PointF(10, 0)
Dim solidBrush As New SolidBrush(Color.Black)
Dim fontFamilies() As FontFamily
Dim privateFontCollection As New PrivateFontCollection() ' Dispose later
' Add three font files to the private collection.
privateFontCollection.AddFontFile(System.Environment.ExpandEnvironmentVariables("%systemroot%\Fonts\Arial.ttf"))
privateFontCollection.AddFontFile(System.Environment.ExpandEnvironmentVariables("%systemroot%\Fonts\CourBI.ttf"))
privateFontCollection.AddFontFile(System.Environment.ExpandEnvironmentVariables("%systemroot%\Fonts\TimesBD.ttf"))
' Get the array of FontFamily objects.
fontFamilies = privateFontCollection.Families
' Process each font in the collection
For i = 0 To fontFamilies.Length - 1
' Draw the font in every style
' Regular
If fontFamilies(i).IsStyleAvailable(FontStyle.Regular) Then
location.Y += DrawFont(e.Graphics, fontFamilies(i), FontStyle.Regular, solidBrush, location, "Regular")
End If
' Bold
If fontFamilies(i).IsStyleAvailable(FontStyle.Bold) Then
location.Y += DrawFont(e.Graphics, fontFamilies(i), FontStyle.Bold, solidBrush, location, "Bold")
End If
' Italic
If fontFamilies(i).IsStyleAvailable(FontStyle.Italic) Then
location.Y += DrawFont(e.Graphics, fontFamilies(i), FontStyle.Italic, solidBrush, location, "Italic")
End If
' Bold and Italic
If fontFamilies(i).IsStyleAvailable(FontStyle.Italic) And
fontFamilies(i).IsStyleAvailable(FontStyle.Italic) Then
location.Y += DrawFont(e.Graphics, fontFamilies(i), FontStyle.Bold Or FontStyle.Italic, solidBrush, location, "BoldItalic")
End If
' Underline
If fontFamilies(i).IsStyleAvailable(FontStyle.Underline) Then
location.Y += DrawFont(e.Graphics, fontFamilies(i), FontStyle.Underline, solidBrush, location, "Underline")
End If
' Strikeout
If fontFamilies(i).IsStyleAvailable(FontStyle.Strikeout) Then
location.Y += DrawFont(e.Graphics, fontFamilies(i), FontStyle.Strikeout, solidBrush, location, "Strikeout")
End If
' Extra space between font families
location.Y += 10
Next
privateFontCollection.Dispose()
End Sub
Kompilieren des Codes
Das obige Beispiel ist für die Verwendung mit Windows Forms konzipiert und erfordert PaintEventArgs e
, einen Parameter von PaintEventHandler.
Siehe auch
.NET Desktop feedback