Graphics.DrawLine запаздывает, когда PictureBox SizeMode установлен на Zoom - PullRequest
0 голосов
/ 22 января 2020

У меня есть приложение winforms, где я рисую изображение в картинке. Рисующая часть работает очень хорошо, за исключением задержки при PictureBox.SizeMode = PictureBoxSizeMode.Zoom. Причина, по которой я установил SizeMode на Zoom, заключается в том, что я могу увеличивать и уменьшать изображение, сохраняя память. Есть ли способ ускорить процесс рисования?

Код для метода рисования PictureBox выглядит следующим образом:

pen = new Pen(color, 5);
solidBrush = new SolidBrush(solid);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.ScaleTransform(PictureScale, PictureScale);

foreach (List<Point> polygon in Polygons)
{
  e.Graphics.DrawLines(pen, polygon.ToArray());
}

if (NewPolygon != null)
{
  Pen pp = new Pen(color, 5);
  if (NewPolygon.Count > 1)
  {
    e.Graphics.DrawLines(pp, NewPolygon.ToArray());
  }
  if (NewPolygon.Count > 0)
  {
    using (Pen dashed_pen = pp)
    {
      dashed_pen.DashPattern = new float[] { 3, 3 };
      e.Graphics.DrawLine(dashed_pen, NewPolygon[NewPolygon.Count - 1], NewPoint);
    }
  }
}

Код позволяет пользователю нарисовать серию точек, соединенных некоторыми solid линиями. После добавления первой точки пунктирная линия идет от предыдущей точки к текущей позиции мыши. Программа «заполняет» строку, когда пользователь добавляет новый Point NewPolygon является объектом List<Point>, и программа добавляет точку каждый раз, когда пользователь щелкает. Pol - это List<List<Point>> объект, который содержит NewPolygon. Я приложил GIF процесса рисования, потому что изображение стоит 1000 слов. Лаг в гифке вообще не заметен в режимах разных размеров.

enter image description here

if (NewPolygon.Count > 1) l oop dr aws solid линии между по крайней мере 2 точками. if (NewPolygon.Count > 0) dr aws пунктирная линия между spot и NewPoint, когда есть хотя бы одна точка.

РЕДАКТИРОВАТЬ: полный код чертежа

    int x = 0;
    int y = 0;
    bool drag = false;
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {

        Point spot = new Point((int)((float)(e.Location.X) / PictureScale), (int)((float)(e.Location.Y) / PictureScale));
        if (e.Button == MouseButtons.Middle)
        {
            x = e.X;
            y = e.Y;
            drag = true;
        }
        else
        {
                if (NewPolygon != null)
                {
                    if (e.Button == MouseButtons.Right)
                    {
                        if (NewPolygon.Count > 1)
                        {
                            int counter = NewPolygon.Count;
                            Polygons.Add(NewPolygon);
                        }
                        NewPolygon = null;
                    }
                    else if (e.Button == MouseButtons.Left)
                    {

                        if (NewPolygon[NewPolygon.Count - 1] != spot)
                        {
                            NewPolygon.Add(spot);
                            scaffolds.Add(new Rectangle(spot.X - 3, spot.Y - 3, 6, 6));
                        }
                    }
                }
                else
                {
                    NewPolygon = new List<Point>();
                    NewPoint = spot;
                    NewPolygon.Add(spot);
                    scaffolds.Add(new Rectangle(spot.X - 3, spot.Y - 3, 6, 6));
                }
            }
        //this.Capture = true;
        pictureBox1.Refresh();
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {

        if (drag)
        {
            pictureBox1.Top += e.Y - y;
            pictureBox1.Left += e.X - x;
            this.Cursor = Cursors.SizeAll;
        }
        else
        {
            if (NewPolygon == null)
                return;
            NewPoint = new Point((int)((float)(e.Location.X) / PictureScale), (int)((float)(e.Location.Y) / PictureScale));
            pictureBox1.Refresh();
        }

    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        e.Graphics.ScaleTransform(PictureScale, PictureScale);

        foreach (Rectangle rect in scaffolds)
        {
            e.Graphics.DrawEllipse(pen, rect);
        }

        foreach (List<Point> polygon in Polygons)
        {
            e.Graphics.DrawLines(pen, polygon.ToArray());
        }

        if (NewPolygon != null)
        {
            Pen pp = new Pen(color, 5);

            if (NewPolygon.Count > 0)
            {
                if (NewPolygon.Count > 1)
                {
                    e.Graphics.DrawLines(pp, NewPolygon.ToArray());
                }
                using (Pen dashed_pen = pp)
                {
                    dashed_pen.DashPattern = new float[] { 3, 3 };
                    e.Graphics.DrawLine(dashed_pen, NewPolygon[NewPolygon.Count - 1], NewPoint);
                }

            }
        }

    }
...