用滚动条困惑的UserControl OnPaint

时间:2014-01-07 20:59:31

标签: c# windows user-controls

使用带有UserControl子类的滚动条时遇到一些困难。我使用DrawTools 2005(来自CodeProject)来渲染中等大小的图形(500个边缘)。我添加了使用H / V条滚动的可能性。现在我可以看到,使用水平滚动条,绘图会出现乱码,如屏幕截图所示。

我的问题是:如何在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方法是否是线程安全的?

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分: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);

再次感谢您的帮助。