C#中关于窗体无边框拖动

无边框窗体拖动分析

首先从微软官网中了解窗体的基本坐标系
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容