Freigeben über


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:

Screenshot: Text in verschiedenen Schriftarten

„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