这是一个控件的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方法改变了systemdefault一样。
以下是一些观察结果:
(1)如果我明确地将第一个控件的模式设置为ClearTypeGridFit,这与我的情况下的默认模式相同,则修复了问题。
(2)如果您在表单上放置第三个控件并保持默认模式,则可以解决问题。
(3)TextRenderer.DrawText不会复制问题。
(4)如果我继承标签控件并覆盖onpaint方法来设置渲染模式,即使我设置了UseCompatibleTextRendering,也不会复制问题 - 这会强制标签使用DrawString而不是DrawText进行渲染。
我在XP上启用了cleartype并使用了visual studio 2008 express edition。
ETA:我在C#中尝试过,同样的事情发生了
答案 0 :(得分:1)
这听起来像我们之前遇到过的问题。在您的应用启动代码中,是否有对Application.SetCompatibleTextRenderingDefault(true)的调用? (或者它可能被设置为假,我忘了)。
如果是这样,切换该bool的状态以更改文本呈现模式,它应该按预期工作。
答案 1 :(得分:0)
我有类似的问题。我打电话给:
Image i = new Bitmap(size, size);
Graphics g = Graphics.FromImage(i);
// When this line is uncommented TextRenderingHint is broken for ALL other Graphics-Objects.
// Setting "g.TextRenderingHint" later works sometimes in unpredictable ways.
//g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
...
我的启动代码如下所示:
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
然后我尝试了Judah Himango的建议,一切正常。
所以请务必致电:
Application.SetCompatibleTextRenderingDefault(true);
为我工作!