方法: プライベート フォント コレクションを作成する
PrivateFontCollection クラスは、FontCollection 抽象基底クラスから継承されたものです。 PrivateFontCollection オブジェクトを使用すれば、自分のアプリケーション専用のフォント セットを維持することができます。 プライベート フォント コレクションには、インストールされているシステム フォントに加えて、コンピューターにインストールされていないフォントも含めることができます。 フォント ファイルをプライベート フォント コレクションに追加するには、AddFontFile オブジェクトの PrivateFontCollection メソッドを呼び出します。
Families オブジェクトの PrivateFontCollection プロパティには、FontFamily オブジェクトの配列が格納されます。
プライベート フォント コレクション内のフォント ファミリの数は、必ずしもコレクションに追加されたフォント ファイルの数と同じではありません。 たとえば、ファイル ArialBd.tff、Times.tff、および TimesBd.tff をコレクションに追加するとします。 コレクションには 3 つのファイルが存在することになりますが、ファミリは 2 つだけです。Times.tff と TimesBd.tff は同じファミリに属しているためです。
例
以下の例では、次の 3 つのフォント ファイルが PrivateFontCollection オブジェクトに追加されます。
C:\systemroot\Fonts\Arial.tff (Arial、標準)
C:\systemroot\Fonts\CourBI.tff (Courier New、太字斜体)
C:\systemroot\Fonts\TimesBd.tff (Times New Roman、太字)
このコードによって、FontFamily オブジェクトの Families プロパティから PrivateFontCollection オブジェクトの配列が取得されます。
コードを実行すると、コレクション内の FontFamily オブジェクトごとに、IsStyleAvailable メソッドが呼び出され、各種のスタイル (標準、太字、斜体、太字斜体、下線、および取り消し線) が使用可能かどうかが判断されます。 IsStyleAvailable メソッドに渡される引数は、FontStyle 列挙体のメンバーです。
指定されたファミリとスタイルの組み合わせを使用できる場合、そのファミリとスタイルを使用して Font オブジェクトが構築されます。 Font コンストラクターに渡される最初の引数はフォント ファミリ名です (FontFamily コンストラクターの他のバリエーションとは違って、Font オブジェクトではありません)。 Font オブジェクトが構築されると、それは DrawString クラスの Graphics メソッドに渡され、ファミリ名と共にスタイル名が表示されます。
下記のコードの出力は、次の図に示す出力に似ています。
Arial.tff (以下のコード例でプライベート フォント コレクションに追加されたもの) は、Arial 標準スタイルのフォント ファイルです。 ただし、プログラムの出力には、Arial フォント ファミリの標準以外に使用可能なスタイルがいくつか表示されていることに注意してください。 これは、GDI+ を使用すると標準スタイルから太字、斜体、太字斜体の各スタイルをシミュレートできるためです。 また、GDI+ を使用すると、標準スタイルから下線と取り消し線を生成することもできます。
同様に、GDI+ では、太字スタイルまたは斜体スタイルのどちらからも太字斜体スタイルをシミュレートすることができます。 プログラムの出力を見ると、コレクション内では TimesBd.tff (Times New Roman、太字) が唯一の Times ファイルであるのに、太字斜体スタイルも Times ファミリで使用できるようになっているのがわかります。
// 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
コードのコンパイル
前の例は、Windows フォームで使用するために設計されていて、PaintEventArgs のパラメーターである e
PaintEventHandler を必要とします。
関連項目
.NET Desktop feedback