我需要把画成环状的画擦掉

  • 本文关键字: c# graphics drawing
  • 更新时间 :
  • 英文 :


这是我的代码

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),那么每次迭代后整个背景颜色都会发生变化,我不想这样做。其次,如果声明一个方法在与前面相同的轨道上绘制相同的线,但使用白色(意味着一个用作橡皮擦的方法),那么我的代码会变得太长,占用内存和时间,因为由于某些原因,我不得不在代码中使用Thread.Sleep()。有没有其他方法可以擦除最后一幅画?感谢

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

这种结构不会像人们所希望的那样奏效。这就是为什么您需要在循环中调用DoEvents();你正在阻塞消息泵。此外,您调用CreateGraphics()并在OnPaint处理程序之外进行绘制,因此当窗口执行刷新时,您绘制的任何内容都将被擦除。

您应该将所有绘图代码移动到OnPaint处理程序中。这将为您提供一个新的曲面,以便在每次需要时绘制(调用Invalidate()强制重新绘制),并使您与Windows消息泵保持一致,因此您可以删除对(讨厌的)DoEvents()的调用。您仍然可以通过这种方式设置动画,并且您的代码变得更简单。

您可以更新循环中的逻辑交互,并在准备绘制屏幕时调用Invalidate()

我建议大家读一读:Windows消息循环。

相关内容

  • 没有找到相关文章

最新更新