Winforms 如何在运行时创建可移动(鼠标)按钮c#

Winforms 如何在运行时创建可移动(鼠标)按钮c#,winforms,user-controls,runtime,Winforms,User Controls,Runtime,我正在使用以下代码在运行时创建按钮,但如何使它们可移动(可以在屏幕上的任何位置使用鼠标拖动) 我已尝试使用鼠标事件,但无法使它们根据鼠标指针移动,因为鼠标在拖动时可以移动到按钮外,因此您必须使用该属性。 通过此示例,您可以不在整个屏幕上移动按钮,而是在其父容器的范围内(或在其父容器外,然后隐藏,这可能是应该防止的) var b = new Button(); b.Text = "My Button"; b.Name= "button"; b.Click += new E

我正在使用以下代码在运行时创建按钮,但如何使它们可移动(可以在屏幕上的任何位置使用鼠标拖动)


我已尝试使用鼠标事件,但无法使它们根据鼠标指针移动

,因为鼠标在拖动时可以移动到按钮外,因此您必须使用该属性。
通过此示例,您可以不在整个屏幕上移动按钮,而是在其父容器的范围内(或在其父容器外,然后隐藏,这可能是应该防止的)

var b = new Button();
    b.Text = "My Button";
    b.Name= "button"; 
    b.Click += new EventHandler(b_Click);
    b.MouseUp += new MouseEventHandler(this.b_MouseUp);
    b.MouseDown += new MouseEventHandler(this.b_MouseDown);
    b.MouseMove += new MouseEventHandler(this.b_MouseMove);
    this.myPanel.Controls.Add(b);
private Point Origin_Cursor;
private Point Origin_Control;
private bool BtnDragging = false;

private void button1_Click(object sender, EventArgs e)
{
    var b = new Button();
    b.Text = "My Button";
    b.Name = "button";
    //b.Click += new EventHandler(b_Click);
    b.MouseUp += (s, e2) => { this.BtnDragging = false; };
    b.MouseDown += new MouseEventHandler(this.b_MouseDown);
    b.MouseMove += new MouseEventHandler(this.b_MouseMove);
    this.panel1.Controls.Add(b);
}

private void b_MouseDown(object sender, MouseEventArgs e)
{
    Button ct = sender as Button;
    ct.Capture = true;
    this.Origin_Cursor = System.Windows.Forms.Cursor.Position;
    this.Origin_Control = ct.Location;
    this.BtnDragging = true;
}

private void b_MouseMove(object sender, MouseEventArgs e)
{
    if(this.BtnDragging)
    {
        Button ct = sender as Button;
        ct.Left = this.Origin_Control.X - (this.Origin_Cursor.X - Cursor.Position.X);
        ct.Top = this.Origin_Control.Y - (this.Origin_Cursor.Y - Cursor.Position.Y);
    }
}