TextRenderer with Graphics变换

我一直在研究自定义控件,我遇到了一个问题,TextRenderer的表现有些令人惊讶。 在我的OnPaint事件中,我将变换应用于Graphics对象以补偿滚动位置,如下所示:

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); 

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

这是我对此的最佳猜测: TextRenderer.DrawText是基于GDI的,因此取决于分辨率。 Graphics.DrawString是GDI +,因此与分辨率无关。 另见本文 。

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