0

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

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

有一个 System.Windows.Forms.Control.Invalidate() 方法,每 50 毫秒调用一次,擦除绘制的所有内容并绘制任何被询问的内容:

System.Drawing.Graphics.DrawRectangle()

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

4

1 回答 1

0

无效意味着您的绘画区域不再有效..即,如果用户调整了窗口的大小并且您的所有绘图比例都应该对该事件做出反应,或者如果应该从您的绘图中删除某些东西,而它在其他东西之上等等。所以假设如果您想对“无效”做出反应,则需要删除该区域并重新绘制所有内容是合乎逻辑的。

所以 - 这已经解释过了,但你真正需要的是一些数组,它包含你需要绘制的元素并使用 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 毫秒调用一次 invalidate .. 否则您会看到闪烁。取而代之的是-每次发生更改时,您都需要手动调用 Invalidate 。

这种策略也称为 MVP (model-view-presenter),其中 List 是您的模型,您的图形区域是您的视图,您的 Invalidate() 方法是您的 Presenter。

我希望这有帮助。

于 2013-02-03T20:05:33.060 回答