Puzzled UserControl OnPaint с полосами прокрутки

У меня есть трудности с использованием полос прокрутки с подклассом 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 ответ

Как полагает Ханс Пассант, 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);

Еще раз, спасибо за помощь.

licensed under cc by-sa 3.0 with attribution.