2008-12-31 45 views
5

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

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

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

回答

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,所以这是另一个地方。

8

我可以回答你一半的问题,你可以得到的字体列表,当前的环境可以访问从全局画面对象的字符串列表

Listbox1.Items.AddStrings(Screen.Fonts); 
4

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

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