我有一个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**

我有一个pictureBox1_MouseDown事件,当我单击鼠标左键时,它工作不好

方法private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 应包含逻辑

if(mouseMove==true){//做事}

这应该可以解决问题。