这是一个控件的 OnPaint 方法,它简单地从控件继承并提供一个属性来获取/设置 textrenderinghint:
Private _mode as TextRenderingHint = SystemDefault.
Public Property Mode as TextRenderingHint
Get & Set _mode
...
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim g = e.Graphics
Dim savMode = g.Save
g.TextRenderingHint = Me._mode
g.DrawString(Me.Text, Me.Font, Brushes.Black, 0, 0)
g.Restore(savMode)
MyBase.OnPaint(e)
End Sub
现在,如果您将其中两个放置在表单上,将第一个保留为默认值并将第二个更改为 AntiAlias,它在设计时看起来不错,但是当您运行应用程序时,第一个标签的呈现模式已更改。就好像 DrawString 方法改变了系统默认值一样。
这里有一些观察:
(1) 如果我明确地将第一个控件的模式设置为 ClearTypeGridFit,这与我的默认设置相同,它可以解决问题。
(2) 如果您在窗体上放置第三个控件并保留默认模式,则可以解决问题。
(3) TextRenderer.DrawText 没有复制问题。
(4) 如果我继承标签控件并重写 onpaint 方法来设置渲染模式,即使我设置了 UseCompatibleTextRendering 也不会复制问题 - 这会强制标签使用 DrawString 而不是 DrawText 渲染。
我在 XP 上启用了 cleartype 并使用了 Visual Studio 2008 Express Edition。
ETA:我在 C# 中尝试过,同样的事情发生了