查找用户可用的所有系统字体以便它们可以显示在下拉选择框中的最佳方法是什么?
我还想区分 Unicode 和非 Unicode 字体。
我正在使用完全启用 Unicode 的 Delphi 2009,并且想要一个 Delphi 解决方案。
查找用户可用的所有系统字体以便它们可以显示在下拉选择框中的最佳方法是什么?
我还想区分 Unicode 和非 Unicode 字体。
我正在使用完全启用 Unicode 的 Delphi 2009,并且想要一个 Delphi 解决方案。
该Screen.Fonts
属性是通过EnumFontFamiliesEx
API 函数填充的。在Forms.pas中查看调用该函数的示例。
它调用的回调函数将接收一条TNewTextMetricEx
记录,该记录的成员之一是TFontSignature
. 该fsUsb
字段指示字体声称支持哪些 Unicode 子范围。
该系统实际上没有“Unicode 字体”。即使是名称中包含Unicode字样的字体也没有所有Unicode 字符的字形。您可以区分位图、打印机和 TrueType 字体,但除此之外,您能做的最好的事情就是弄清楚您正在考虑的字体是否支持您想要的字符。如果字体不是您认为的“Unicode 字体”,但它支持您需要的所有字符,那么它有什么区别呢?要获取此信息,您可能对GetFontUnicodeRanges
.
用于根据哪些字体包含哪些字符来显示具有不同字体的文本的 Microsoft 技术是Uniscribe,尤其是字体回退。我不知道任何 Delphi 对 Uniscribe 的支持。有一次我开始为它写一组导入单元,但我的兴趣变幻无常,在完成之前我就转向了别的东西。Michael Kaplan 的博客有时会谈到 Uniscribe,所以这是另一个值得关注的地方。
我可以回答你一半的问题,你可以从全局 Screen 对象中获取当前环境可以访问的字体列表作为字符串列表
IE
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 中显示。在其他示例中,可能会出现通常的空方格。