2011-02-23 61 views
1

我有以下代碼:不能在循環中無效?

for(int I=0;I<10;I++) 
{ 
graphics.DrawImage(image, i*20,50); 
invalidate(); 
} 

,但它只是在循環後redrawns。爲什麼?

編輯:我正在做簡單的動作,並希望在每一步後更新。

+1

你爲什麼在意?繪製每幅圖像需要很長時間嗎? – 2011-02-23 11:32:15

+1

你在問錯誤的問題。我不會在這樣的循環中進行更新。告訴我們你真正想要達到的目標,我們會給你一個替代解決方案。 – jgauffin 2011-02-23 11:35:34

回答

4

因爲Invalidate不會立即重新繪製,它只是告訴所需要重繪。方法完成後,程序再次空閒時,將執行重繪。

快速和骯髒的解決方案是Invalidate調用後添加Application.DoEvents(),但我會建議重寫邏輯使用計時器或類似的東西,而不是使用循環動畫​​。

+0

Acutally它的剛剛處理的運動。 for循環移動敵人。 – FlyBoy 2011-02-23 11:40:09

+0

無論如何,通過添加一個表示框架的計時器,您將能夠避免hacky Application.DoEvents,並具有更一致的幀率。正如所寫,您的程序將會盡可能快地繪製這10幀,然後取決於您正在運行的CPU的速度。 – 2011-02-23 11:47:12

4

因爲它處於一個緊密的循環中,所以直到循環結束後纔會真正處理重繪。你可以迫使它由就像所以無效後加入Application.DoEvents()雖然處理重繪消息:

for(int I=0;I<10;I++) 
{ 
    graphics.DrawImage(image, i*20,50); 
    invalidate(); 
    Application.DoEvents(); 
} 
+0

比我快+1 +1 – 2011-02-23 11:31:19