3

这是一个控件的 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# 中尝试过,同样的事情发生了

4

2 回答 2

1

这听起来像我们之前遇到的问题。在您的应用启动代码中,是否调用了 Application.SetCompatibleTextRenderingDefault(true)?(或者它可能被设置为假,我忘了)。

如果是这样,请切换该布尔的状态以更改文本呈现模式,它应该可以按预期工作。

于 2010-10-01T19:33:34.793 回答
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);

为我工作!

于 2011-11-13T11:58:57.323 回答