2011-05-24 61 views
3

我一直在处理自定义控件,并且遇到了令人惊讶的TextRenderer问题。在我的OnPaint事件我应用变换的图形对象,以弥补这样滚动条的位置:带图形变换的TextRenderer

e.Graphics.Transform = new System.Drawing.Drawing2D.Matrix(1, 0, 0, 1, this.AutoScrollPosition.X, this.AutoScrollPosition.Y); 

然后我通过图形对象来控制的所有子元素,让他们自己画上它。其中一个元素应该将文本字符串绘制到图形表面上。这是我遇到问题的地方。这条线似乎滚动时正常工作:

e.Graphics.DrawString(this.Text, this.Font, brush, new PointF(this.Rectangle.X, this.Rectangle.Y)); 

但是,当我使用TextRenderer我得到一个完全不同的结果。下面是应该绘制文字的文本行:

TextRenderer.DrawText(e.Graphics, this.Text, this.Font, this.Rectangle, this.TextColor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.PreserveGraphicsTranslateTransform); 

我认为这两行应该产生相同的结果。但由于某些原因,第二个应用图形转换的方式不同,因此,当我滚动控件时,所有文本行以不同于绘图表面上其余元素的速度移动。有人能解释我为什么会发生这种情况吗?

+0

您是否尝试过使用'e.Graphics.TranslateTransform(this.AutoScrollPosition.X,this.AutoScrollPosition.Y)'而不是2d矩阵?它不应该真的有什么区别,但是接下来,'TextRenderer'也应该可以正常工作... – takrl 2011-05-24 08:07:16

+0

@takrl没有帮助:(对我来说仍然有不同的变化 – 2011-05-24 08:11:22

回答

10

这里是我最好的猜测:TextRenderer.DrawText是基于GDI的,因此依赖于分辨率。 Graphics.DrawString是GDI +,因此分辨率无关。另请参阅this article

既然你说文本“以不同的速度移动”,可能会发生的情况是GDI调用使用与Graphics对象不同的“默认”分辨率。这意味着你不得不调整你的AutoScrollCoordinates来尊重你的图形对象分辨率和“默认”GDI分辨率之间的差异。

+0

这实际上是有道理的,我也注意到了它们在测量字符串时都会返回不同的值,我想这可能是其原因。 – 2011-05-24 08:40:55

+0

出于好奇 - 文本的大小是否与预期的不同? – takrl 2011-05-24 11:02:52

+0

那么,我试图绘制相同的字符串使用这两种方法,似乎它们有点不同 – 2011-05-25 07:31:41