无边框窗体拖动分析
首先从微软官网中了解窗体的基本坐标系
(Windows 窗体中的坐标 - Windows Forms | Microsoft Learn)
#region
// 窗体无边框拖动
//最原始的位置
private Point initialPoint;
// 偏移量
private int offsetPointX = 0;
private int offsetPointY = 0;
我们从刚点击鼠标开始就有一个最原始的位置initialPoint坐标
// 鼠标按下事件
private void FrmMain_MouseDown(object sender, MouseEventArgs e)
{
// 鼠标按下就创建一个初始的坐标(X,Y)轴 产生鼠标事件的坐标(即鼠标按下)
initialPoint = new Point(e.X, e.Y);
}
我们从上述微软官网中了解到
屏幕上的点由 x 坐标和 y 坐标对描述,x 坐标向右增加,y 坐标从上到下增加。
我们的鼠标移动的时候就相当于移动了一个偏移量 offsetPoint = currentPoint(当前鼠标位置 e.X和e.Y) - initialPoint(鼠标一开始刚按下的位置即鼠标MouseDown的位置)
从上述条件得出 :最新的窗体位置 = 最原始的窗体位置 + 偏移量
// 鼠标移动事件
private void FrmMain_MouseMove(object sender, MouseEventArgs e)
{
// Loction 跟踪鼠标的左键
if (e.Button == MouseButtons.Left)
{
// Loction.X 窗体的坐标X 是窗体的左上角为原点(0,0)的XY轴坐标
// 那么窗体当前的位置为 最初的窗体坐标位置 + 当前的鼠标位置 - 最原始的(一开始按下鼠标事件)的坐标
// 相当于移动了一个偏移量 offsetPoint = currentPoint(当前鼠标位置e.X和e.Y) - initialPoint(鼠标刚按下的位置)
offsetPointX = e.X - initialPoint.X;
offsetPointY = e.Y - initialPoint.Y;
this.Location = new Point(this.Location.X + offsetPointX, this.Location.Y + offsetPointY);
// 上述步骤可简化成下面一行代码
// this.Location = new Point(this.Location.X + e.X - initialPoint.X,this.Location.Y + e.Y - initialPoint.Y);
}
}
#endregion