방법: 개인 글꼴 컬렉션 만들기
PrivateFontCollection 클래스는 FontCollection 추상 기본 클래스에서 상속됩니다. PrivateFontCollection 개체를 사용하여 애플리케이션에 대한 글꼴 집합을 유지할 수 있습니다. 프라이빗 글꼴 컬렉션에는 컴퓨터에 설치되지 않은 글꼴뿐만 아니라 설치된 시스템 글꼴도 포함될 수 있습니다. 프라이빗 글꼴 컬렉션에 글꼴 파일을 추가하려면 AddFontFile 개체의 PrivateFontCollection 메서드를 호출합니다.
Families 개체의 PrivateFontCollection 속성은 FontFamily 개체의 배열을 포함합니다.
프라이빗 글꼴 컬렉션의 글꼴 패밀리 수가 반드시 컬렉션에 추가된 글꼴 파일 수와 동일하지는 않습니다. 예를 들어 ArialBd.tff, Times.tff, TimesBd.tff 파일을 컬렉션에 추가한다고 가정합니다. Times.tff와 TimesBd.tff가 같은 패밀리에 속하기 때문에 컬렉션에는 3개의 파일이 있지만 2개의 패밀리만 있습니다.
예제
다음 예제에서는 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 Forms에서 사용하도록 설계되었으며 PaintEventArgs의 매개 변수인 e
PaintEventHandler이(가) 필요합니다.
참고 항목
.NET Desktop feedback