Crear una colección de fuentes privada
La clase PrivateFontCollection se hereda de la clase base abstracta FontCollection. Se puede usar un objeto PrivateFontCollection para mantener un conjunto de fuentes específicamente para la aplicación. Una colección de fuentes privada puede incluir fuentes del sistema instaladas además de fuentes que no se han instalado en el equipo. Para agregar un archivo de fuente a una colección privada, llame al método AddFontFile de un objeto PrivateFontCollection.
La propiedad Families de un objeto PrivateFontCollection contiene una matriz de objetos FontFamily.
El número de familias de fuentes de una colección de fuentes privada no es necesariamente el mismo que el número de archivos de fuente que se han agregado a la colección. Por ejemplo, supongamos que se agregan los archivos ArialBd.tff, Times.tff y TimesBd.tff a una colección. En la colección habrá tres archivos pero sólo dos familias porque Times.tff y TimesBd.tff pertenecen a la misma familia.
En el ejemplo siguiente se agregan los tres archivos de fuente que se muestran a un objeto PrivateFontCollection:
- C:\WINNT\Fonts\Arial.tff (Arial, normal)
- C:\WINNT\Fonts\CourBI.tff (Courier New, negrita cursiva)
- C:\WINNT\Fonts\TimesBd.tff (Times New Roman, negrita)
El código recupera una matriz de objetos FontFamily de la propiedad Families del objeto PrivateFontCollection.
Para cada objeto FontFamily de la colección, el código llama al método IsStyleAvailable para determinar si hay disponibles varios estilos (normal, negrita, cursiva, negrita cursiva, subrayado y tachado). Los argumentos que se pasan al método IsStyleAvailable son miembros de la enumeración FontStyle.
Si una combinación de familia y estilo concreta está disponible, se construye un objeto Font utilizando esa familia y ese estilo. El primer argumento que se pasa al constructor Font es el nombre de la familia de fuentes (no un objeto FontFamily como sucede en otras variantes del constructor Font). Tras construir el objeto Font, éste se pasa al método DrawString de la clase Graphics para mostrar el nombre de la familia junto con el nombre del estilo.
Dim pointF As New PointF(10, 0)
Dim solidBrush As New SolidBrush(Color.Black)
Dim count As Integer = 0
Dim familyName As String = ""
Dim familyNameAndStyle As String
Dim fontFamilies() As FontFamily
Dim privateFontCollection As New PrivateFontCollection()
' Add three font files to the private collection.
privateFontCollection.AddFontFile("D:\WINNT\Fonts\Arial.ttf")
privateFontCollection.AddFontFile("D:\WINNT\Fonts\CourBI.ttf")
privateFontCollection.AddFontFile("D:\WINNT\Fonts\TimesBD.ttf")
' Get the array of FontFamily objects.
fontFamilies = privateFontCollection.Families
' How many objects in the fontFamilies array?
count = fontFamilies.Length
' Display the name of each font family in the private collection
' along with the available styles for that font family.
Dim j As Integer
While j < count
' Get the font family name.
familyName = fontFamilies(j).Name
' Is the regular style available?
If fontFamilies(j).IsStyleAvailable(FontStyle.Regular) Then
familyNameAndStyle = ""
familyNameAndStyle = familyNameAndStyle + familyName
familyNameAndStyle = familyNameAndStyle + " Regular"
Dim regFont As New Font( _
familyName, _
16, _
FontStyle.Regular, _
GraphicsUnit.Pixel)
e.Graphics.DrawString( _
familyNameAndStyle, _
regFont, _
solidBrush, _
pointF)
pointF.Y += regFont.Height
End If
' Is the bold style available?
If fontFamilies(j).IsStyleAvailable(FontStyle.Bold) Then
familyNameAndStyle = ""
familyNameAndStyle = familyNameAndStyle + familyName
familyNameAndStyle = familyNameAndStyle + " Bold"
Dim boldFont As New Font( _
familyName, _
16, _
FontStyle.Bold, _
GraphicsUnit.Pixel)
e.Graphics.DrawString( _
familyNameAndStyle, _
boldFont, _
solidBrush, _
pointF)
pointF.Y += boldFont.Height
End If
' Is the italic style available?
If fontFamilies(j).IsStyleAvailable(FontStyle.Italic) Then
familyNameAndStyle = ""
familyNameAndStyle = familyNameAndStyle + familyName
familyNameAndStyle = familyNameAndStyle + " Italic"
Dim italicFont As New Font( _
familyName, _
16, _
FontStyle.Italic, _
GraphicsUnit.Pixel)
e.Graphics.DrawString( _
familyNameAndStyle, _
italicFont, _
solidBrush, pointF)
pointF.Y += italicFont.Height
End If
' Is the bold italic style available?
If fontFamilies(j).IsStyleAvailable(FontStyle.Italic) And _
fontFamilies(j).IsStyleAvailable(FontStyle.Bold) Then
familyNameAndStyle = ""
familyNameAndStyle = familyNameAndStyle + familyName
familyNameAndStyle = familyNameAndStyle + "BoldItalic"
Dim italicFont As New Font( _
familyName, _
16, _
FontStyle.Italic Or FontStyle.Bold, _
GraphicsUnit.Pixel)
e.Graphics.DrawString( _
familyNameAndStyle, _
italicFont, _
solidBrush, _
pointF)
pointF.Y += italicFont.Height
End If
' Is the underline style available?
If fontFamilies(j).IsStyleAvailable(FontStyle.Underline) Then
familyNameAndStyle = ""
familyNameAndStyle = familyNameAndStyle + familyName
familyNameAndStyle = familyNameAndStyle + " Underline"
Dim underlineFont As New Font( _
familyName, _
16, _
FontStyle.Underline, _
GraphicsUnit.Pixel)
e.Graphics.DrawString( _
familyNameAndStyle, _
underlineFont, _
solidBrush, _
pointF)
pointF.Y += underlineFont.Height
End If
' Is the strikeout style available?
If fontFamilies(j).IsStyleAvailable(FontStyle.Strikeout) Then
familyNameAndStyle = ""
familyNameAndStyle = familyNameAndStyle + familyName
familyNameAndStyle = familyNameAndStyle + " Strikeout"
Dim strikeFont As New Font( _
familyName, _
16, _
FontStyle.Strikeout, _
GraphicsUnit.Pixel)
e.Graphics.DrawString( _
familyNameAndStyle, _
strikeFont, _
solidBrush, _
pointF)
pointF.Y += strikeFont.Height
End If
' Separate the families with white space.
pointF.Y += 10
End While
[C#]
PointF pointF = new PointF(10, 0);
SolidBrush solidBrush = new SolidBrush(Color.Black);
int count = 0;
string familyName = "";
string familyNameAndStyle;
FontFamily[] fontFamilies;
PrivateFontCollection privateFontCollection = new PrivateFontCollection();
// Add three font files to the private collection.
privateFontCollection.AddFontFile("D:\\WINNT\\Fonts\\Arial.ttf");
privateFontCollection.AddFontFile("D:\\WINNT\\Fonts\\CourBI.ttf");
privateFontCollection.AddFontFile("D:\\WINNT\\Fonts\\TimesBD.ttf");
// Get the array of FontFamily objects.
fontFamilies = privateFontCollection.Families;
// How many objects in the fontFamilies array?
count = fontFamilies.Length;
// Display the name of each font family in the private collection
// along with the available styles for that font family.
for(int j = 0; j < count; ++j)
{
// Get the font family name.
familyName = fontFamilies[j].Name;
// Is the regular style available?
if(fontFamilies[j].IsStyleAvailable(FontStyle.Regular))
{
familyNameAndStyle = "";
familyNameAndStyle = familyNameAndStyle + familyName;
familyNameAndStyle = familyNameAndStyle + " Regular";
Font regFont = new Font(
familyName,
16,
FontStyle.Regular,
GraphicsUnit.Pixel);
e.Graphics.DrawString(
familyNameAndStyle,
regFont,
solidBrush,
pointF);
pointF.Y += regFont.Height;
}
// Is the bold style available?
if(fontFamilies[j].IsStyleAvailable(FontStyle.Bold))
{
familyNameAndStyle = "";
familyNameAndStyle = familyNameAndStyle + familyName;
familyNameAndStyle = familyNameAndStyle + " Bold";
Font boldFont = new Font(
familyName,
16,
FontStyle.Bold,
GraphicsUnit.Pixel);
e.Graphics.DrawString(familyNameAndStyle, boldFont, solidBrush, pointF);
pointF.Y += boldFont.Height;
}
// Is the italic style available?
if(fontFamilies[j].IsStyleAvailable(FontStyle.Italic))
{
familyNameAndStyle = "";
familyNameAndStyle = familyNameAndStyle + familyName;
familyNameAndStyle = familyNameAndStyle + " Italic";
Font italicFont = new Font(
familyName,
16,
FontStyle.Italic,
GraphicsUnit.Pixel);
e.Graphics.DrawString(
familyNameAndStyle,
italicFont,
solidBrush,
pointF);
pointF.Y += italicFont.Height;
}
// Is the bold italic style available?
if(fontFamilies[j].IsStyleAvailable(FontStyle.Italic) &&
fontFamilies[j].IsStyleAvailable(FontStyle.Bold))
{
familyNameAndStyle = "";
familyNameAndStyle = familyNameAndStyle + familyName;
familyNameAndStyle = familyNameAndStyle + "BoldItalic";
Font italicFont = new Font(
familyName,
16,
FontStyle.Italic | FontStyle.Bold,
GraphicsUnit.Pixel);
e.Graphics.DrawString(
familyNameAndStyle,
italicFont,
solidBrush,
pointF);
pointF.Y += italicFont.Height;
}
// Is the underline style available?
if(fontFamilies[j].IsStyleAvailable(FontStyle.Underline))
{
familyNameAndStyle = "";
familyNameAndStyle = familyNameAndStyle + familyName;
familyNameAndStyle = familyNameAndStyle + " Underline";
Font underlineFont = new Font(
familyName,
16,
FontStyle.Underline,
GraphicsUnit.Pixel);
e.Graphics.DrawString(
familyNameAndStyle,
underlineFont,
solidBrush,
pointF);
pointF.Y += underlineFont.Height;
}
// Is the strikeout style available?
if(fontFamilies[j].IsStyleAvailable(FontStyle.Strikeout))
{
familyNameAndStyle = "";
familyNameAndStyle = familyNameAndStyle + familyName;
familyNameAndStyle = familyNameAndStyle + " Strikeout";
Font strikeFont = new Font(
familyName,
16,
FontStyle.Strikeout,
GraphicsUnit.Pixel);
e.Graphics.DrawString(
familyNameAndStyle,
strikeFont,
solidBrush,
pointF);
pointF.Y += strikeFont.Height;
}
// Separate the families with white space.
pointF.Y += 10;
} // for
El resultado del código anterior es similar al que se muestra en la siguiente ilustración.
Arial.tff (que se ha agregado a la colección de fuentes privada en el ejemplo de código anterior) es el archivo de fuente del estilo normal de Arial. Observe, sin embargo, que el resultado del programa muestra varios estilos disponibles aparte del normal para la familia de fuentes Arial. Ello se debe a que GDI+ puede simular los estilos de negrita, cursiva y negrita cursiva a partir del estilo normal. GDI+ puede producir también subrayados y tachados a partir del estilo normal.
De manera similar, GDI+ puede simular el estilo de negrita cursiva a partir del estilo negrita o del estilo cursiva. El resultado del programa muestra que el estilo de negrita cursiva está disponible para la familia Times a pesar de que TimesBd.tff (Times New Roman, negrita) es el único archivo de Times de la colección.