2011-05-24 24 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