使用带有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
方法是否是线程安全的?
有人可以对此有所了解吗?
答案 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);
再次感谢您的帮助。