如何获得给定字体的可用字体样式

问题描述 投票:1回答:2

我想创建2个组合框。首先组合安装在Windows中的所有字体,第二个组合使用基于第一个组合框中所选字体的可用字体样式。

我已经使用EnumFontFamiliesEx函数安装了所有字体,但我无法弄清楚在哪里可以找到所有可用的字体样式。

我不想使用CFontDialog

有任何想法吗?

c++ winapi
2个回答
0
投票

我已经有一段时间了,所以请考虑这是一个有根据的猜测。

您最初使用lpszFamily的空指针调用EnumFontFamilies(文档现在有时会错误地调用lpLogfont)。这为您提供了每个字体系列中的一种代表性字体(例如,Arial)。

用户选择一个系列后,再次使用EnumFontFamilies,这次使用该系列的名称。然后,应该枚举属于该字体系列的所有字体文件。可以检查传递给枚举回调的NEWTEXTMETRIC对象,看它是否是粗体,斜体等。

请注意,对于NEWTEXTMETRIC,您可能会获得指向TEXTMETRIC的指针。我不知道你应该怎么知道额外的字段是否存在。

您也可以使用EnumFontFamiliesEx(请注意-Ex后缀)来执行此操作。文档有一个表格,告诉您将根据您在LOGFONT中添加的约束来枚举什么。 EnumFontFamiliesEx的回调还给出了elfFullName字段,该字段应该给出具有它支持的特定样式的字体名称(例如,“Arial Black”)。请注意,即使您使用API​​的宽(“Unicode”)版本,这些名称也是ANSI。


0
投票

这有点取决于你想用这个枚举结果做什么。如果你想过滤掉模拟面并得到一个列表,我建议你看一下DirectWrite,模拟面被明确地标记为这样。

如果您希望能够从该对话框中进行选择并使用它来使用GDI进行渲染,则还可以判断模拟是否发生,但不能以文档化的API方式进行。

© www.soinside.com 2019 - 2024. All rights reserved.