我尝试构建自己的极坐标图。我使用函数绘制点如下:
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 是一个接一个地绘制,需要很多时间。我怎样才能一次性绘制它们?
答案 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)
在每个循环步骤中实例化一个新的SolidBrush
。 radius
每次都被重新定义。实例化对象不会调用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 g
和Brush b
个参赛作品,并在不再需要Dispose()
时保留{{1}}