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