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

本文关键字:显示 TrueType 字体 FontDialog 设置 | 更新日期: 2023-09-27 17:58:46

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

我想显示FontDialog,这样用户就可以更改Chart上的字体,但如果用户选择了非TrueType字体,则会引发异常。GDI+只能处理TrueType字体。

如何从FontDialog中筛选不能与GDI+一起使用的字体?

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

FontDialog类已经完成了这项工作,它使用带有CF_TTONLY选项的ChooseFont()API调用。这将强制对话框仅显示标榜为TrueType字体的字体。链接表明,周围有一些字体可以愚弄对话框,直到今天才听说过。这使得它非常罕见,但当然也不意外,周围有很多垃圾字体和糟糕的元数据。

您无法捕获异常,它是在.NET框架中烘焙的回调函数中引发的。重写课程是一种选择,但不是一种愉快的选择。卸载麻烦制造者字体当然是一个简单的解决方案。

除了尝试/捕获阻止之外,没有真正好的方法来解决这个问题

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来克服此异常。它是在C#.Net中开发的。

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