1

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

OuterPanel这是一个包含图片框的面板名称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;
}
4

3 回答 3

4

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

  • MouseDown
  • MouseMove
  • MouseUp

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

您的代码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方法从Mur Haf Soz

于 2012-05-19T04:49:33.103 回答
0

随着使用

ControlMoverOrResizer

在本文中的类中,您只需一行代码就可以在运行时进行可移动和可调整大小的控制!:) 例子:

ControlMoverOrResizer.Init(button1);   

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

于 2014-01-10T21:26:50.123 回答
0

试试这个。很美丽。

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

于 2014-10-30T14:33:00.727 回答