我有一个带有绘图部分的Windows.Form,它是:
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
有一个System.Windows.Forms.Control.Invalidate()方法,每50毫秒调用一次,删除绘制的所有内容并绘制所提出的内容:
System.Drawing.Graphics.DrawRectangle()
但我需要的是它不会删除以前绘制的所有内容,我只需要添加新的矩形。我应该用什么方法替换才能获得此功能?
答案 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()方法是您的演示者。
我希望这会有所帮助。