C# 如何在运行时移动mousemove上的控件?

C# 如何在运行时移动mousemove上的控件?,c#,winforms,controls,mousemove,C#,Winforms,Controls,Mousemove,我有一个WinForm应用程序,我试图使用MouseMove Event在表单中移动一个pictureBox,但我不知道应该在MouseMove上做什么正确的计算,当我第一次移动pictureBox时,它的位置会以一种无意义的方式发生变化,然后在移动pictureBox时,它的位置会正确移动 它是一个面板名OuterPanel,其中包含pictureBoxpicBox,下面是我使用的代码: private void picBox_MouseMove(object sender, MouseEve

我有一个WinForm应用程序,我试图使用
MouseMove Event
在表单中移动一个pictureBox,但我不知道应该在MouseMove上做什么正确的计算,当我第一次移动pictureBox时,它的位置会以一种无意义的方式发生变化,然后在移动pictureBox时,它的位置会正确移动

它是一个面板名
OuterPanel
,其中包含pictureBox
picBox
,下面是我使用的代码:

private void picBox_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Point p = OuterPanel.PointToClient(MousePosition);
        picBox.Location = this.PointToClient(p);
    }
}
注:目标是在放大后移动图像,就像windows照片查看器一样

更新
ConvertFromChildToForm
方法

private Point ConvertFromChildToForm(int x, int y,Control control)
{
    Point p = new Point(x, y);
    control.Location = p;
    return p;
}

您必须管理三个事件才能正确完成:

  • MouseDown
  • MouseMove
  • MouseUp

您的picBox代码:

private void picBox_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Point p = ConvertFromChildToForm(e.X, e.Y, picBox);
        iOldX = p.X;
        iOldY = p.Y;
        iClickX = e.X;
        iClickY = e.Y;
        clicked = true;
    }
}

private void picBox_MouseMove(object sender, MouseEventArgs e)
{
    if (clicked)
    {
        Point p = new Point(); // New Coordinate
        p.X =  e.X + picBox.Left;
        p.Y =  e.Y + picBox.Top;
        picBox.Left = p.X - iClickX;
        picBox.Top = p.Y - iClickY;
    }
}

private void picBox_MouseUp(object sender, MouseEventArgs e)
{
    clicked = false;   
}

private Point ConvertFromChildToForm(int x, int y, Control control)
{
    Point p = new Point(x, y);
    control.Location = p;
    return p;
}

ConvertFromChildToForm
方法from

您必须管理三个事件才能正确完成:

  • MouseDown
  • MouseMove
  • MouseUp

您的picBox代码:

private void picBox_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        Point p = ConvertFromChildToForm(e.X, e.Y, picBox);
        iOldX = p.X;
        iOldY = p.Y;
        iClickX = e.X;
        iClickY = e.Y;
        clicked = true;
    }
}

private void picBox_MouseMove(object sender, MouseEventArgs e)
{
    if (clicked)
    {
        Point p = new Point(); // New Coordinate
        p.X =  e.X + picBox.Left;
        p.Y =  e.Y + picBox.Top;
        picBox.Left = p.X - iClickX;
        picBox.Top = p.Y - iClickY;
    }
}

private void picBox_MouseUp(object sender, MouseEventArgs e)
{
    clicked = false;   
}

private Point ConvertFromChildToForm(int x, int y, Control control)
{
    Point p = new Point(x, y);
    control.Location = p;
    return p;
}
ConvertFromChildToForm
方法from

使用

ControlMoverOrResizer

类,只需一行代码,即可在运行时执行可移动和可调整大小的控件!:) 例如:

现在button1是一个可移动且可调整大小的控件

使用

ControlMoverOrResizer

类,只需一行代码,即可在运行时执行可移动和可调整大小的控件!:) 例如:


现在button1是一个可移动且可调整大小的控件

试试这个。很漂亮

const uint WM_NCLBUTTONDOWN = 161;
const uint HTCAPTION = 2;

[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr window, uint message, IntPtr wParam, IntPtr lParam);

public Form1()
{
    PictureBox picBox = new PictureBox();
    picBox.Text = "this control is crazy!";
    picBox.BackColor = Color.Red;
    picBox.SetBounds(8, 8, 128, 64);
    picBox.MouseDown += OnMouseDown;
    Controls.Add(picBox);
}

private void OnMouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage((sender as Control).Handle, WM_NCLBUTTONDOWN, (IntPtr) HTCAPION, IntPtr.Zero);
}

问题是您必须使用WinApi。而且它不会让标签移动。不知道为什么。

试试这个。很漂亮

const uint WM_NCLBUTTONDOWN = 161;
const uint HTCAPTION = 2;

[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr window, uint message, IntPtr wParam, IntPtr lParam);

public Form1()
{
    PictureBox picBox = new PictureBox();
    picBox.Text = "this control is crazy!";
    picBox.BackColor = Color.Red;
    picBox.SetBounds(8, 8, 128, 64);
    picBox.MouseDown += OnMouseDown;
    Controls.Add(picBox);
}

private void OnMouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage((sender as Control).Handle, WM_NCLBUTTONDOWN, (IntPtr) HTCAPION, IntPtr.Zero);
}

问题是您必须使用WinApi。而且它不会让标签移动。不知道为什么。

我没有任何方法叫做
ConvertFromChildToForm
!!我没有任何方法称为
ConvertFromChildToForm
!!