C#使用Drawline方法Winforms超慢速更新屏幕

时间:2011-10-07 13:53:35

标签: c# winforms

我已经浏览了一下这个网络,但是没有找到我正在寻找的确切答案,或者我已经尝试了建议但它不起作用!

我遇到的问题是,我的屏幕上有一个大约72个复选框,矩阵中我使用我将其存储在列表中的坐标连接在一起。

要绘制线条,我在OnPaint的覆盖方法中使用Drawline方法迭代列表,如下所示: -

protected override void OnPaint(PaintEventArgs e)
    {
        Pen myPen = new Pen(System.Drawing.Color.Black);
        Graphics g = this.CreateGraphics();
        myPen.Width = 5;

       foreach(ConnectionLine cl in connectionLines)
       {
        g.DrawLine(myPen, cl.xStart, cl.yStart, cl.xStop, cl.yStop);
       }

        myPen.Dispose();
        g.Dispose();

    }

关于这一点的奇怪之处在于它似乎并不是花费时间绘制的线条 - 它现在是复选框,如果我在眨眼之间删除这些刷新的线路功能。

任何想法都非常感激。

谢谢,

戴夫

2 个答案:

答案 0 :(得分:3)

部分问题可能是您每次绘制控件时都在重新创建Graphics对象。相反,您应该使用e.Graphics中提供的PaintEventArgs对象。您也可以尝试仅使用一个Pen实例。

 private readonly Pen _myPen = new Pen(System.Drawing.Color.Black) {Width = 5};
 protected override void OnPaint(PaintEventArgs e)
 {
     foreach (var cl in connectionLines)
         e.Graphics.DrawLine(_myPen, cl.xStart, cl.yStart, cl.xStop, cl.yStop);
 }

答案 1 :(得分:1)

无需创建自己的并处理Graphics对象。使用事件处理程序可用的内容。此外,您应该使用using而不是明确地调用Dispose。

    protected override void OnPaint(PaintEventArgs e)
    {
        using (Pen myPen = new Pen(System.Drawing.Color.Black, 5.0))
        {
           foreach(ConnectionLine cl in connectionLines)
                   e.Graphics.DrawLine(myPen, cl.xStart, cl.yStart, cl.xStop, cl.yStop);
        }
    }

此外,如果您的线路连接,您应该使用Graphic的DrawLines方法获得更好的性能和更清晰的代码。在调用之前,您必须更改存储积分的方式或从conncetionLines集合中提取积分。