System.Drawing.FontFamily->IsStyleAvailable 始终返回 true

til*_*arr 5 c# fonts

我使用 PrivateFontCollection 通过 AddMemoryFont 加载字体。我检索 FontFamily,然后使用 IsStyleAvailable 查询它以确定字体支持的样式。然而,对于无数的字体,每次调用 IsStyleAvailable 都会返回 true。

PrivateFontCollection pfc = new PrivateFontCollection();
var fontBuffer = Marshal.AllocCoTaskMem(dta.Length);
Marshal.Copy(dta, 0, fontBuffer, dta.Length);
pfc.AddMemoryFont(fontBuffer, dta.Length);

System.Drawing.FontFamily fam = pfc.Families[0];
if (fam.IsStyleAvailable(d.FontStyle.Bold)) //do something
Run Code Online (Sandbox Code Playgroud)

有谁知道如何从 FontFamily 获取实际的样式信息?如果您查看 C:\Windows\Fonts 文件夹,您可以看到支持的样式。例如:Agency FB支持粗体;常规,但是当我以这种方式查询它时,我得到了下划线、删除线和斜体以及粗体和常规的样式。

有更好的方法来解决这个问题吗?

Han*_*ant 5

Windows 中的字体引擎知道如何从无样式的基本字体合成样式。在纸上做起来并不是特别困难,只需使茎变粗即可变得粗体,倾斜它们即可获得斜体,画一条线即可获得下划线或删除线。它并不像优秀设计师创建的专用轮廓那么漂亮,但它确实可以完成工作。所以当你问“你能做到吗?” 然后你会得到一个响亮的“当然可以!”

由于您明确添加了 TTF 文件,因此您已经知道哪些样式无需合成即可直接支持,因此无需询问。无论如何,也许可以通过 pinvoke 和/或挖掘 TTF 表来找出答案,但它会很丑陋,而且肯定不会直接受到 .NET 支持。据我所知,没有任何 winapi 函数可以直接告诉你。