具有图形转换的文本呈现器

本文关键字:文本 图形 转换 | 更新日期: 2023-09-27 17:57:24

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

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 调用使用的"默认"分辨率与图形对象具有的分辨率不同。这意味着您必须调整自动滚动坐标,以尊重图形对象分辨率与"默认"GDI 分辨率之间的差异。