您见过这样的例外吗?
System.ArgumentException: Only TrueType fonts are supported. This is not a TrueType font.
at System.Drawing.Font.FromLogFont(Object lf, IntPtr hdc)
at System.Windows.Forms.FontDialog.UpdateFont(LOGFONT lf)
at System.Windows.Forms.FontDialog.RunDialog(IntPtr hWndOwner)
at System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
使用System.Windows.Forms.FontDialog组件时,会抛出此异常,然后选择一个无效的字体。而且您不能对此做任何事情,因为这个例外是用FontDialog的私人方法埋葬的,并且无法处理。
由于该错误已经存在了多年,但鉴于Windows表单在Microsoft的优先级列表中并不完全很高,因此我怀疑它永远不会被修复。这是我宁愿不重塑的轮子,但是……无论如何,这是。
我实际上还没有设法找到导致这种类型崩溃的字体,尽管我收到了很多经历的用户的自动错误报告。如果您知道可以下载的字体,请让我知道,以便我自己测试。我认为我的版本解决了问题,但是在这一点上,我实际上并不确定。
Cyotek.Windows.Forms.FontDialog组件是替换原始System.Windows.Forms.FontDialog的下降,但是在选择非真实类型字体时不会发生崩溃。
此版本使用ChooseFont的本机Win32对话框 - 处理Apply事件的挂钩过程,隐藏颜色组合已直接从原始的托管组件中获取。
在此存储库的一个分支之一中,还有一个完全管理的解决方案。这是不完整的,主要是因为我无法确定哪些字体被设置隐藏了,以及如何使用非标准样式(例如光)结合家庭。它本身仍然很有趣,展示了如何使用EnumFontFamiliesEx等,但是目前,随着正在进行的工作,它已经搁置了。
有一个Nuget软件包。
pm> install-package cyotek.windows.forms.fontdialog
FontDialog组件是根据MIT许可证获得许可的。有关全文,请参见LICENSE.txt 。
有关此控件的更多信息,请参见Cyotek.com上标记为fontdialog的文章。