Как лучше всего найти все системные шрифты, доступные пользователю, чтобы их можно было отобразить в раскрывающемся списке?
Я также хотел бы различать шрифты Unicode и не-Unicode.
Я использую Delphi 2009, который полностью поддерживает Unicode, и мне нужно решение Delphi.





Я могу ответить на половину вашего вопроса, вы можете получить список шрифтов, к которым ваша текущая среда имеет доступ, в виде списка строк из глобального объекта Screen
т.е.
Listbox1.Items.AddStrings(Screen.Fonts);
Вы можете посмотреть исходный код forms.pas, чтобы увидеть, как Codegear заполняет Screen.Fonts путем перечисления шрифтов Windows. Возвращенная структура LOGFONT имеет член набора символов, но это не обеспечивает простого определения «Unicode».
Насколько мне известно, Windows не может явно сказать вам, является ли шрифт «Unicode». Более того, если вы попытаетесь отобразить текст Unicode шрифтом, отличным от Unicode, Windows может заменить его другим шрифтом, поэтому трудно сказать, будет ли шрифт отображать Unicode или нет. Например, у меня есть древний файл шрифта Arial Black, который не содержит глифов Unicode, но если я использую его для отображения японского текста в заметке D2009, японский язык отображается правильно в Arial, а остальное - в Arial Black. В других примерах могут появиться обычные пустые квадраты.
Свойство Screen.Fonts заполняется через Функция API EnumFontFamiliesEx. Посмотрите в Forms.pas пример вызова этой функции.
Функция обратного вызова, которую он вызывает, получит запись TNewTextMetricEx, и одним из членов этой записи является TFontSignature. Поле fsUsb указывает, какие поддиапазоны Unicode шрифты утверждают для поддержки.
В системе фактически нет «шрифтов Unicode». Даже шрифты, в названии которых есть слово Юникод, не имеют глифов для символов все Unicode. Вы можете различать растровые, принтерные и шрифты TrueType, но, помимо этого, лучшее, что вы можете сделать, - это выяснить, поддерживает ли рассматриваемый шрифт нужные вам символы. И если шрифт не тот, который вы бы считали «шрифтом Unicode», но он поддерживает все необходимые символы, то какая разница? Для получения этой информации вас может заинтересовать GetFontUnicodeRanges.
Технология Microsoft для отображения текста с разными шрифтами в зависимости от того, какие шрифты содержат какие символы, - это Не описывать, особенно резервный шрифт. Мне ничего не известно о поддержке Uniscribe в Delphi; Однажды я начал писать для него набор единиц импорта, но мои интересы непостоянны, и я перешел к чему-то другому, прежде чем закончил его. Блог Майкла Каплана иногда говорит о Uniscribe, так что это еще одно место для поиска.