Como: Criar uma coleção de fontes particulares
A classe PrivateFontCollection herda da classe base abstrata FontCollection. Você pode usar um objeto PrivateFontCollection para manter um conjunto de fontes especificamente para seu aplicativo. Uma coleção de fontes privada pode incluir fontes do sistema instaladas, bem como fontes que não foram instaladas no computador. Para adicionar um arquivo de fonte a uma coleção de fontes particular, chame o método AddFontFile de um objeto PrivateFontCollection.
A propriedade Families de um objeto PrivateFontCollection contém uma matriz de objetos FontFamily.
O número de famílias de fontes em uma coleção de fontes particular não é necessariamente o mesmo que o número de arquivos de fonte que foram adicionados à coleção. Por exemplo, suponha que você adicione os arquivos ArialBd.tff, Times.tff e TimesBd.tff a uma coleção. Haverá três arquivos, mas apenas duas famílias na coleção, porque Times.tff e TimesBd.tff pertencem à mesma família.
Exemplo
O exemplo a seguir adiciona os seguintes três arquivos de fonte a um objeto PrivateFontCollection:
C:\systemroot\Fonts\Arial.ttf (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 método IsStyleAvailable são membros da enumeração FontStyle.
Se uma determinada combinação família/estilo estiver disponível, um objeto Font é construído usando essa família e estilo. O primeiro argumento passado para o construtor Font é o nome da família font (não um objeto FontFamily como é o caso de outras variações do construtor Font). 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:
Arial.tff (que foi adicionado à coleção de fontes privadas no exemplo de código a seguir) é o arquivo de fonte para o estilo regular Arial. Note, no entanto, que a saída do programa mostra vários estilos disponíveis além do regular para a família de fontes Arial. Isso porque o GDI+ pode simular os estilos negrito, itálico e itálico negrito a partir do estilo regular. 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. A saída do programa mostra que o estilo negrito itálico está disponível para a família Times, embora TimesBd.ttf (Times New Roman, negrito) seja o único arquivo 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.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
Compilando o código
O exemplo anterior foi projetado para uso com o Windows Forms e requer PaintEventArgse
, que é um parâmetro de PaintEventHandler.
Ver também
.NET Desktop feedback