使用Graphics.TextRenderingHint和TextRenderer.DrawText在ToolStripItem

时间:2017-12-19 12:20:38

标签: winforms antialiasing text-rendering toolstripitem textrenderer

我需要增强一个旧版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方法的默认实现如下:

StringFormatClass

0 个答案:

没有答案