-2

这是绘画事件:

private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            SolidBrush brush;
            Pen p=null;
           Point connectionPointStart;
           Point connectionPointEnd;
           Graphics g = e.Graphics;
           g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
               brush = new SolidBrush(Color.Red);
               p = new Pen(brush);
               for (int idx = 0; idx < wireObject1._point_X.Count; ++idx)
               {
                   Point dPoint = new Point((int)wireObject1._point_X[idx], (int)wireObject1._point_Y[idx]);
                   dPoint.X = dPoint.X - 5; // was - 2
                   dPoint.Y = dPoint.Y - 5; // was - 2
                   Rectangle rect = new Rectangle(dPoint, new Size(10, 10));
                   g.FillEllipse(brush, rect);

                  
               }
           
               for (int i = 0; i < wireObject1._connectionstart.Count; i++)
               {

                   int startIndex = wireObject1._connectionstart[i];
                   int endIndex = wireObject1._connectionend[i];

                   

                   connectionPointStart = new Point((int)wireObject1._point_X[startIndex], (int)wireObject1._point_Y[startIndex]);
                   connectionPointEnd = new Point((int)wireObject1._point_X[endIndex], (int)wireObject1._point_Y[endIndex]);
                   p.Width = 4;
                   g.DrawLine(p, connectionPointStart, connectionPointEnd);
                   moveCounter++;
                   textBox1.Text = moveCounter.ToString();
               }
                          
        }

在底部的循环中,我正在运行 int 类型的 _connectionstart 列表。

我添加了一个名为 moveCounter 的 int 变量,以查看它调用此循环并绘制线条的次数。

如果我在 pictureBox1 上添加两个点,用一条线将它们连接起来,然后拖动其中一个点围绕其移动平滑。同样的事情有 3 个连接点和 7 个连接点,但是当我到达 9-10 个与许多线连接的点并尝试移动它时,拖动它或任何未连接的点,一切都移动得非常非常慢而且一样多当我在两点之间添加一条新的连接线时,它变得越来越慢。

所以问题可能是我的循环在绘画事件中的错误,或者在移动事件中它做了很多次 pictureBox1.refresh();

所以我在设计器中添加了一个启用它的计时器并将其设置为 30 毫秒。在移动事件中,我举起一个标志,在计时器滴答事件中,我检查标志是否打开,我创建了一个 pictureBox1.refresh(); 并重新设置标志。这个想法是,当我移动点或连接点时,它会每 30 毫秒移动一次。

但这并没有解决问题。仍然当我有 9-10 个点与它们之间的许多线相连时,一切都变得非常缓慢。

这是 picturebox1 鼠标移动事件:

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (mouseMove == true)
            {
                mouseDrag = true;
                Point NewPoint = e.Location;
                                  wireObject1.MovePoint(selectedIndex, NewPoint, NewPoint); // when moving a point dragging the other point is vanished deleted. To check why !

                    label1.Text = "{X = " + NewPoint.X + "}" + " " + "{Y = " + NewPoint.Y + "}";
                    refreshFlag = true;
                    timer2.Start();
                

            }
            else
            {
                label19.Text = "{X = " + e.X + "}" + " " + "{Y = " + e.Y + "}";
            }
        }

timer2 是我添加的另一个计时器,只是为了查看它在 5 秒内移动了多少次。因此,如果 timer1 设置为 30 毫秒,我应该在 5 秒后看到大约 150 次移动。

所以在 timer1 滴答事件中我做了:

private void timer1_Tick(object sender, EventArgs e)
        {
            if (refreshFlag == true)
            {
                pictureBox1.Refresh();
                refreshFlag = false;
            }
        }

我确信 timer1 的想法应该可以解决问题,但它没有。所以我想知道问题出在哪里,也许我在绘画事件中的循环做错了什么?

列表 _connectionstart 包含索引,例如,如果我有两个点与一条线相连,我单击一个点并拖动该点,使线变长或变短,然后在 _connectionstart 中,例如我有一个地方/单元格 [0]其中包含索引 0

例如,在列表 _point_X 中,我现在有两个单元格放置在 [0] 120.0 和 [1] 180.0 中,它们是 _point_Y 列表中相同的点坐标。

现在的问题是问题出在哪里?绘画事件中的错误?与移动事件有关吗?我无法弄清楚为什么当它有 9-10 个点连接它们之间有很多线时它变得如此缓慢。

例如,我现在用与一条线连接的两个点进行测试,我移动了一个点,围绕该点将线拉长或缩短,5 秒后结果为 160 次移动,再过 5 秒后为 323 次,依此类推。所以它似乎正在使用 timer1 和 30 毫秒,或者我错了?

4

1 回答 1

0

首先,对应用程序进行一些调整:您是否尝试运行与绘图分离的逻辑?=> 例如,“updateData()”方法和“draw()”方法?我也建议使用DoubleBuffer

其次,如果对于更大的数据集(当您添加更多点时)性能很差,那么您的算法就不够高效。如果您想要绘制多边形,请先更新顶点坐标,然后调用Graphics.DrawPolygon

于 2012-06-25T15:33:57.623 回答