使用Delphi查找系统字体

6

如何最好地查找用户可用的所有系统字体,以便它们可以在下拉选择框中显示?

我还希望区分Unicode和非Unicode字体。

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

3个回答

12

Screen.Fonts属性通过EnumFontFamiliesEx API函数进行填充。在Forms.pas文件中可以找到调用该函数的例子。

回调函数会接收一个TNewTextMetricEx记录,该记录的一个成员是TFontSignature。其中的fsUsb字段表示字体声称支持的Unicode子范围。

实际上系统并没有“Unicode字体”。即使那些名字中带有“Unicode”的字体,也并不具备所有Unicode字符的字形。你可以区分位图、打印机和TrueType字体,但除此之外,你能做的最好的就是确定你正在考虑的字体是否支持你需要的字符。如果该字体不符合你所认为的“Unicode字体”,但它支持你需要的所有字符,那又有什么区别呢?要获取这些信息,你可能会对GetFontUnicodeRanges感兴趣。

用于根据不同字体所包含的字符来显示文本的微软技术是Uniscribe,尤其是字体回退。我不知道Delphi是否支持Uniscribe;我曾经开始编写一组导入单元来支持它,但我的兴趣很容易改变,在完成之前我就转而做其他事情了。Michael Kaplan的博客有时会谈到Uniscribe,那也是一个可以查找资料的地方。


8
我可以回答你问题的一半,你可以从全局屏幕对象中获取当前环境可以访问的字体列表作为字符串列表。
例如:
Listbox1.Items.AddStrings(Screen.Fonts);

4
你可以查看forms.pas源代码,了解Codegear如何通过枚举Windows字体来填充Screen.Fonts。返回的LOGFONT结构具有charset成员,但这并不能提供简单的“Unicode”确定。
据我所知,Windows无法明确告诉你一个字体是否是“Unicode”。此外,如果您尝试在“非Unicode”字体中显示Unicode文本,Windows可能会替换不同的字体,因此很难说一个字体是否能够显示Unicode。例如,我有一个古老的Arial Black字体文件,其中不包含Unicode字形,但如果我使用它来在D2009备忘录中显示日语文本,则日语将正确显示为Arial,其余部分则为Arial Black。在其他情况下,通常会显示空心方块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接