【问题标题】:how to move a control on mousemove in runtime?如何在运行时在 mousemove 上移动控件?
【发布时间】:2012-05-19 04:45:32
【问题描述】:

我有一个 WinForm 应用程序,我正在尝试使用 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);
    }
}

P.S : 目标是放大后的移动图像,如 windows 照片查看器

更新ConvertFromChildToForm方法

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

【问题讨论】:

    标签: c# winforms controls mousemove


    【解决方案1】:

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

    • MouseDown
    • MouseMove
    • MouseUp

    Here is a Related SO Question..

    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;
    }
    

    来自Mur Haf SozConvertFromChildToForm方法

    【讨论】:

    • 我没有任何方法叫ConvertFromChildToForm!!
    【解决方案2】:

    使用

    ControlMoverOrResizer

    this article 中的类,您只需一行代码即可在运行时进行可移动和可调整大小的控制! :) 示例:

    ControlMoverOrResizer.Init(button1);   
    

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

    【讨论】:

      【解决方案3】:

      试试这个。很漂亮。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 2011-02-18
        相关资源
        最近更新 更多