把窗体的属性设置为无边框后如何实现窗体移动?

文章目录

    • 1 通过设置鼠标的左键点击、移动、释放事件实现

1 通过设置鼠标的左键点击、移动、释放事件实现

具体实现代码如下:

#region  拖动窗体的实现

        private Point mouseOff;//鼠标移动位置变量
        private bool leftFlag;//标签是否为左键
        private void FrmMain_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseOff = new Point(-e.X, -e.Y); //得到变量的值
                leftFlag = true;                  //点击左键按下时标注为true;
            }
        }
        private void FrmMain_MouseMove(object sender, MouseEventArgs e)
        {
            if (leftFlag)
            {
                Point mouseSet = Control.MousePosition;
                mouseSet.Offset(mouseOff.X, mouseOff.Y);  //设置移动后的位置
                Location = mouseSet;
            }
        }
        private void FrmMain_MouseUp(object sender, MouseEventArgs e)
        {
            if (leftFlag)
            {
                leftFlag = false;//释放鼠标后标注为false;
            }
        }

        #endregion
  1. 记录按下鼠标左键时的坐标位置,这个坐标位置是相对于鼠标单击处的位置所在的容器左上点的位置。
  2. 鼠标移动时,获取鼠标在当前屏幕中的坐标。然后用这个坐标的X、Y分别减去1中获取坐标的X、Y值就可以得到鼠标所在容器左上点的新位置(当前点击位置和点击位置所在的容器的左上点相对位置是不会发生变化的)。
  3. 将新位置赋值给当前窗体的Location属性。

注意:
第3步中,直接将新位置赋值给当前窗体的Location属性,这是有问题的。当鼠标点击的区域所在的容器跟窗体的左上点坐标的位置不同时,就会出现点击鼠标移动时,窗体会先向右下方移动一段距离然后再跟随鼠标移动的情况。向右下方移动的距离就和鼠标点击位置处容器的左上点坐标和窗体左上点坐标有关。

为什么后面就能顺利更随呢?因为窗体的位置发生了变化,而鼠标的位置却没有发生变化,这就刚好抵消了两者坐标之间的差值。

解决方案: 根据点击位置实时计算补偿坐标值。

你可能感兴趣的:(C#)