这是我的代码
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
现在我想要擦除循环中先前制作的图纸。我不需要显示上一次迭代中绘制的最后一张图。如果我使用Graphics.clear(Color.SomeColor)
,那么整个背景颜色会在每次迭代后发生变化,并且我不想这样做。其次,如果声明一个方法在同一轨道上绘制相同的线但是用白色(意味着一个用作橡皮擦的方法)的方法,那么我的代码会变得太长以及它的记忆和时间,因为我必须使用{{1}在我的代码中由于某些原因。
有没有其他方法可以删除最后一张图纸?
谢谢你
答案 0 :(得分:4)
while(true) {
var g = someControl.CreateGraphics();
draw(g);
}
这种结构不会像人们希望的那样好用。这就是你需要在循环中调用DoEvents()
的原因;你阻止了消息泵。此外,您调用CreateGraphics()
并在OnPaint
处理程序之外绘制,因此当窗口执行刷新时,您绘制的任何内容都将被删除。
您应该将所有绘图代码移动到OnPaint
处理程序中。这将为您提供一个新的表面,以便在每次需要时绘制(调用Invalidate()
强制重新绘制)并使您与Windows消息泵保持一致,这样您就可以删除该调用(讨厌)DoEvents()
。您仍然可以通过这种方式设置动画,并且您的代码变得更简单。
您可以更新循环中的逻辑交互,并在准备好绘制屏幕时调用Invalidate()
。
我建议阅读一下:The Windows Message Loop.