|
2019/05/07(Tue) 02:00:48 編集(投稿者)
この問い合わせの回答に対して正確に答えることができる人はいないような気がします。 私が過去に調査した範囲では以下のような結論になっています。私が個人的に調査した結果なので何の保証もありません。
文中で Visual Style と記載していますが、実際の動作はちょっとわかりません。 Visual Studio のデザイン時とデバッグ時でフォントが異なることがあるので、その差を指していると考えてください。
1.FontLinkによる解決 該当フォントに存在しない文字が指定されている場合、FontLink によって描画するフォントが決定されます。 FontLink は参考サイトを貼り付けようかと思いましたが、良いサイトがありませんでした。 FontLink で検索してみてください。 なお、Arial は標準では FontLink に登録されていないので次のステップに進むと推測しています。
2.FontLink のデフォルトによる解決 Visual Style が有効である場合、 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink にある FontLinkDefaultChar で指定されたフォントが決定されます。 Windows 10 では 0x30fb で設定されており、これは MS UI Gothic に相当していると推測しています。 ただし、ここで注意していただきたいのが、1文字単位の描画は MS UI Gothic で行われるのですが、 フォントのピッチやクオリティの設定は Arial のままとなっているため、 純粋にそのフォントを選択した時とは描画結果は異なっていると思われます。 ここでハングル等の日本語フォントにない文字を描画しようとした場合、このデフォルトから FontLink を検索すると推測しています。
3.フォントマッパーによるフォントの選択 Visual Style が有効ではない場合、フォントマッパーによってフォントの選択が行われます。 以下のレジストリキー HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontMapper フォントマッパーで変換されるフォントが登録されています。 DWORD 値の下位 2 バイトが LOGFONT 構造体の lfCharSet に該当しており、その次の 2 バイトが LOGFONT 構造体の lfPitchAndFamily に該当していると推測しています。 ただし、lfCharSet メンバは現在のフォントからではなく指定されている文字から決定されます。 日本語を指定している場合、SHIFTJIS_CHARSET が決定され、下位 2 バイトは 0x80 になります。 Arial フォントは lfPitchAndFamily が 0 であるため、DWORD 値で 0x00000080 のフォントが候補に上がります。 0x00000080 は MS P ゴシック であるため MS P ゴシック が選択されます。 Arial を指定した場合、最低でもここで検索は終了していると思います。 なお、ファミリ以外の設定は Arial を引き継いでいるのも2の手順と同じものと推測しています。
4.デフォルトフォントの選択 最終的に上記で解決されなかった場合、フォントマッパーのデフォルト値が使用されます。 とは言っても、Windows XP 以降の OS ではここまでたどり着いていないと推測しています。 ここでは lfPitchAndFamily の値によって以下のレジストリキーのフォントを選択していると推測しています。 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontMapper\FamilyDefaults
|