visual Studio内にフォントの組み込む方法
OSに直接組み込めばフォントはvisual studioが自動で読み込んで暮れて使えるのですが、自分のPC以外でアプリケーションの修正などを行いたい場合、その都度フォントをOSに入れるのは面倒なので、フォントをプロジェクト内に置きそれを参照する方法があります。
※今回はこちらのフォントをお借りしました
キルゴ – 無料で使える日本語フォント投稿サイト|フォントフリー
絶対パス
Dim pfc As New System.Drawing.Text.PrivateFontCollection() pfc.AddFontFile("C:\Users\Harumi_Sagawa\Downloads\GN-KillGothic_U\GN-KillGothic-U-KanaNB.ttf") Dim f As New System.Drawing.Font(pfc.Families(0), 22) Label1.Font = f
絶対パスでの指定方法です。これでもOSにインストールせずに独自のフォントを使うことができるのですが、フォントを毎回指定の場所に置かなければならないため不便です。
相対パス
Dim pfc As New System.Drawing.Text.PrivateFontCollection() pfc.AddFontFile(System.Environment.CurrentDirectory + "/GN-KillGothic-U-KanaNB.ttf") Dim f As New System.Drawing.Font(pfc.Families(0), 22) Label1.Font = f
このように設定できます。visual studioのカレントディレクトリがわからず結構ハマっていたのですがSystem.Environment.CurrentDirectoryこいつを使うことでカレントディレクトリを取得することができるので、カレントディレクトリプラス使いたいフォントとすることで使用することができました。
ちなみに僕はカレントディレクトリがbinファイルのDebugがルートディレクトリになっていたのでDebugフォルダにフォントにtffファイルを直で突っ込んでいます。
追記
Releaseフォルダ内にも同様にフォントを入れたフォルダを作成しておく必要があります。デバッグ時の実行と、ビルド時の実行でパスが異なるようで、入れておかなかった場合にはエラーが出てしまいます。
最終的に今回のプロジェクトではFontSelectというクラスを作成し、.Designer.vbクラスにインスタンスを作成して呼び出しました。
Public Class FontSelect Dim NotoSansCJKjpBold As New System.Drawing.Text.PrivateFontCollection() Dim MakinasScrap As New System.Drawing.Text.PrivateFontCollection() Dim RobotoSlabBold As New System.Drawing.Text.PrivateFontCollection() 'NotoSansCJKjpBoldフォント Public Function NotoFont() As FontFamily If NotoSansCJKjpBold.Families.Length = 0 Then Dim filePath As String = System.Environment.CurrentDirectory + "/myFont/NotoSansCJKjp/NotoSansCJKjp-Bold.otf" If System.IO.File.Exists(filePath) Then NotoSansCJKjpBold.AddFontFile(filePath) Else Return New FontFamily("Noto Sans CJK JP Bold") End If End If Return NotoSansCJKjpBold.Families(0) End Function 'Makinasフォント1 Public Function Makinas() As FontFamily If MakinasScrap.Families.Length = 0 Then Dim filePath As String = System.Environment.CurrentDirectory + "/myFont/makinas_scrap/Makinas-Scrap-5.otf" If System.IO.File.Exists(filePath) Then MakinasScrap.AddFontFile(filePath) Else Return New FontFamily("マキナス Scrap 5") End If End If Return MakinasScrap.Families(0) End Function 'Robotoフォント Public Function Roboto() As FontFamily If RobotoSlabBold.Families.Length = 0 Then Dim filePath As String = System.Environment.CurrentDirectory + "/myFont/roboto-slab/RobotoSlab-Bold.ttf" If System.IO.File.Exists(filePath) Then RobotoSlabBold.AddFontFile(filePath) Else Return New FontFamily("Roboto Slab") End If End If Return RobotoSlabBold.Families(0) End Function End Class
重複している部分を関数にすればもっと綺麗にかけそうですが許してください..
上記のクラスを作成して3つのフォントをプロジェクトに使いました。
If NotoSansCJKjpBold.Families.Length = 0 Then
このif文ですが、入れないとインスタンスをガンガン作成してしまい落ちたので入れました。
またまた追記
.designer.vbの下記の位置にインスタンスを作成しました。自動生成のファイルで書き換えたら危なそうですが書き換えちゃいました。フォームデザイナーからインスタンス作れないんだからしょうがないじゃないか!
'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。 'Windows フォーム デザイナを使用して変更できます。 'コード エディタを使って変更しないでください。 <system.diagnostics.debuggerstepthrough()> _ Private Sub InitializeComponent() ###ここらへん#### </system.diagnostics.debuggerstepthrough()>
フォントを設定してるところ
Me.ButtonClose.Font = New System.Drawing.Font(FontSelect.NotoFont(), ...省略)
できた!windowsに入ってるfontアンインストールだ!
あれ? windowsのシステムフォントの中にフォントがインストールされていないとdesigner.vbは見ることができないようです。(できる方法あったら教えてください)
相対パスを読みに行くのはデバッグorビルド時ってのはなんとなく想像つきますね。使うフォントはインストールして入れましょう! まぁでもこれでシステムフォントを参照しなくはなったので目的は達成できました。
最終的にインスタンスを作成する場所を変えてグローバル変数で宣言しました。
Public FontSelect As New FontSelect