创建一个可移动控件

本文关键字:一个 移动控件 创建 | 更新日期: 2023-09-27 18:28:30

我必须制作一个用户控件,在那里你可以移动它,但我必须从头开始制作(即获取控件的位置,计算鼠标移动时的差异,并相应地移动控件)这就是我现在拥有的。

公共分部类MainMenu:UserControl{公共点OldMouseLoc;公共点OldWindowLoc;公共主菜单(){InitializeComponent();}

private void customButton1_MouseDown(object sender, MouseEventArgs e)
{
    OldMouseLoc = MousePosition;
    OldWindowLoc = new Point(this.Location.X + this.Parent.Location.X,this.Location.Y + this.Parent.Location.Y);
    Mover.Start();
}
private void Mover_Tick(object sender, EventArgs e)
{
    Point NewMouseLoc = MousePosition;
    if (NewMouseLoc.X > OldMouseLoc.X || true) { // ( || true is for debugging)
        this.Location = new Point(NewMouseLoc.X - OldWindowLoc.X, this.Location.Y);
        MessageBox.Show(NewMouseLoc.X.ToString() + "   " + OldWindowLoc.X.ToString()); // for debugging
    }
}

}

现在我遇到麻烦的原因是鼠标位置相对于屏幕顶部,而我的控件位置相对于其父窗口的左上角。计算所有坐标的数学运算让我非常头疼,请只固定这些坐标的X位置,这样我就可以用它来计算Y了(这样我就能自学)。

创建一个可移动控件

PointToClient应该为您计算。您需要在控件的父级上调用此方法。

更新:

也可以考虑稍微不同的方法。你真的不需要任何计时器或屏幕坐标:

    private Point _mdLocation;
    private void customButton1_MouseDown(object sender, MouseEventArgs e)
    {
        _mdLocation = e.Location;
    }
    private void customButton1_MouseMove(object sender, MouseEventArgs e)
    {
        if(e.Button == MouseButtons.Left)
        {
            var x = this.Left + e.X - _mdLocation.X;
            var y = this.Top + e.Y - _mdLocation.Y;
            this.Location = new Point(x, y);
        }
    }