Windows 11のフォントぜんぶ抜く【C#】


# 概要

現在の案件で、

- **Windows 95~98とか2000くらいの時代から定義されているフォントを大体で良いので全部プレビューしてほしい**
- **日本語の表示で縦書きになる「@」がついたフォントが出力できないと困る**

とかいうある意味トンデモ要望を受けていて、その解決案を探った記録

# 開発環境


|項目|説明|
|---|---|
|開発環境|Visual Studio 2019|
|ランタイム|.NET Framework 4.8|
|API、フレームワーク|WinForms(一部gdi32.dllなどWin32Apiネイティブのインポートを使用する)|
|実行時言語|en（日本語でも動くとは思う)|

# ソリューションファイル

https://github.com/belre/CSharpCodeSamples/tree/main/ScreenFontList/ScreenFontList

## やり方

- @を含めたフォント一覧は、DllImportを使用して、EnumFontFamiliesExをWin32Apiからラッピング
- フォントハンドルの取得は、CreateFontIndirectをWin32Apiからラッピング
- 文字列の表示は、これまたWin32Apiの関数：TextOutで実行

つまり、C#を使っているがほとんどWin32Apiのごり押しである。

違う点とすれば、WinFormsでささっと画面表示したかったので、PictureBoxとBitmapを使用して、TextOutしたテキスト画像を作ったらBitmapにペタッと貼り付ける処理を加えた程度。あまり複雑なことはしとらん。


# アプリケーション表示結果

## System

ラスタフォントの一つ
過去、OS上のシステムで標準で扱われていた。
現在でも本当稀にこの画面が出てくることがあるが、この画面が出てくる時はかなり原始的なコードを叩いていることが多い。

多くのアプリケーションでこのフォントを正確に表示できなくなっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/10c281b1-908a-5762-538c-1e3e2cb5f83b.png)

実際、Word 2019だとこうなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/021fddf2-426a-762e-a707-5bffdd385d8a.png)

縦向きではこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/ea886465-806c-fb75-5b49-8e068136746f.png)

実は、私が知る限り、この「@」付きの縦書きフォントを取得する方法、または描画する方法は.NETでは公式では実装されておらず、
BitmapからDrawStringなどしてもこの表示を実現することが出来ない。

実際、Web上には、それを実現しようとして苦労している記事は結構散見される・・・。

## FixedSys

これも特殊なラスタフォントの一つであるが
昔とは変わってしまって普通のゴシック体として扱われてしまうようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/3b59d3fa-bcc5-085f-390d-8b8576917e7b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/2c918dee-ceb7-6db7-fb71-4599b431836c.png)

https://wikipredia.net/ja/Fixedsys

コントロールパネルで見てみたんだが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/c5b44c9b-a207-63d6-31f7-50ed03f518d9.png)

どう見ても普通のMSゴシックだよね？
ラスタフォントの拡大率云々の前に、近いフォントが見つからない・・・。

## Terminal

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/52dde4f0-f4ef-af79-1303-114be476c3b2.png)

これも普通のMSゴシックのような気がする。
しかしコントロールパネルを開くと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/3629dc18-4063-908a-912f-7c9e2342474a.png)

こうなる。

ラスタフォントだからか、適切な拡大率を指定しなければこのような表示は得られないのかもしれない。
別の関数をさらに追加して、ラスタフォントとしてきちんと反映されている拡大率を見定めていく必要がありそう

## MS Serif

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/08f01b79-135a-62ed-31ba-410a079c7980.png)

## MS Sans Serif

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/357ac762-bab2-3830-44df-ffbcf0d2be66.png)


この辺までは存在すら知らない人が多かったのではなかろうか。
（私もこの話をするまで知らなかった）

## Small Fonts

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/8ea37b3a-01df-ec2e-cb94-43ab4a273ebf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/0d45d65b-1c9e-7098-a0bc-8fe8ede599e1.png)

すごくちっちぇえ

### ここまでの共通点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/6ce79d49-6a63-6047-8872-e3a9e42e6124.png)

OUT_PRECISIONがOUT_STRING_PRECISになっている。
つまり、以上のデータはラスタフォントである。

ラスタフォントは現在の.NETで動いているアプリケーション等ではまともに動かないことが多いようで、
これを映し出すにはネイティブコードでの実装が必要だ。

印刷用途を想定したアプリケーションを作る場合、この問題を無視できないのは厄介だと思う

## Modern

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/2abe60e4-8633-3306-f3a4-e89349c121b4.png)

## Roman

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/751fa3a0-5a6a-f84c-0169-0975a46ba121.png)

## Script

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/5fccd873-f027-4403-1e85-98635d2379e0.png)

## Courier

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/3956d431-0eb2-f737-8563-366bc98ef570.png)

## Marlett

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/3868e9af-e062-eb17-ca3f-5136397da373.png)


この辺りは見慣れないフォントだが、比較的新しい気がする。
ただワープロソフトなんかには載っていない模様。

## Arial

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/ba0e73d3-70f5-e9a9-5a20-d85ee7ece75c.png)

このあたりからは見慣れたフォントが続く。
しかし、Arialからでもたくさんの種類のフォントがあるのだが、これはCharSetが言語地域別で割り当てられている結果のようだ。

・・・以下略・・・

## Malgun Gothic Semilight

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/24fe2e7b-8848-1c12-80c0-f0867d42876c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/155f0676-9829-debd-088e-4badab079108.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/fc61ca1c-78a8-ad64-2b4f-d605800a156a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/53d8142c-c201-0bd6-5c4e-2196dd59dbde.png)

なんと、縦書きもある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/b4a18f34-dcaf-ebe5-c7e4-401436ce05bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/051134e2-51ae-87b7-9bf8-70b3ddf08582.png)

ハングル文字や漢字が多く含まれていて、CharSetでそれぞれ違うところを見ると、かなりアジア圏に意識したフォントのようだ

## MSゴシック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/cb41e5e3-2211-fca0-de66-3eedeaa4fcbe.png)

CharSetを変えると化けるのがなかなか面白い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/e1fa03f8-b8f7-51a9-3ccd-e81672e8503b.png)

## メイリオ＆Meiryo UI

やっぱり、結構違うよねえ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/cef6c429-4ac9-dcf2-2a54-10143032ce0f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/8ab800e4-890a-562e-4f7a-a89918fcd578.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/0973b174-d248-7c60-8b99-eaee5ff6dd64.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/fada5385-3d13-26e0-624a-14af4ad21e7b.png)

## Monotype Corsiva

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/882a7638-0d66-da8b-37bb-038d8d83de0a.png)

なんと標準で斜体が入っているのは珍しい気がする

## Palace Script MT

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/21445393-3ffc-8641-b285-4b94ac15ca4d.png)

## Vivaldi

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/8d60366f-b0f3-c714-2055-4a1e52300cab.png)

# まとめ

フォントで遊ぶのは楽しいが
過去のフォントを使ってほしいという案件を受ける場合には、
思っていたよりも数倍苦労させられるので、
この話を考えるときには事前検証をしっかりしておくこと