0

我需要增强一个旧版 WinForms 应用程序以支持应用程序表单中 TextRenderingHint 设置的继承。

为简单起见,假设我们有一个带有System.Drawing.Text.TextRenderingHint类型的 TextRenderingHint 属性的主窗体。此属性指定主窗体中的文本质量,并且必须在从此主窗体调用的对话框窗体中继承。主窗体中的文本是使用Graphics.DrawString方法绘制的,支持主窗体的TextRenderingHint属性的各种设置是没有问题的(其实就是在用Graphics.DrawString绘制文本之前简单的赋值给Graphics.TextRenderingHint)

问题是其中一个对话框的界面基于 WinForms ToolStrip 组件,我需要在其项目中重新定义文本绘制以支持主窗体的 TextRenderingHint 设置。

在网上搜索并分析了反射器应用程序中ToolStripRenderer类的源代码后,我得出的结论是,实现我需要的最佳方法是使用自定义 ToolStrip 渲染器和重新定义的OnRenderItemText方法。

我在 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 方法“只是”调用TextRenderer.DrawText并且理论上我的想法可以工作。不幸的是,实际上这仅适用于 TextRenderingHint.ClearTypeGridFit 选项 - 至少在我的开发电脑上。

我现在看到的唯一可行的想法是完全重写 OnRenderItemText 并在里面使用 Graphics.DrawString。我对吗?我的问题还有其他解决方案吗?

更新 #1。我在尝试基于 Graphics.DrawString 重新实现 OnRenderItemText 时遇到了问题。看来,不可能将传递给 TextRenderer.DrawText(TextFormatFlags枚举)的文本格式标志转换为StringFormatClass参数 Graphics.DrawString 期望的......

更新#2。ToolStripRenderer 类中 OnRenderItemText 方法的默认实现如下:

在此处输入图像描述

4

0 回答 0