C # Winforms Ультра медленное обновление экрана с использованием метода Drawline - PullRequest
1 голос
/ 07 октября 2011

Я просматривал эту информацию в Интернете, но не нашел точного ответа, который искал, или я попробовал то, что предлагается, и это не работает!

IУ меня проблемы с тем, что у меня есть экран, который имеет примерно 72 флажки в матрице, которую я соединил, используя линии, координаты которых я храню в списке.

Чтобы нарисовать линии, я используюМетод Drawline в методе переопределения для OnPaint выполняет итерацию по списку следующим образом: -

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 ]

3 голосов
/ 07 октября 2011

Частично проблема может заключаться в том, что вы воссоздаете объект 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 голос
/ 07 октября 2011

Нет необходимости создавать свой собственный объект и распоряжаться им.Используйте то, что доступно с обработчиком событий.Также вы должны использовать 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, прежде чем звонить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...