创建一个可移动控件
本文关键字:一个 移动控件 创建 | 更新日期: 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);
}
}