【发布时间】:2008-12-31 00:18:18
【问题描述】:
查找用户可用的所有系统字体以便在下拉选择框中显示的最佳方法是什么?
我还想区分 Unicode 和非 Unicode 字体。
我使用的是完全支持 Unicode 的 Delphi 2009,我想要一个 Delphi 解决方案。
【问题讨论】:
标签: delphi unicode fonts delphi-2009
查找用户可用的所有系统字体以便在下拉选择框中显示的最佳方法是什么?
我还想区分 Unicode 和非 Unicode 字体。
我使用的是完全支持 Unicode 的 Delphi 2009,我想要一个 Delphi 解决方案。
【问题讨论】:
标签: delphi unicode fonts delphi-2009
Screen.Fonts 属性通过EnumFontFamiliesEx API function 填充。在 Forms.pas 中查看调用该函数的示例。
它调用的回调函数将收到TNewTextMetricEx 记录,该记录的成员之一是TFontSignature。 fsUsb 字段指示字体声称支持的 Unicode 子范围。
系统实际上没有“Unicode 字体”。即使名称中包含单词 Unicode 的字体也没有 all Unicode 字符的字形。您可以区分位图、打印机和 TrueType 字体,但除此之外,您能做的最好的事情就是确定您正在考虑的字体是否支持您想要的字符。如果字体不是您认为的“Unicode 字体”,但它支持您需要的所有字符,那么它有什么区别呢?要获取此信息,您可能对GetFontUnicodeRanges 感兴趣。
根据字体包含哪些字符来显示具有不同字体的文本的 Microsoft 技术是 Uniscribe,尤其是 font fallback。我不知道任何 Delphi 对 Uniscribe 的支持。有一次我开始为它写一组导入单元,但我的兴趣变幻无常,在完成之前我就转向了别的东西。 Michael Kaplan's blog 有时会谈到 Uniscribe,所以这是另一个值得关注的地方。
【讨论】:
我可以回答你一半的问题,你可以从全局 Screen 对象中获取当前环境可以访问的字体列表作为字符串列表
即
Listbox1.Items.AddStrings(Screen.Fonts);
【讨论】:
您可以查看 forms.pas 源代码,了解 Codegear 如何通过枚举 Windows 字体来填充 Screen.Fonts。返回的 LOGFONT 结构有一个字符集成员,但这不提供简单的“Unicode”确定。
据我所知,Windows 无法明确告诉您字体是否为“Unicode”。此外,如果您尝试以“非 Unicode”字体显示 Unicode 文本,Windows 可能会替换为不同的字体,因此很难说字体是否会显示 Unicode。例如,我有一个古老的 Arial Black 字体文件,其中不包含 Unicode 字形,但如果我使用它在 D2009 备忘录中显示日文文本,日文将在 Arial 中正确显示,而其余的在 Arial Black 中显示。在其他示例中,可能会出现通常的空方格。
【讨论】: