我想创建2个组合框。首先组合安装在Windows中的所有字体,第二个组合使用基于第一个组合框中所选字体的可用字体样式。
我已经使用EnumFontFamiliesEx
函数安装了所有字体,但我无法弄清楚在哪里可以找到所有可用的字体样式。
我不想使用CFontDialog
有任何想法吗?
我已经有一段时间了,所以请考虑这是一个有根据的猜测。
您最初使用lpszFamily的空指针调用EnumFontFamilies(文档现在有时会错误地调用lpLogfont)。这为您提供了每个字体系列中的一种代表性字体(例如,Arial)。
用户选择一个系列后,再次使用EnumFontFamilies,这次使用该系列的名称。然后,应该枚举属于该字体系列的所有字体文件。可以检查传递给枚举回调的NEWTEXTMETRIC对象,看它是否是粗体,斜体等。
请注意,对于NEWTEXTMETRIC,您可能会获得指向TEXTMETRIC的指针。我不知道你应该怎么知道额外的字段是否存在。
您也可以使用EnumFontFamiliesEx(请注意-Ex后缀)来执行此操作。文档有一个表格,告诉您将根据您在LOGFONT中添加的约束来枚举什么。 EnumFontFamiliesEx的回调还给出了elfFullName字段,该字段应该给出具有它支持的特定样式的字体名称(例如,“Arial Black”)。请注意,即使您使用API的宽(“Unicode”)版本,这些名称也是ANSI。
这有点取决于你想用这个枚举结果做什么。如果你想过滤掉模拟面并得到一个列表,我建议你看一下DirectWrite,模拟面被明确地标记为这样。
如果您希望能够从该对话框中进行选择并使用它来使用GDI进行渲染,则还可以判断模拟是否发生,但不能以文档化的API方式进行。