C# 滚动GDI+;对象

C# 滚动GDI+;对象,c#,winforms,gdi+,C#,Winforms,Gdi+,下面是一个例子,在绘制形状和线条部分,有一个简单的例子,在滚动窗口中绘制填充矩形、填充椭圆和填充线。它似乎工作正常,但当我向下滚动并备份时,它无法正常滚动,如图所示: OnPaint方法是: protected override void OnPaint(PaintEventArgs e) { Graphics dc = e.Graphics; Point ScrollOffset = this.AutoScrollPosition;

下面是一个例子,在绘制形状和线条部分,有一个简单的例子,在滚动窗口中绘制填充矩形、填充椭圆和填充线。它似乎工作正常,但当我向下滚动并备份时,它无法正常滚动,如图所示:

OnPaint
方法是:

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics dc = e.Graphics;
        Point ScrollOffset = this.AutoScrollPosition;
        dc.TranslateTransform(ScrollOffset.X, ScrollOffset.Y);
        if (e.ClipRectangle.Top + ScrollOffset.X < 350 || 
            e.ClipRectangle.Left + ScrollOffset.Y < 250)
        {
            dc.DrawRectangle(BluePen, rectangleBounds);
            dc.FillRectangle(CrossBrush, rectangleBounds);
            dc.DrawEllipse(RedPen, ellipseBounds);
            dc.FillEllipse(SolidAzureBrush, ellipseBounds);
            dc.DrawLine(BrickWidePen, rectangleBounds.Location, ellipseBounds.Location + ellipseBounds.Size);
        }
        base.OnPaint(e);
    }
protected override void OnPaint(PaintEventArgs e)
{
图形dc=e.图形;
点滚动偏移=this.AutoScrollPosition;
TranslateTransform(ScrollOffset.X,ScrollOffset.Y);
如果(e.ClipRectangle.Top+ScrollOffset.X<350 | |
e、 ClipRectangle.Left+scrollpoffset.Y<250)
{
dc.DrawRectangle(蓝色笔,矩形边界);
dc.FillRectangle(交叉、矩形边界);
dc.抽屉(红笔、椭圆笔);
dc.填充椭圆(实心蓝刷、椭圆盒);
dc.抽绳(BrickWidePen,矩形边界。位置,椭圆盒。位置+椭圆盒。大小);
}
基础漆(e);
}
(如果有必要,可以在上面链接的页面上看到代码的其余部分)


如果我最小化并还原它,则会修复问题,因此看起来OnPaint方法没有在正确的时间被调用(是否在调用的
OnPaint
方法和实际发生的绘制之间滚动窗口?)。那么,我应该如何处理油漆,这样滚动就不会损坏图像?

e.Graphics.Clear(Color.White)然后重新绘制所有内容,以消除您的if条件。确保您有
this.DoubleBuffered=true
在窗体的构造函数中。如果
,只需删除
就足够了。首先导致
WM_PAINT
消息的窗口失效(进而导致调用
OnPaint()
)通常也会导致背景刷新,清除要重画的区域。当然,如果没有可靠地再现问题的良好工具,就不可能确切地知道需要什么来解决问题。如果您仍然无法使问题发挥作用,请改进该问题。(不,链接到其他充满代码的页面不是一个好主意)。
e.Graphics.Clear(Color.White)然后重新绘制所有内容,以消除您的if条件。确保您有
this.DoubleBuffered=true
在窗体的构造函数中。如果
,只需删除
就足够了。首先导致
WM_PAINT
消息的窗口失效(进而导致调用
OnPaint()
)通常也会导致背景刷新,清除要重画的区域。当然,如果没有可靠地再现问题的良好工具,就不可能确切地知道需要什么来解决问题。如果您仍然无法使问题发挥作用,请改进该问题。(不,链接到其他充满代码的页面并不好)。