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()
)通常也会导致背景刷新,清除要重画的区域。当然,如果没有可靠地再现问题的良好工具,就不可能确切地知道需要什么来解决问题。如果您仍然无法使问题发挥作用,请改进该问题。(不,链接到其他充满代码的页面并不好)。