【问题标题】:C# Setting FontDialog to only display TrueType fontsC# 将 FontDialog 设置为仅显示 TrueType 字体
【发布时间】:2011-06-10 05:46:37
【问题描述】:

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

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

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

【问题讨论】:

  • 实现自己的字体选择器有多难。最重要的选项可能需要几个小时,但不应需要数周。
  • @David 这真的取决于他用它做什么。

标签: c# fonts gdi+ mschart truetype


【解决方案1】:

FontDialog 类已经这样做了,它使用带有 CF_TTONLY 选项的 ChooseFont() API 调用。这会强制对话框仅显示标榜自己为 TrueType 字体的字体。链接表明,对话框周围有字体,直到今天才听说过。这使得它非常罕见,但肯定不会出乎意料,周围有很多带有错误元数据的垃圾字体。

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

【讨论】:

  • 谢谢汉斯。我正在运行 Win7 x64,只安装了 Adob​​e Photoshop 和 Mathematica 字体;其余的都是股票字体。我大约一半的字体导致了这个异常,所以很遗憾,卸载麻烦的字体不是一种选择。
【解决方案2】:

除了尝试/捕获阻止它之外,没有真正好的解决方法

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);
}

【讨论】:

  • 除非这不是可捕获的异常!
  • @Ozzah:“不可捕获的异常”是什么意思?捕获工作正常。这是否意味着你不应该抓住它?
  • @Binus 无法捕获异常:就像 StackOverflowException。如果您将代码放在 try/catch 中,则不会发生任何事情 - 异常仍然发生并且程序仍然崩溃。
  • @Ozzah:也许有不止一个类似的问题。我今天能够使用以下字体重现所描述的行为:Galette。我获得了 ArgumendException,可以毫无问题地捕获它。通知用户所选字体不起作用只是一种愚蠢的做法。在选择之前过滤掉这些字体会更好。
【解决方案3】:

您可以使用可用的自定义 FontDialog here 来克服此异常。它是用 C#.Net 开发的。

【讨论】:

  • 到目前为止,MS 还没有解决这个错误。某些 TTF 字体会触发异常,告诉它们不是 TTF。这个自定义 FontDialog 比默认的 FontDialog 要好得多!它不仅解决了这个问题,而且还可以正确处理像“Noto Sans SemCond SemBd”这样的长字体名称。默认的 FontDialog 在重新打开时会忘记该名称。它有斜体、粗体和删除线的复选框。不过,我必须为“确定”按钮添加一个标志,这样我才能看到我没有点击“取消”。
【解决方案4】:

我不确定它是否会起作用,但请尝试将FontDialog.AllowSimulations 设置为false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2010-12-28
    • 2012-07-18
    • 2013-05-25
    • 1970-01-01
    • 2015-02-01
    • 2015-08-12
    • 2013-05-06
    相关资源
    最近更新 更多