2013-02-03 69 views
0

的Invalidate方法我有一個繪圖部分,這是一個Windows.Form:重繪問題與System.Drawing.Graphics

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

有一個System.Windows.Forms.Control.Invalidate()方法被稱爲每隔50毫秒消除一切被吸入並提請任何被要求用:

System.Drawing.Graphics.DrawRectangle() 

但我需要的是,它不會刪除所有以前繪製的,我只需要它來添加新長方形。我應該更換哪種方法來獲得此功能?

+0

我會擺脫自動調用失效。在其OnPaint事件中執行所有Form的繪畫。如果其他操作需要立即重繪,則調用Invalidate。 – mbeckish

+0

我有OnPaint事件,這是DrawRectangle方法的地方。問題是,當我調用DrawRectangle方法時,窗口「刷新」,但是當調用Invalidate方法時。 –

回答

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。

這種策略也被稱爲MVP(模型 - 視圖 - 主持人),其中 名單是你的模型,你的圖形面積是你的看法, 和您的invalidate()方法是您的主持人。

我希望這會有所幫助。