C#のWPFで外字を表示する その1

タイトル

WPFで作成したアプリで外字を表示するためには、外字ファイルを明示的に指定しなければいけない。
他のアプリ(メモ帳とか)で外字が表示出来てるからと言って、なにもせずにそのまま表示できるわけではない。

外字は「EUDC」という名前なので、これをFontFamilyへ追加してあげる必要がある。
フォントファミリはカンマ区切りで複数指定できるので、通常使うファミリ名の後ろにカンマでつなげて指定する。


フォントファミリ名はフルパスで指定する

ダメな例
FontFamily="メイリオ,EUDC"

外字ファイルは通常「c:\Windows\Fonts\」フォルダ内に存在するので、.NET Frameworkのバージョンが4.0より前の場合はこれでも動作するようだが、4.0以降はフルパスで指定しないと動作しない。

パスの指定はファミリ名の前に#で区切って書くという仕様なので、外字ファイルが「c:\Windows\Fonts\」にある場合以下のようになる。

FontFamily="メイリオ,file:///C:/Windows/Fonts/EUDC.tte#EUDC"

※ちなみにドキュメントなど見ると「EUDC.tte」の部分はいらず「file:///C:/Windows/Fonts/#EUDC」で良さそうな気がするが、ファイルが「c:\Windows\Fonts\」にある場合に限って「EUDC.tte」まで指定しないとうまく動かなかった
※別のパスにファイルがある時はファイル名はいらないで動くのに・・・なぜかは不明


外字ファイルがc:\Windows\Fonts\にあるとは限らない

OSに標準搭載されている外字エディタというツールを使って外字を作成すると、「c:\Windows\Fonts」フォルダの中にEUDC.tteとEUDC.eufという2つのファイルが作成されるのでほとんどの場合はここ。
但し、外字エディタの[ファイル(F)]→[フォントのリンク...]というメニューから別の場所にあるファイルを参照する事も可能になっている。

また、フリーのツールなどを使って別PCからコピーしてきたような場合も「c:\Windows\Fonts」以外の場所にファイルが存在する可能性がある。


外字ファイルはどこにあるか

外字ファイルが格納された正確な場所はレジストリに書かれている。

レジストリのキーは HKEY_CURRENT_USER\EUDC\932\ 

特定のフォントに外字ファイルがリンクされている場合は、フォント名でパスを格納している。
それ以外のフォントの場合、SystemDefaultEUDCFontの名前でパスの値を格納している。

レジストリエディタで確認してみると↓こんな感じ。
レジストリエディタ

上記を踏まえてWPFで外字を表示するには、レジストリから外字ファイルのパスを取得し、そのパスで明示的にフォントファミリへ外字を追加するコードを書き加える必要がある。
 

続く↓

コメント