2012-07-30 81 views
1

這裏繪製圖紙是我的代碼我需要擦除循環

while (true) 
{ 
    gg = this.CreateGraphics(); 
    b1 = new SolidBrush(Color.Red); 
    b2 = new SolidBrush(Color.Blue); 
    p1 = new Pen(Color.Red); 

    neuron.transferFunction_output(); 
    for (int i = 0; i < 10; i++) 
    { 
     if (neuron.layer2[i] == 1) 
     { 
      gg.FillEllipse(b1, ox1 - 100 * i, oy2, (float)20, (float)20); 
      for (int j = 0; j < 10; j++) 
      { 
       gg.DrawLine(p1, ox1 - 100 * i, oy2, ox1 - 100 * (float)j, oy3); 
      } 
     } 
     else 
     { 
      gg.FillEllipse(b2, ox1 - 100 * i, oy2, (float)20, (float)20); 
     } 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     if (neuron.layer3[i] == 1) 
     { 
      gg.FillEllipse(b1, ox1 - 100 * i, oy3, (float)20, (float)20); 
      for (int j = 0; j < 10; j++) 
      { 
       gg.DrawLine(p1, ox1 - 100 * i, oy3, ox1 - 100 * (float)j, oy4); 
      } 
     } 
     else 
     { 
      gg.FillEllipse(b2, ox1 - 100 * i, oy3, (float)20, (float)20); 
     } 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     if (neuron.layer4[i] == 1) 
     { 
      gg.FillEllipse(b1, ox1 - 100 * i, oy4, (float)20, (float)20); 
      for (int j = 0; j < 10; j++) 
      { 
       gg.DrawLine(p1, ox1 - 100 * i, oy4, ox1 - 100 * (float)j, oy5); 
      } 
     } 
     else 
     { 
      gg.FillEllipse(b2, ox1 - 100 * i, oy4, (float)20, (float)20); 
     } 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     if (neuron.layer5[i] == 1) 
     { 
      gg.FillEllipse(b1, ox1 - 100 * i, oy5, (float)20, (float)20); 
     } 
     else 
     { 
      gg.FillEllipse(b2, ox1 - 100 * i, oy5, (float)20, (float)20); 
     } 
    } 
    Thread.Sleep(1000); 
    Application.DoEvents(); 
}//end while 

現在我想抹在loop.Means我不需要證明最近的畫圖,在最後繪製早些時候提出的圖紙迭代。如果我使用Graphics.clear(Color.SomeColor),那麼整個背景顏色在每次迭代後都會改變,我不想這樣做。其次,如果聲明一個方法在同一軌道上繪製相同的線條,但用白色(意味着作爲橡皮擦的一種方法)繪製相同的線條,那麼我的代碼會變得太長,並且其記憶需要花費時間,因爲我必須在我的代碼中使用Thread.Sleep()由於某些原因。 有沒有其他的方法可以清除最後的圖紙? 感謝有關

回答

4
while(true) { 
    var g = someControl.CreateGraphics(); 
    draw(g); 
} 

這種結構不會像人們希望的那樣工作。這就是爲什麼你需要在循環中調用DoEvents();你正在阻止消息泵。此外,您可以撥打CreateGraphics()並在OnPaint處理程序外進行繪製,因此當窗口執行刷新時,您繪製的任何內容都將被刪除。

您應將所有繪圖代碼移動到OnPaint處理程序中。這會給你一個新的表面,以便在你需要的時候繪製(請致電Invalidate()強制重新繪製),並使你符合Windows消息泵,因此你可以將該呼叫移除(討厭)DoEvents()。你仍然可以用這種方式進行動畫製作,並且你的代碼變得更簡單

您可以更新循環中的邏輯交互,並在準備繪製屏幕時調用Invalidate()

我會建議一些閱讀:The Windows Message Loop.

+0

這被稱爲「遊戲循環」。需要一些工作。 – 2012-07-30 17:29:38

+2

@HansPassant:遊戲循環不需要在OnPaint處理程序之外執行繪製(但您當然知道這一點......我不確定您是否意味着我的響應需要某些工作或OP的代碼)。 – 2012-07-30 17:30:56

+0

但是當我寫this.createGraphics()然後編譯器這應該是一個初始化。其次,請稍微解釋一下「OnPaint」處理程序。坦率地說,我第一次聽到這個消息 – 2012-07-30 17:36:51