Udostępnij za pośrednictwem


Porady: tworzenie prywatnej kolekcji czcionek

Klasa PrivateFontCollection dziedziczy z abstrakcyjnej klasy bazowej FontCollection . Za pomocą PrivateFontCollection obiektu można zachować zestaw czcionek przeznaczonych specjalnie dla aplikacji. Prywatna kolekcja czcionek może zawierać zainstalowane czcionki systemowe, a także czcionki, które nie zostały zainstalowane na komputerze. Aby dodać plik czcionki do prywatnej kolekcji czcionek, wywołaj AddFontFile metodę PrivateFontCollection obiektu.

Właściwość FamiliesPrivateFontCollection obiektu zawiera tablicę FontFamily obiektów.

Liczba rodzin czcionek w prywatnej kolekcji czcionek nie musi być taka sama jak liczba plików czcionek, które zostały dodane do kolekcji. Załóżmy na przykład, że do kolekcji zostaną dodane pliki ArialBd.tff, Times.tff i TimesBd.tff. Będą trzy pliki, ale tylko dwie rodziny w kolekcji, ponieważ Times.tff i TimesBd.tff należą do tej samej rodziny.

Przykład

Poniższy przykład dodaje następujące trzy pliki czcionek do PrivateFontCollection obiektu:

  • C:\systemroot\Fonts\Arial.tff (Arial, regular)

  • C:\systemroot\Fonts\CourBI.tff (Courier New, pogrubiona kursywa)

  • C:\systemroot\Fonts\TimesBd.tff (Times New Roman, bold)

Kod pobiera tablicę FontFamily obiektów z Families właściwości PrivateFontCollection obiektu.

Dla każdego FontFamily obiektu w kolekcji kod wywołuje metodę IsStyleAvailable w celu określenia, czy są dostępne różne style (zwykłe, pogrubienie, kursywa, kursywa, podkreślenie i przekreślenie). Argumenty przekazane do IsStyleAvailable metody są elementami FontStyle członkowskimi wyliczenia.

Jeśli dostępna jest dana kombinacja rodziny/stylu, Font obiekt jest konstruowany przy użyciu tej rodziny i stylu. Pierwszym argumentem przekazanym do konstruktora Font jest nazwa rodziny czcionek (a nie FontFamily obiekt, tak jak w przypadku innych odmian konstruktora Font ). Po utworzeniu Font obiektu jest przekazywany do DrawString metody Graphics klasy w celu wyświetlenia nazwy rodziny wraz z nazwą stylu.

Dane wyjściowe następującego kodu są podobne do danych wyjściowych przedstawionych na poniższej ilustracji:

Zrzut ekranu przedstawiający tekst w różnych czcionkach.

Arial.tff (który został dodany do prywatnej kolekcji czcionek w poniższym przykładzie kodu) to plik czcionki dla stylu regularnego Arial. Należy jednak pamiętać, że dane wyjściowe programu zawierają kilka dostępnych stylów innych niż zwykłe dla rodziny czcionek Arial. Wynika to z faktu, że GDI+ może symulować pogrubienie, kursywę i odważne style kursywy ze stylu regularnego. GDI+ może również tworzyć podkreślenie i przekreślenia w regularnym stylu.

Podobnie GDI+ może symulować pogrubiony styl kursywy z stylu pogrubionego lub kursywy. Dane wyjściowe programu pokazują, że pogrubiony styl kursywy jest dostępny dla rodziny Times, mimo że TimesBd.tff (Times New Roman, bold) jest jedynym plikiem Times w kolekcji.

// 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

Kompilowanie kodu

Powyższy przykład jest przeznaczony do użycia z formularzami Systemu Windows i wymaga PaintEventArgseparametru , który jest parametrem PaintEventHandler.

Zobacz też