Nasıl yapılır: Özel Yazı Tipi Koleksiyonu Oluşturma

PrivateFontCollection sınıfı soyut temel sınıfından FontCollection devralır. Özel olarak uygulamanız için bir PrivateFontCollection yazı tipi kümesini korumak için bir nesne kullanabilirsiniz. Özel yazı tipi koleksiyonu, yüklü sistem yazı tiplerinin yanı sıra bilgisayarda yüklü olmayan yazı tiplerini de içerebilir. Özel yazı tipi koleksiyonuna yazı tipi dosyası eklemek için bir PrivateFontCollection nesnenin AddFontFile yöntemini çağırın.

Families Bir PrivateFontCollection nesnenin özelliği bir nesne dizisi FontFamily içerir.

Özel yazı tipi koleksiyonundaki yazı tipi ailelerinin sayısı, koleksiyona eklenen yazı tipi dosyalarının sayısıyla aynı olmayabilir. Örneğin ArialBd.tff, Times.tff ve TimesBd.tff dosyalarını bir koleksiyona eklediğinizi varsayalım. Times.tff ve TimesBd.tff aynı aileye ait olduğundan koleksiyonda üç dosya olacak ama yalnızca iki aile var.

Örnek

Aşağıdaki örnek, bir PrivateFontCollection nesneye aşağıdaki üç yazı tipi dosyasını ekler:

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

  • C:\systemroot\Fonts\CourBI.tff (Courier New, bold italic)

  • C:\systemroot\Fonts\TimesBd.tff (Times New Roman, kalın)

Kod, nesnenin FontFamily özelliğinden Families PrivateFontCollection bir nesne dizisi alır.

Koleksiyondaki her FontFamily nesne için kod, çeşitli stillerin IsStyleAvailable (normal, kalın, italik, kalın italik, altı çizili ve üstü çizili) kullanılabilir olup olmadığını belirlemek için yöntemini çağırır. yöntemine IsStyleAvailable geçirilen bağımsız değişkenler numaralandırmanın FontStyle üyeleridir.

Belirli bir aile/stil bileşimi varsa, bu aile ve stil kullanılarak bir Font nesne oluşturulur. Oluşturucuya Font geçirilen ilk bağımsız değişken, yazı tipi ailesi adıdır (oluşturucunun diğer varyasyonlarında Font olduğu gibi bir FontFamily nesne değildir). Font Nesnesi oluşturulduğunda, stilin DrawString adıyla birlikte aile adını görüntülemek için sınıfının yöntemine Graphics geçirilir.

Aşağıdaki kodun çıkışı, aşağıdaki çizimde gösterilen çıkışa benzer:

Çeşitli yazı tiplerindeki metni gösteren ekran görüntüsü.

Arial.tff (aşağıdaki kod örneğinde özel yazı tipi koleksiyonuna eklendi) Arial normal stilinin yazı tipi dosyasıdır. Ancak, program çıktısının Arial yazı tipi ailesi için normal dışında birkaç kullanılabilir stil gösterdiğine dikkat edin. Bunun nedeni, GDI+'nın normal stilden kalın, italik ve kalın italik stillerin benzetimini yapabilir. GDI+, normal stilden alt çizgi ve üstü çizili de oluşturabilir.

Benzer şekilde GDI+, kalın veya italik stilden kalın italik stilin benzetimini yapabilir. Program çıktısı, TimesBd.tff (Times New Roman, bold) koleksiyonundaki tek Times dosyası olmasına rağmen, Times ailesi için kalın italik stilin kullanılabildiğini gösterir.

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

Kod Derleniyor

Yukarıdaki örnek, Windows Forms ile kullanılmak üzere tasarlanmıştır ve parametresi PaintEventHandlerolan öğesini gerektirir.PaintEventArgs e

Ayrıca bkz.