使用System.Drawing.Graphics的Invalidate方法重绘问题

时间:2013-02-03 19:35:45

标签: c# repaint

我有一个带有绘图部分的Windows.Form,它是:

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

有一个System.Windows.Forms.Control.Invalidate()方法,每50毫秒调用一次,删除绘制的所有内容并绘制所提出的内容:

System.Drawing.Graphics.DrawRectangle()

但我需要的是它不会删除以前绘制的所有内容,我只需要添加新的矩形。我应该用什么方法替换才能获得此功能?

1 个答案:

答案 0 :(得分:0)

无效表示您的绘画区域不再有效。 即,如果用户调整窗口大小和所有绘图比例 应该对该事件作出反应,或者是否应删除某些事件 你的绘画虽然是在其他东西等等.. 因此,假设您想要对“无效”做出反应,这是合乎逻辑的。 你需要删除该区域,所有内容都应该重新绘制。

所以 - 已经解释过,但你真正需要的是一些数组 包含绘制和使用无效的元素 绘制它们..即:(我将用伪代码编写)

List<Shape> Shapes = new List<Shape>();

ctor:
Shapes.Add(rect1);
Shapes.Add(rect2);
...
and so on..

void some_user_incoming_event(){
    shapes.Add(rect200);
    Invalidate();
}

public void Invalidate()
{
    foreach(var shape in shapes) {code to draw specific shape}  
}

如果你使用这种策略,你会得到你想要的结果 如上面笔记中提到的这个答案 - 你需要停下来 调用每x个msecs无效..否则你会看到闪烁。 而不是 - 你需要每次手动调用Invalidate 已经改变了。

这种策略也被称为MVP(模型 - 视图 - 演示者)所在 列表是您的模型,您的图形区域是您的视图, 并且您的Invalidate()方法是您的演示者。

我希望这会有所帮助。