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

本文关键字:问题 方法 Invalidate Drawing Graphics System | 更新日期: 2023-09-27 17:57:40

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

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

有一个System.Windows.Forms.Control.Invalidate()方法,它每50毫秒调用一次,擦除所绘制的所有内容,并使用绘制所需内容

System.Drawing.Graphics.DrawRectangle()

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

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

无效表示您的绘制区域不再有效。。即,如果用户调整了窗口的大小和您所有的绘图比例应该对该事件做出反应,或者是否应该从当你的画在其他东西上时等等。。因此,如果你想对"无效"做出反应,那么这是合乎逻辑的你需要删除这个区域,所有的东西都应该重新绘制。

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

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毫秒调用一次invalide。。否则你会看到闪烁。相反,您需要每次手动调用Invalidate已经改变。

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

我希望这能有所帮助。