C#将FontDialog设置为仅显示TrueType字体

几乎每个论坛都会提出这个问题,包括这里,但我找不到任何可接受的答案。 我开始认为实际上没有解决方案,我只需要将我的代码包装在try / catch块中并向用户道歉并要求他们选择另一种字体。

我想显示一个FontDialog以便用户可以更改Chart上的字体,但是如果用户选择非TrueType字体,则会抛出exception。 GDI +只能处理TrueType字体。

如何过滤不能与GDI +一起使用的FontDialog中的字体?

FontDialog类已经执行此操作,它使用带有CF_TTONLY选项的ChooseFont()API调用。 这迫使对话框仅显示将自己宣传为TrueType字体的字体。 这些链接表明这个对话框周围有字体,直到今天才从未听说过。 这使它非常罕见,但肯定不是意料之外,有很多垃圾字体与坏元数据。

没有任何东西可以捕获exception,它是在回调函数中引发的,该函数已经被嵌入到.NET框架中。 重写课程是一种选择,但不是一个令人愉快的选择。 卸载troublemaker字体无疑是一个简单的解决方案。

除了尝试/ catch阻止它之外,没有真正好的方法

 try { if (m_FontDialog.ShowDialog(frmMain.mainForm) == DialogResult.OK) { //Successful } } catch (Exception ex) { //Not a truetype font MessageBox.Show(frmMain.mainForm, ex.Message + Environment.NewLine + "Font not changed.", "Font Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } 

我不确定它是否可行,但尝试将FontDialog.AllowSimulations设置为false

您可以使用此处提供的自定义FontDialog来克服此exception。 它是用C#.Net开发的。