如何在运行时移动鼠标移动控件?

我有一个WinForm应用程序,我正在尝试使用MouseMove Event在一个表单中移动一个pictureBox,但我无法弄清楚我应该在MouseMove上做什么是正确的计算,当我第一次使用pictureBox时,它的位置变化无意义然后移动pictureBox位置移动正确。

它是一个Panel名称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); } } 

PS:目标是在放大后移动图像,如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

这是一个相关的SO问题..

您的picBox代码:

 private void picBox_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Point p = ConvertFromChildToForm(eX, eY, picBox); iOldX = pX; iOldY = pY; iClickX = eX; iClickY = eY; clicked = true; } } private void picBox_MouseMove(object sender, MouseEventArgs e) { if (clicked) { Point p = new Point(); // New Coordinate pX = eX + picBox.Left; pY = eY + picBox.Top; picBox.Left = pX - iClickX; picBox.Top = pY - 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; } 

来自Mur Haf Soz ConvertFromChildToForm方法

使用

ControlMoverOrResizer

在本文中,您可以使用一行代码在运行时进行可移动和可resize的控制! :)示例:

 ControlMoverOrResizer.Init(button1); 

现在button1是一个可移动且可resize的控件!

试试这个。 很美丽。

 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。 它不会让标签移动。 不知道为什么。