如何在运行时移动鼠标移动控件?
我有一个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。 它不会让标签移动。 不知道为什么。