这是绘制事件:
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 列表。
我添加了一个 int 变量,我称之为 moveCounter 以查看它调用此循环并绘制线条的次数。
如果我在 pictureBox1 上添加两个点,请用一条线连接它们,然后在其移动平滑周围拖动其中一个点。3 个连接点和 7 个连接点相同,但是当我到达与许多线连接的 9-10 个点并尝试移动它时,将其拖动或任何未连接的点,一切都移动得非常非常慢,就像我在两点之间添加新的连接线一样,它变得越来越慢。
所以问题可能是我的循环在油漆事件中的错误,或者在移动事件中它做了很多时间 pictureBox1.refresh();
因此,我在设计器中添加了一个启用 true 的计时器,并将其设置为 30 毫秒。在移动事件中,我举起一个标志,在计时器滴答事件中,我检查标志是否打开,我制作了一个 pictureBox1.refresh();并重置回标志。这个想法是,当我移动点或连接的点时,它将每 30 毫秒移动一次。
但这并没有解决问题。仍然当我有 9-10 个点与它们之间的许多线连接时,一切都变得非常慢。
这是图片框 1 鼠标移动事件:
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 tick 事件中,我做到了:
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,依此类推。所以它似乎在工作计时器1和30毫秒还是我错了?
首先,对应用程序进行一些调整:您是否尝试运行与绘图分离的逻辑?=> 例如,"updateData()"方法和"draw()"方法?我也建议使用DoubleBuffer。
其次,如果性能对于较大的数据集(当您添加更多点时)不利,则比您的算法不够高效。如果绘制多边形是您想要的,请先更新顶点坐标,然后调用 Graphics.DrawPolygon