C# 如何在运行时移动mousemove上的控件?
我有一个WinForm应用程序,我试图使用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
MouseMove Event
在表单中移动一个pictureBox,但我不知道应该在MouseMove上做什么正确的计算,当我第一次移动pictureBox时,它的位置会以一种无意义的方式发生变化,然后在移动pictureBox时,它的位置会正确移动
它是一个面板名OuterPanel
,其中包含pictureBoxpicBox
,下面是我使用的代码:
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
!!