2012-07-30 80 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