2014-01-07 29 views
0

我有一些困難與UserControl的子類使用滾動條。我使用DrawTools 2005(來自CodeProject)渲染中等尺寸的圖形(500條邊)。我給它添加了用H/V條滾動的可能性。現在我可以看到,使用水平滾動條時,圖形會如屏幕截圖所示出現亂碼。困惑的UserControl OnPaint與滾動條

我的問題是:如何在UserControl中實現繪圖,使用ScollBars的控件?

爲DrawTool 2005實用鏈接: http://www.codeproject.com/Articles/8494/DrawTools

要看到錯亂的樣子見下圖 http://arnault-bonafos.123siteweb.fr/311699731

代碼繪製如下所示:

private void CanvasArea_Paint(object sender, PaintEventArgs e) 
{ 
    //e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y); 

    SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 255));//Color.FromArgb(127, 127, 127)); //Color.FromArgb(255, 255, 255)); 

    e.Graphics.FillRectangle(brush, 
     this.ClientRectangle); 

    if (canvasDocument != null) 
    { 
     canvasDocument.Draw(e.Graphics); 
    } 
    brush.Dispose(); 
} 

作爲一個說明,我嘗試了使用或不使用TranslateTransform,但它導致了其他錯誤,如上圖所示。

不知道UserControl.Paint方法是否線程安全?

有人可以對此有所瞭解嗎?

+0

需要使用TranslateTransform()。有一些提示您勾住FrameRgn(),它不知道Graphics對象的狀態。你必須自己抵消該地區。請改用Graphics.DrawPath()。 –

+0

好的。我使用區域,因爲代碼使用CreateRoundRectRgn GDI函數,這個區域被框住,因爲你猜對了。我如何從CreateRoundRectRgn轉到圖形路徑? –

+0

只需使用GraphicsPath.AddArc和AddLine。 8行代碼不應該減慢你的速度。 –

回答

0

正如Hans Passant猜測的那樣,FrameRgn不受Graphics.TranslateTransform的影響。它需要重寫。 我需要與CreateRoundRectRgn相同的功能,下面的代碼提供了相同的功能。

public static GraphicsPath GetRoundedRectangle(Rectangle rect, int rad) 
    { 
     int d = 2 * rad; 
     System.Drawing.Drawing2D.GraphicsPath gp = 
       new System.Drawing.Drawing2D.GraphicsPath(); 

     gp.AddArc(rect.X, rect.Y, d, d, 180, 90); 
     gp.AddArc(rect.X + rect.Width - d, rect.Y, d, d, 270, 90); 
     gp.AddArc(rect.X + rect.Width - d, rect.Y + rect.Height - d, d, d, 0, 90); 
     gp.AddArc(rect.X, rect.Y + rect.Height - d, d, d, 90, 90); 

     return gp; 
    } 

有了這個,可以簡單地調用Graphics.DrawPath(gp);

再次感謝您的幫助。