c# - 我需要删除循环绘制的图形

标签 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()

我建议阅读:The Windows Message Loop.

关于c# - 我需要删除循环绘制的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11726331/

相关文章:

Android - 触摸绘图

c# - 在 Xamarin 项目中使用 Entity.FrameworkCore.Sqlite 时找不到程序集 'System.Memory'

c# - 为什么我有时会在 ?. 之后得到 Null 引用异常。查看?

Java Swing : drawLine very slow

r - 在 R rgl 轴标签中使用 "expression"

HTML 5 Canvas 开源绘图工具集 API?

java - 在java Graphics2D中绘制曲线

c# - 将变量值和输出从 PL/SQL 代码块返回到 C#

c# - 放大 ListView 内容而不缩放滚动条

java 图形 - 具有两种颜色的形状