C# Fontクラスを使うときはこれに注意

先日は新しくパソコンを自作したので、Windowsもクリーンインストールしました。
いつも使っていた「写真に文字を入れる」自作アプリがあって、新しいパソコンでも普通に使えました。
それが、何日後に出力された写真を使おうとしたら、「あれ?何かが違う!」と感じて、よく見てみたら、写真に描画された文字のフォントが違うではありませんか!?
そういえばWindowsをインストールしたけど、そのフォントをまだ入れていないと思い出しました。
フォントが見つからなかったら、なんでエラーが出ないんだろうと不思議に思って、早速コードを調べてみました。

C#のFontクラスにはfallback代替フォントが存在している

指定フォントが見つからないときの挙動

指定のフォントが見つからなかったときはExceptionを投げてくれると期待しました。

string fontName = "My Font"; Font font = new Font(fontName, 12); } /* * fontを使うコード */

わざと存在しないFontを指定して、fontオブジェクトの中身をDebugで見てみよう:
Exceptionを出さずに代替フォントMicrosoft Sans Serifが自動的に使われています! 

C# Fontクラス 指定Fontが見つからないときは代替Fontが使われる

Font Classの公式仕様を調べてみる

Microsoft DocサイトのFont Classページに注意書きがありました:

If you attempt to use a font that is not supported, or the font is not installed on the machine that is running the application, the Microsoft Sans Serif font will be substituted.

やっぱり、サポートされないフォントあるいはインストールされていないフォントを使おうとしたら、自動的に代替Font Microsoft Sans Serif が使われます。

指定フォントが見つからないときにエラーを出す方法

指定フォントが見つからないときは黙って代替フォントを使うのではなく、エラーを出してほしいなら、シンプルにFont.NameをチェックすればOKです。

string fontName = "My Font"; Font font = new Font(fontName, 12); if (!font.Name.Equals(fontName)) { MessageBox.Show($"{fontName}が存在しないか、正しく読み込めませんでした。\n代わりに{font.Name}が使われています。","注意"); } /* * fontを使うコード */
Font.Nameと照合してメッセージを出す


Fontが見つからないときにエラーを出すべきかどうか

確かにFontを使うシナリオでは、このfallback代替フォントのやり方は普通ですよね。
指定Fontが見つからない場合は何も表示されなかったり、エラーが出たりするよりは、とりあえず別のFontを使ってコンテンツを表示させたほうが良いという考え方は、理解できます。
とくに画面に文字を表示するときに、ユーザーに情報の内容を見せることは文字の「デザイン=フォント」より重要だと考えられなくもないです。
ただし、Fontを使ってファイルに書き込んだり、印刷したりするときは、黙って他のフォントを使うと都合が場合があります。
間違ったフォントで出力されたファイルや紙をもう一度やり直さなければならないことになると、時間と資源の浪費になります。
以上、今後Fontクラスを使うときに留意しておきたい点でした。

コメント

このブログの人気の投稿

C# WebView2.ExecuteScriptAsync()のいくつかの使い方とDebug方法

C# 外部ライブラリを使わずに半角→全角カタカナ変換

C# WebView2を通じてWebサーバーなしでJavaScriptからローカルファイルを読み書き