概要
現在の案件で、
- Windows 95~98とか2000くらいの時代から定義されているフォントを大体で良いので全部プレビューしてほしい
- 日本語の表示で縦書きになる「@」がついたフォントが出力できないと困る
とかいうある意味トンデモ要望を受けていて、その解決案を探った記録
開発環境
項目 | 説明 |
---|---|
開発環境 | Visual Studio 2019 |
ランタイム | .NET Framework 4.8 |
API、フレームワーク | WinForms(一部gdi32.dllなどWin32Apiネイティブのインポートを使用する) |
実行時言語 | en(日本語でも動くとは思う) |
ソリューションファイル
やり方
- @を含めたフォント一覧は、DllImportを使用して、EnumFontFamiliesExをWin32Apiからラッピング
- フォントハンドルの取得は、CreateFontIndirectをWin32Apiからラッピング
- 文字列の表示は、これまたWin32Apiの関数:TextOutで実行
つまり、C#を使っているがほとんどWin32Apiのごり押しである。
違う点とすれば、WinFormsでささっと画面表示したかったので、PictureBoxとBitmapを使用して、TextOutしたテキスト画像を作ったらBitmapにペタッと貼り付ける処理を加えた程度。あまり複雑なことはしとらん。
アプリケーション表示結果
System
ラスタフォントの一つ
過去、OS上のシステムで標準で扱われていた。
現在でも本当稀にこの画面が出てくることがあるが、この画面が出てくる時はかなり原始的なコードを叩いていることが多い。
多くのアプリケーションでこのフォントを正確に表示できなくなっている。
実際、Word 2019だとこうなる
縦向きではこんな感じ。
実は、私が知る限り、この「@」付きの縦書きフォントを取得する方法、または描画する方法は.NETでは公式では実装されておらず、
BitmapからDrawStringなどしてもこの表示を実現することが出来ない。
実際、Web上には、それを実現しようとして苦労している記事は結構散見される・・・。
FixedSys
これも特殊なラスタフォントの一つであるが
昔とは変わってしまって普通のゴシック体として扱われてしまうようだ。
コントロールパネルで見てみたんだが、
どう見ても普通のMSゴシックだよね?
ラスタフォントの拡大率云々の前に、近いフォントが見つからない・・・。
Terminal
これも普通のMSゴシックのような気がする。
しかしコントロールパネルを開くと
こうなる。
ラスタフォントだからか、適切な拡大率を指定しなければこのような表示は得られないのかもしれない。
別の関数をさらに追加して、ラスタフォントとしてきちんと反映されている拡大率を見定めていく必要がありそう
MS Serif
MS Sans Serif
この辺までは存在すら知らない人が多かったのではなかろうか。
(私もこの話をするまで知らなかった)
Small Fonts
すごくちっちぇえ
ここまでの共通点
OUT_PRECISIONがOUT_STRING_PRECISになっている。
つまり、以上のデータはラスタフォントである。
ラスタフォントは現在の.NETで動いているアプリケーション等ではまともに動かないことが多いようで、
これを映し出すにはネイティブコードでの実装が必要だ。
印刷用途を想定したアプリケーションを作る場合、この問題を無視できないのは厄介だと思う
Modern
Roman
Script
Courier
Marlett
この辺りは見慣れないフォントだが、比較的新しい気がする。
ただワープロソフトなんかには載っていない模様。
Arial
このあたりからは見慣れたフォントが続く。
しかし、Arialからでもたくさんの種類のフォントがあるのだが、これはCharSetが言語地域別で割り当てられている結果のようだ。
・・・以下略・・・
Malgun Gothic Semilight
なんと、縦書きもある
ハングル文字や漢字が多く含まれていて、CharSetでそれぞれ違うところを見ると、かなりアジア圏に意識したフォントのようだ
MSゴシック
CharSetを変えると化けるのがなかなか面白い
メイリオ&Meiryo UI
やっぱり、結構違うよねえ
Monotype Corsiva
なんと標準で斜体が入っているのは珍しい気がする
Palace Script MT
Vivaldi
まとめ
フォントで遊ぶのは楽しいが
過去のフォントを使ってほしいという案件を受ける場合には、
思っていたよりも数倍苦労させられるので、
この話を考えるときには事前検証をしっかりしておくこと