2014-01-07 3 views
0

У меня есть трудности с использованием полос прокрутки с подклассом UserControl. Я использовал DrawTools 2005 (из CodeProject) для рендеринга средних размеров (500 ребер). Я добавил к ней возможность прокрутки с помощью H/V-баров. Теперь я вижу, что использование горизонтальной полосы прокрутки искажается, как показано на экране.Puzzled 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(); 
} 

В качестве примечания я пробовал как с , так и без него, но это приводит к другой ошибке, как показано на картинке в предыдущей ссылке.

Интересно, если метод UserControl.Paint является потокобезопасным или нет?

Может ли кто-то пролить свет на это?

+0

Использование TranslateTransform() не требуется. Есть некоторый намек на то, что вы вызываете FrameRgn(), он не знает о состоянии объекта Graphics. Вам придется компенсировать регион самостоятельно. Вместо этого используйте Graphics.DrawPath(). –

+0

Хорошо. Я использую Region, потому что в коде используется функция CreateRoundRectRgn GDI, этот регион был оформлен, как вы уже догадались. Как я могу перейти от CreateRoundRectRgn к графическому пути? –

+0

Просто используйте GraphicsPath.AddArc и AddLine. 8 строк кода не должны мешать вам. –

ответ

0

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

Снова благодарим за помощь.

Смежные вопросы