找到用户可用的所有系统字体的最佳方法是什么,以便它们可以显示在下拉选择框中?

我还想区分Unicode和非Unicode字体。

我正在使用完全支持Unicode的Delphi 2009,并希望使用Delphi解决方案。

有帮助吗?

解决方案

Screen.Fonts 属性通过填充 EnumFontFamiliesEx API函数。查看 Forms.pas 以获取调用该函数的示例。

它调用的回调函数将收到 TNewTextMetricEx 记录,该记录的其中一名成员是 TFontSignature fsUsb 字段指示字体声称支持哪些Unicode子范围。

系统实际上没有“Unicode字体”。即使名称中包含 Unicode 一词的字体也没有所有 Unicode字符的字形。您可以区分位图,打印机和TrueType字体,但除此之外,您可以做的最好的方法是确定您考虑的字体是否支持您想要的字符。如果字体不是你认为的“Unicode字体”,那么但它支持你需要的所有角色,那么它有什么区别?要获取此信息,您可能对 GetFontUnicodeRanges <感兴趣/ A>

Microsoft技术用于显示具有不同字体的文本,基于哪些字体包含哪些字符 Uniscribe ,特别是 font fallback 。我不知道任何德尔福对Uniscribe的支持;我开始为它编写一套导入单元,但我的兴趣是变幻无常的,在我完成之前我又转向了其他东西。 Michael Kaplan的博客有时会谈论Uniscribe,所以这是另一个值得关注的地方。

其他提示

我可以回答你问题的一半,你可以从全局屏幕对象中获取当前环境可以访问的字体列表作为字符串列表

Listbox1.Items.AddStrings(Screen.Fonts);

您可以查看forms.pas源代码,了解Codegear如何通过枚举Windows字体来填充Screen.Fonts。返回的LOGFONT结构有一个charset成员,但这并不能提供简单的“Unicode”确定。

据我所知,Windows无法明确告诉您字体是否为“Unicode”。此外,如果您尝试以“非Unicode”字体显示Unicode文本,Windows可能会替换不同的字体,因此很难说字体是否显示Unicode。例如,我有一个古老的Arial Black字体文件,其中不包含Unicode字形,但如果我使用它来在D2009备忘录中显示日文文本,则日语在Arial中正确显示,其余在Arial Black中显示。在其他示例中,可以显示通常的空方块。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top