ドロップダウン選択ボックスに表示できるように、ユーザーが使用できるすべてのシステム フォントを見つける最善の方法は何ですか?
また、Unicode フォントと非 Unicode フォントを区別したいと思います。
完全に Unicode 対応の Delphi 2009 を使用しており、Delphi ソリューションが必要です。
ドロップダウン選択ボックスに表示できるように、ユーザーが使用できるすべてのシステム フォントを見つける最善の方法は何ですか?
また、Unicode フォントと非 Unicode フォントを区別したいと思います。
完全に Unicode 対応の Delphi 2009 を使用しており、Delphi ソリューションが必要です。
Screen.Fonts
プロパティは、EnumFontFamiliesEx
API関数を介して入力されます。その関数を呼び出す例については、 Forms.pasを参照してください。
呼び出すコールバック関数はレコードを受け取り、TNewTextMetricEx
そのレコードのメンバーの1つはTFontSignature
です。このfsUsb
フィールドは、フォントがサポートすると主張するUnicodeサブレンジを示します。
システムには実際には「Unicodeフォント」がありません。名前にUnicodeという単語が含まれているフォントでさえ、すべてのUnicode文字のグリフが含まれているわけではありません。ビットマップ、プリンター、およびTrueTypeフォントを区別できますが、それを超えて、検討しているフォントが目的の文字をサポートしているかどうかを判断するのが最善の方法です。また、フォントが「Unicodeフォント」とは見なされないが、必要なすべての文字をサポートしている場合、どのような違いがありますか?この情報を入手するには、に興味があるかもしれませんGetFontUnicodeRanges
。
どのフォントにどの文字が含まれているかに基づいて異なるフォントでテキストを表示するためのMicrosoftテクノロジ、特にフォントフォールバック。Uniscribeに対するDelphiのサポートを知りません。一度インポートユニットのセットを書き始めましたが、興味が気まぐれで、完成する前に別のことに移りました。Michael Kaplanのブログでは、Uniscribeについて時々取り上げられているので、それは別の見方です。
あなたの質問の半分に答えることができます。現在の環境がアクセスできるフォントのリストを、グローバルな Screen オブジェクトから文字列リストとして取得できます。
すなわち
Listbox1.Items.AddStrings(Screen.Fonts);
Windowsフォントを列挙することにより、forms.pasソースを調べて、CodegearがScreen.Fontsをどのように埋めるかを確認できます。返されるLOGFONT構造にはcharsetメンバーがありますが、これは単純な「Unicode」決定を提供しません。
私の知る限り、Windowsはフォントが「Unicode」であるかどうかを明示的に伝えることはできません。さらに、Unicodeテキストを「非Unicode」フォントで表示しようとすると、Windowsが別のフォントに置き換える可能性があるため、フォントがUnicodeを表示するかどうかを判断するのは困難です。たとえば、Unicodeグリフを含まない古いArial Blackフォントファイルがありますが、これを使用してD2009メモに日本語のテキストを表示すると、日本語はArialで正しく表示され、残りはArialBlackで表示されます。他の例では、通常の空の正方形が表示される場合があります。