我需要增强一个旧版WinForms应用,以支持在应用表单中继承TextRenderingHint设置。
为简单起见,我们假设我们的主窗体具有System.Drawing.Text.TextRenderingHint类型的TextRenderingHint属性。此属性指定主窗体中的文本质量,并且必须在从此主窗体调用的对话框窗体中继承。主窗体中的文本是使用Graphics.DrawString方法绘制的,并且支持主窗体的TextRenderingHint属性的各种设置没有问题(实际上,它之前只是分配给Graphics.TextRenderingHint使用Graphics.DrawString绘制文本。
问题是其中一个对话框的界面基于WinForms ToolStrip组件,我需要在其项目中重新定义文本绘图以支持主窗体的TextRenderingHint设置。
在搜索互联网并分析反射器应用程序中ToolStripRenderer类的源代码后,我得出的结论是,实现我需要的最佳方法是使用自定义的ToolStrip渲染器和重新定义的{ {3}}方法。
我在ToolStripRenderer类的OnRenderItemText方法的默认实现中找到了以下代码(请参阅我问题底部的完整代码):
graphics2.TextRenderingHint = TextRenderingHint.AntiAlias
TextRenderer.DrawText(graphics2, text, textFont, New Rectangle(Point.Empty, size), color, textFormat)
,这让我想到我可以尝试通过从ToolStripRenderer派生的类中的OnRenderItemText的这个简单实现来解决我的问题:
Protected Overrides Sub OnRenderItemText(e As ToolStripItemTextRenderEventArgs)
e.Graphics.TextRenderingHint = _MainFormTextRenderingHint
MyBase.OnRenderItemText(e)
End Sub
我的想法是基于以下事实:如果我们不在ToolStrip项目中使用垂直文本(我们不会),那么基本的OnRenderItemText方法"只是"调用OnRenderItemText,理论上我的想法可行。不幸的是,在实践中,这仅适用于TextRenderingHint.ClearTypeGridFit选项 - 至少在我的开发者电脑上。
我现在看到的唯一可行的想法是完全重写OnRenderItemText并在里面使用Graphics.DrawString。我对吗?我的问题还有其他解决方案吗?
更新#1 。我在尝试基于Graphics.DrawString重新实现OnRenderItemText时遇到了问题。看来,将传递给TextRenderer.DrawText(TextRenderer.DrawText枚举)的文本格式标志转换为TextFormatFlags参数Graphics.DrawString期望...
是不可能的。更新#2 。 ToolStripRenderer类中OnRenderItemText方法的默认实现如下: