用鼠标拖动控件在C#中的移动

18

我正在尝试通过拖动来移动名为pictureBox1的控件。问题是,当它移动时,它会不断从一个位置到另一个位置围绕着鼠标移动,但并没有跟随鼠标移动...这是我的代码。如果您能帮助我,我将不胜感激。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    bool selected = false;
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        selected = true;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (selected == true)
        {
            pictureBox1.Location = e.Location;
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        selected = false;
    }

}
3个回答

45

你所需要的:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    private Point MouseDownLocation;


    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            MouseDownLocation = e.Location;
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            pictureBox1.Left = e.X + pictureBox1.Left - MouseDownLocation.X;
            pictureBox1.Top = e.Y + pictureBox1.Top - MouseDownLocation.Y;
        }
    }

}

@TurmDrummer,你应该在这个网站上使用英语(至少尝试着使用)以便其他用户能够理解你。相关讨论:http://meta.stackexchange.com/questions/118678/how-should-we-handle-wholly-non-english-comments - astef
对不起,我没有意识到我用德语写了我的评论。有时候我不知道我在用什么语言交流。我的问题是,因为你似乎对这种UI代码有很好的了解,你有没有想法如何让拖动控件的移动更加平滑?如果在这种实现方式下没有实际解决方案,我宁愿坚持你的方法,因为我找到的其他解决方案经常都是糟糕的、有缺陷的或不切实际的,而你的解决方案现在运行良好。 - TurmDrummer
@TurmDrummer 即使我对此有很好的了解(事实并非如此),即使我知道你在问什么(我不知道),为什么不创建一个新问题呢? - astef
2
pictureBox1.Left = (-1 * e.X) + pictureBox1.Left + MouseDownLocation.X;如果有人需要反向滚动。 - laphiloctete
1
非常感谢astef,喜欢这个答案,为我节省了很多时间。我通过将发送器强制转换来使MouseMove对控件通用化,以便我可以在多个控件上使用相同的代码,MouseDown已经适用于多个控件。 控件控制 = (Control)sender; control.Left = e.X + control.Left - MouseDownLocation.X; control.Top = e.Y + control.Top - MouseDownLocation.Y; - Chad Miller

10

您还可以使用扩展功能:

public static class CmponentsExtensions
{
  //Management of mouse drag and drop
    #region Menu and Mouse
    private static bool mouseDown;
    private static Point lastLocation;

    /// <summary>
    /// To enable control to be moved around with mouse
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="control"></param>
    public static void moveItselfWithMouse<T>(this T control) where T: Control
    { 
        control.MouseDown += (o, e)=> { mouseDown = true; lastLocation = e.Location; };
        control.MouseMove += (o, e) => 
        {
            if (mouseDown)
            {
                control.Location = new Point((control.Location.X - lastLocation.X) + e.X, (control.Location.Y - lastLocation.Y) + e.Y);
                control.Update();
            }
        };
        control.MouseUp += (o, e) => { mouseDown = false; } ;
    }


    public static void moveOtherWithMouse<T>(this T control, Control movedObject) where T : Control
    {
        control.MouseDown += (o, e) => { mouseDown = true; lastLocation = e.Location; };
        control.MouseMove += (o, e) =>
        {
            if (mouseDown)
            { 
                movedObject.Location = new Point((movedObject.Location.X - lastLocation.X) + e.X, (movedObject.Location.Y - lastLocation.Y) + e.Y);
                movedObject.Update();
            }
        };
        control.MouseUp += (o, e) => { mouseDown = false; };
    }

    #endregion
}

然后你需要使用一些控制:

在这种情况下,pictureBox1移动了整个表单。

pictureBox1.moveOtherWithMouse(this);

在这种情况下,您只移动pictureBox:
pictureBox1.moveItselfWithMouse();

@PawwlWojda,e和control都没有Location属性。 - SezMe
SezMe,你在使用Windows Forms还是WPF? - Paweł Wojda

6

尝试使用鼠标在运行时移动pictureBox控件

 private void pictureBox7_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                xPos = e.X;
                yPos = e.Y;
            }
        }

        private void pictureBox7_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            PictureBox p = sender as PictureBox;

            if (p != null)
            {
                if (e.Button == MouseButtons.Left)
                {
                    p.Top += (e.Y - yPos);
                    p.Left += (e.X - xPos);
                }
            }

        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接