Compartilhar via


Como criar uma coleção de fontes privada

A PrivateFontCollection classe herda da FontCollection classe base abstrata. Você pode usar um PrivateFontCollection objeto para manter um conjunto de fontes especificamente para seu aplicativo. Uma coleção de fontes privada pode incluir fontes do sistema instalado, bem como as fontes que não foram instaladas no computador. Para adicionar um arquivo de fonte a uma coleção de fontes particular, chame o AddFontFile método de um PrivateFontCollection objeto.

A Families propriedade de um PrivateFontCollection objeto contém uma matriz de FontFamily objetos.

A quantidade de famílias de fonte em uma coleção de fontes privada não é necessariamente a mesma que a quantidade de arquivos de fonte que foram adicionados à coleção. Por exemplo, suponha que os arquivos ArialBd.tff, Times.tff e TimesBd.tff foram adicionados a uma coleção. Haverá três arquivos, mas somente duas famílias na coleção, pois Times.tff e TimesBd.tff pertencem à mesma família.

Exemplo

O exemplo a seguir adiciona os três arquivos de fonte a seguir a um PrivateFontCollection objeto:

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

  • C:\systemroot\Fonts\CourBI.tff (Courier New, negrito itálico)

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

O código recupera uma matriz de objetos FontFamily da propriedade Families do objeto PrivateFontCollection.

Para cada objeto FontFamily na coleção, o código chama o método IsStyleAvailable para determinar se vários estilos (regular, negrito, itálico, negrito itálico, sublinhado e riscado) estão disponíveis. Os argumentos passados para o IsStyleAvailable método são membros da FontStyle enumeração.

Se uma determinada combinação de família/estilo estiver disponível, um Font objeto será construído usando essa família e estilo. O primeiro argumento passado para o Font construtor é o nome da família de fontes (não um FontFamily objeto, como é o caso de outras variações do Font construtor). Depois que o objeto Font é construído, ele é passado para o método DrawString da classe Graphics para exibir o nome da família junto com o nome do estilo.

A saída do código a seguir é semelhante à saída mostrada na ilustração a seguir:

Captura de tela que mostra o texto em várias fontes.

Arial.tff (adicionada à coleção de fontes privadas no exemplo de código a seguir) é o arquivo de fonte do estilo regular da fonte Arial. No entanto, observe que a saída do programa mostra vários estilos disponíveis, além do regular, para a família de fontes Arial. Isso ocorre porque o GDI+ pode simular os estilos negrito, itálico e negrito e itálico a partir do estilo regular. O GDI+ também pode produzir sublinhados e riscados a partir do estilo regular.

Da mesma forma, o GDI+ pode simular o estilo negrito itálico a partir do estilo negrito ou do estilo itálico. O resultado do programa mostra que o estilo negrito itálico está disponível para a família Times, embora TimesBd.tff (Times New Roman, negrito) seja o único arquivo de Times na coleção.

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

Compilando o código

O exemplo anterior foi projetado para uso com o Windows Forms e requer PaintEventArgse, que é um parâmetro de PaintEventHandler.

Consulte também