我有一个pictureBox1_MouseDown事件,当我单击鼠标左键时,它工作不好
本文关键字:工作 单击 pictureBox1 有一个 MouseDown 事件 鼠标 | 更新日期: 2023-09-27 18:29:04
我的想法是在我的程序中有一个按钮。当我点击按钮时,它在pictureBox1绘制事件中的绘制点,并将其添加到pictureBox1中心+中心周围随机的10个像素上。
例如,我连续点击了5次,现在我看到了5分。在按钮1点击事件中,我还将按钮位置X、Y添加到两个Lists<>列表<>X表示按钮的X位置,Y表示Y位置。
现在,在鼠标向下事件中,当我单击pictureBox1时,我正在计算离鼠标位置最近的点,我还检查最小值距离是否低于50,因此,如果我单击某个点,我将能够在ictureBox1周围拖动该点,但前提是我单击了位于点中心和距离中心5个像素之间的点。这样我就知道我想拖动哪一点。
在鼠标按下事件中,我还获得最低值距离的索引,并将标志movePoint
设置为true,然后在鼠标移动事件中,始终更新selectedIndex
,以便只有选定的点击点会移动。在鼠标移动事件中,我还检查标志movePoint
是否为真,然后仅开始移动。
在鼠标上,我用鼠标位置再次更新selectedIndex
。并且我还将标志movePoint
设置为false。
问题是,当我运行程序时,添加一个或多个点,但我没有用鼠标点击一个点,我点击pictureBox1中的空白空间,然后只点击一次,或者点击并尝试拖动这个空白空间,由于标志movePoint
为假,所以什么也没发生。
**但事实上,由于某种原因,确实发生了一些事情,如果我单击并拖动pictureBox1区域中的空白,然后单击其中一个点并尝试拖动它们,则该点会跳到我之前拖动空白的位置!我不明白为什么会发生这种事。**
它就像我什么也没拖,它的空白我也看不到任何点移动。但当我试图拖动一个点时,它的跳跃或另一个点正在跳跃到我结束拖动空白的位置!!!!
这是鼠标向下移动鼠标向上移动和绘制事件的代码:
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// find the index that is closest to the current mouse location
float MinDist = float.MaxValue;
for (int idx = 0; idx < Point_X.Count; ++idx)
{
float dx = Point_X[idx] - e.X;
float dy = Point_Y[idx] - e.Y;
float dist = (float)Math.Sqrt(dx * dx + dy * dy);
if (dist < MinDist)
{
MinDist = dist;
selectedIndex = idx;
}
}
if (MinDist < 5)
{
mouseMove = true;
OriginalX = Point_X[(int)selectedIndex];
OriginalY = Point_Y[(int)selectedIndex];
}
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseMove == true)
{
Point NewPoint = e.Location;
Point_X[(int)selectedIndex] = NewPoint.X;
Point_Y[(int)selectedIndex] = NewPoint.Y;
pictureBox1.Refresh();
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
Point NewPoint = e.Location;
Point_X[(int)selectedIndex] = NewPoint.X;
Point_Y[(int)selectedIndex] = NewPoint.Y;
mouseMove = false;
}
private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
SolidBrush brush = new SolidBrush(Color.Red);
for (int idx = 0; idx < Point_X.Count; ++idx)
{
Point dPoint = new Point((int)Point_X[idx], (int)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);
}
}
**我昨天制作了一个小视频来展示这个问题。从一开始就看,但问题从第17-19秒开始,我点击并拖动pictureBox1中的空白,然后再次尝试拖动点,但无法移动它们,如果我无法移动其中一个,其他点会跳到我拖动的空白位置。
http://www.youtube.com/watch?v=qZr6wdF8MNA&feature=youtu.be**
方法private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
应包含逻辑
if(mouseMove==true){//做事}
这应该可以解决问题。