Поиск системных шрифтов с Delphi - PullRequest
5 голосов
/ 31 декабря 2008

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

Я также хотел бы различать Unicode и не-Unicode шрифты.

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

Ответы [ 3 ]

11 голосов
/ 05 января 2009

Свойство Screen.Fonts заполняется через API-функцию EnumFontFamiliesEx . Посмотрите в Forms.pas пример вызова этой функции.

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

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

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

8 голосов
/ 31 декабря 2008

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

т.е.

Listbox1.Items.AddStrings(Screen.Fonts);
4 голосов
/ 31 декабря 2008

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

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

...