フォントにはゴシック体や明朝体といったものから、デザインに凝っているものなど様々な種類があります。その全ての種類のフォントがコンピュータにはインストールされていないため、アプリケーションから好きなフォントを使うことができません。アプリケーションからプライベートフォントを扱えるようになると、好きなフォントを使うことができるようになります。それでは、アプリケーションからプライベートフォントを扱う方法を紹介したいと思います。
フォントファイルを使用する方法
まず、プライベートフォントを使用する方法には二種類あります。その一つがフォントファイルを直接読み込むことです。プライベートフォントを扱うには PrivateFontCollection クラスを使用します。PrivateFontCollection クラスの AddFontFile メソッドの引数にフォントファイルのパスを渡すだけで、そのフォントを使用することができるようになります。AddFontFile メソッドで追加したフォントは Families プロパティからフォントファミリとして取得することができます。
Imports System.Drawing.Text
Private pfc As New PrivateFontCollection
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.pfc.AddFontFile("ipagp.ttf")
Me.TextBox1.Font = New Font(pfc.Families(0), 12)
End Sub
MSDN にも PrivateFontCollection クラスの解説と、AddFontFile メソッドを使用したサンプルがありますので合わせて見てみてください。
リソースを使用する方法
もう一つの方法はリソースのフォントを使用する方法です。リソースからフォントを読み込むには AddMemoryFont メソッドを使用します。AddMemoryFont メソッドの引数にはメモリ上にあるフォントを渡さなければいけないため、扱うには少々手間がかかります。サンプルではあらかじめ ipagp.ttf というフォントファイルをリソースとして追加してあります。
Imports System.Drawing.Text
Imports System.Runtime.InteropServices
Private pfc As New PrivateFontCollection
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim fontBytes As Byte() = My.Resources.ipagp
Dim fontPtr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(GetType(Byte)) * fontBytes.Length)
Try
Marshal.Copy(fontBytes, 0, fontPtr, fontBytes.Length)
Me.pfc.AddMemoryFont(fontPtr, fontBytes.Length)
Finally
Marshal.FreeHGlobal(fontPtr)
End Try
Me.TextBox1.Font = New Font(Me.pfc.Families(0), 12)
End Sub
PrivateFontCollection クラスは Dispose メソッドをもっていますので、適切なタイミングで破棄してください。
フォントの中には無断で第三者に配布してはいけない場合もありますので、プライベートフォントを使用する際は使用許諾を確認する必要があります。第三者に配布してはいけない場合でもリソースとして埋め込んでしまえば、配布した事にはならない感じもします。とにかくプライベートフォントを扱う際にはトラブルが発生しないように注意する必要があります。