c#同时绘制多个圆圈

时间:2014-01-05 11:08:29

标签: c# charts

我尝试构建自己的极坐标图。我使用函数绘制点如下:

private void drawPoints()
{
    this.SuspendLayout();
    Graphics g = this.CreateGraphics();

    int i = 0;
    foreach (Point Pointaktuell in PointList)
    {
        int radius = 15;

        Brush b = new SolidBrush(Color.Red);

        g.FillEllipse(b, (int)(Pointaktuell.X - radius / 2.0), (int)(Pointaktuell.Y - radius / 2.0), radius, radius);
        i++;
    }
    PointList.Clear();
    this.ResumeLayout();
}

问题是 points 是一个接一个地绘制,需要很多时间。我怎样才能一次性绘制它们?

2 个答案:

答案 0 :(得分:2)

优化绘图程序,请尝试在外部循环中添加更多代码。不要忘记关闭IDisposable

private void drawPoints() 
{
    SuspendLayout();

    try 
    {
        using (Graphics g = CreateGraphics()) 
        {
            int i = 0; 
            int radius = 15;

            using (b = new SolidBrush(Color.Red)) 
            {
                foreach (Point Pointaktuell in PointList) 
                {
                    g.FillEllipse(b, (int)(Pointaktuell.X - radius / 2.0), (int)(Pointaktuell.Y - radius / 2.0), radius, radius);
                    i += 1;
                }
            }
        }
   }
   finally { ResumeLayout(); }
}

答案 1 :(得分:0)

在每个循环步骤中实例化一个新的SolidBrushradius每次都被重新定义。实例化对象不会调用Dispose()例程(对Graphics来说很重要)

您可以尝试以下操作;

private void drawPoints()
{
    this.SuspendLayout();

    const int radius = 15;
    using (Graphics g = this.CreateGraphics())
    {
        //if (g == null) { this.ResumeLayout(); return; } // # Uncomment this line if you want defensive checks
        using (Brush b = new SolidBrush(Color.Red))
        {
            for (int i = 0; i < PointList.Count; i++)
            {
                g.FillEllipse(b, (int)(PointList[i].X - radius / 2.0), (int)(PointList[i].Y - radius / 2.0), radius, radius);
            }
        }
    }

    PointList.Clear();
    this.ResumeLayout();
}

只有当你要在drawPoints()中完成所有绘图工作并且一次调用一次时,才会这样做。如果你要定期打电话给drawPoints()或者在流程的其他部分有更多的绘图程序;我建议您在全球范围内保留Graphics gBrush b个参赛作品,并在不再需要Dispose()时保留{{1}}