Вопрос

Каков наилучший способ найти все доступные пользователю системные шрифты, чтобы их можно было отобразить в выпадающем списке?

Я также хотел бы провести различие между шрифтами в Юникоде и не-юникодными шрифтами.

Я использую Delphi 2009, который полностью поддерживает Unicode, и хотел бы получить решение Delphi.

Это было полезно?

Решение

Тот Самый Screen.Fonts свойство заполняется через EnumFontFamiliesEx Функция API.Загляни внутрь Формы.pas приведем пример вызова этой функции.

Функция обратного вызова, которую она вызывает, получит TNewTextMetricEx запись, и одним из членов этой записи является TFontSignature.Тот Самый fsUsb поле указывает, какие поддиапазоны Unicode, как утверждается, поддерживает шрифт.

На самом деле в системе нет "шрифтов Unicode". Даже шрифты, содержащие слово Юникод в их названиях нет символов для ВСЕ Символы Юникода.Вы можете различать шрифты bitmap, printer и TrueType, но помимо этого лучшее, что вы можете сделать, это выяснить, поддерживает ли рассматриваемый вами шрифт нужные вам символы.И если шрифт не тот, который вы бы назвали "шрифтом Юникода", но он поддерживает все символы, которые вам нужны, тогда какая разница?Чтобы получить эту информацию, вас может заинтересовать GetFontUnicodeRanges.

Технология Microsoft для отображения текста с различными шрифтами, основанная на том, какие шрифты содержат какие символы, является Не Описывать, в частности резервный вариант шрифта.Я не знаю о какой-либо поддержке Delphi для Uniscribe;Однажды я начал писать для него набор единиц импорта, но мои интересы непостоянны, и я перешел к чему-то другому, прежде чем завершил его. Блог Майкла Каплана иногда говорится о Uniscribe, так что это еще одно место, где стоит поискать.

Другие советы

Я могу ответить на половину вашего вопроса: вы можете получить список шрифтов, к которым ваша текущая среда имеет доступ, в виде списка строк из глобального объекта Screen

т. е.

Listbox1.Items.AddStrings(Screen.Fonts);

Вы можете посмотреть в исходном коде forms.pas, чтобы увидеть, как Codegear заполняет экран.Шрифты, перечислив шрифты Windows.Возвращаемая структура LOGFONT имеет элемент charset, но это не обеспечивает простого определения "Unicode".

Насколько я знаю, Windows не может явно указать вам, является ли шрифт "Unicode".Более того, если вы попытаетесь отобразить текст в Юникоде шрифтом, отличным от Юникода, Windows может заменить другой шрифт, поэтому трудно сказать, будет ли шрифт отображать Юникод.Например, у меня есть древний файл шрифта Arial Black, который не содержит символов Юникода, но если я использую его для отображения японского текста в памятке D2009, японский язык отображается корректно в Arial, а остальные - в Arial Black.В других примерах могут отображаться обычные пустые квадраты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top