使用Delphi查找系统字体

时间:2008-12-31 00:18:18

标签: delphi unicode fonts delphi-2009

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

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

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

3 个答案:

答案 0 :(得分:11)

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

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

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

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

答案 1 :(得分:8)

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

Listbox1.Items.AddStrings(Screen.Fonts);

答案 2 :(得分:4)

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

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