フォントにはゴシック体や明朝体といったものから、デザインに凝っているものなど様々な種類があります。その全ての種類のフォントがコンピュータにはインストールされていないため、アプリケーションから好きなフォントを使うことができません。アプリケーションからプライベートフォントを扱えるようになると、好きなフォントを使うことができるようになります。それでは、アプリケーションからプライベートフォントを扱う方法を紹介したいと思います。

フォントファイルを使用する方法

 まず、プライベートフォントを使用する方法には二種類あります。その一つがフォントファイルを直接読み込むことです。プライベートフォントを扱うには 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 メソッドをもっていますので、適切なタイミングで破棄してください。

 フォントの中には無断で第三者に配布してはいけない場合もありますので、プライベートフォントを使用する際は使用許諾を確認する必要があります。第三者に配布してはいけない場合でもリソースとして埋め込んでしまえば、配布した事にはならない感じもします。とにかくプライベートフォントを扱う際にはトラブルが発生しないように注意する必要があります。