• C#窗体越界时鼠标还能回到初始坐标位置


    对窗体加越界限制后,鼠标拖动窗体越界时,窗体不能动,鼠标位置可动,但窗体不再越界时,鼠标位置还能回到鼠标按下时相对窗体的坐标:
    1、首先创建一个窗体Form1,然后在窗体上拖一个button1按钮(主要通过这个按钮来拖动窗体)

    2、然后对按钮添加鼠标按下事件、鼠标移动事件和鼠标抬起事件,事件里面是对窗体和鼠标坐标的操作,整体代码如下:
    using System.Drawing;
    using System.Windows.Forms;
    namespace 窗体越界鼠标还能回到初始坐标
    {
        public partial class Form1 : System.Windows.Forms.Form
        {
            #region 变量定义
            public Point mainFormPosition;//主窗口左上角位置
            int workingAreaHeight = SystemInformation.WorkingArea.Height;
            int workingAreaWidth = SystemInformation.WorkingArea.Width;
            private Point relativetMousePosition;//鼠标相对窗体的相对坐标
            bool FirstLeft = false;//是否左边第一次按下时坐标
            bool FirstRight = false;//是否右边第一次按下时坐标
            bool FirstUp = false;//是否上边第一次按下时坐标
            bool FirstDown = false;//是否下边第一次按下时坐标
            bool isFirstDown = true;//是否第一次按下,鼠标越界纠正时判断是否是第一次按下,不是按下后又拖动了
            bool isMoveOut = false;//是否拖出
            //这两个变量做差,差值为拖出的距离时软件弹出侧边
            int oldMove_X = 0;//侧边停靠拖出时起始坐标
            //上一个时刻、鼠标的位置
            private Point oldMousePosition;
            //当前时刻、鼠标的位置
            private Point currentMousePosition;
            //鼠标事件
            [System.Runtime.InteropServices.DllImport("user32")]
            private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
            //移动鼠标
            const int MOUSEEVENTF_MOVE = 0x0001;
            //模拟鼠标左键按下
            const int MOUSEEVENTF_LEFTDOWN = 0x0002;
            //模拟鼠标左键抬起
            const int MOUSEEVENTF_LEFTUP = 0x0004;
            //模拟鼠标右键按下
            const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
            //模拟鼠标右键抬起
            const int MOUSEEVENTF_RIGHTUP = 0x0010;
            //模拟鼠标中键按下
            const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
            //模拟鼠标中键抬起
            const int MOUSEEVENTF_MIDDLEUP = 0x0040;
            //标示是否采用绝对坐标
            const int MOUSEEVENTF_ABSOLUTE = 0x8000;
            #endregion

            #region 窗体初始化
            public Form1()
            {
                InitializeComponent();
            }
            #endregion

            //-------------------------按钮button1鼠标事件---------------------------------------------------------------
            #region 鼠标左键按下Button1按钮事件
            private void Button1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    currentMousePosition = Control.MousePosition;
                    oldMousePosition = currentMousePosition;   //鼠标按下时、两个时刻的坐标变成一样,防止错误移动            
                    mainFormPosition = Location;
                    if (isFirstDown)//鼠标按下时,记录第一次鼠标按下相对主窗体的坐标
                    {
                        relativetMousePosition.X = currentMousePosition.X - Location.X;
                        relativetMousePosition.Y = currentMousePosition.Y - Location.Y;
                        isFirstDown = false;
                    }
                    if (isMoveOut)//鼠标按下时,记录拖出时的初始坐标
                    {
                        oldMove_X = currentMousePosition.X;
                    }
                }
            }
            #endregion

            #region 鼠标左键按住Button1按钮移动事件
            private void Button1_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    currentMousePosition = Control.MousePosition;
                    if (currentMousePosition.X < relativetMousePosition.X && currentMousePosition.Y > relativetMousePosition.Y && currentMousePosition.Y < workingAreaHeight - this.ClientSize.Height + relativetMousePosition.Y)//左边窗体越界坐标纠正
                    {
                        mainFormPosition.X = 0;
                        mainFormPosition.Y += currentMousePosition.Y - oldMousePosition.Y;
                        //保存上一个时刻的鼠标位置
                        oldMousePosition.Y = currentMousePosition.Y;
                        FirstLeft = true;
                    }
                    else if (currentMousePosition.X > workingAreaWidth - this.ClientSize.Width + relativetMousePosition.X && currentMousePosition.Y > relativetMousePosition.Y && currentMousePosition.Y < workingAreaHeight - this.ClientSize.Height + relativetMousePosition.Y)//右边窗体越界坐标纠正
                    {
                        mainFormPosition.X = workingAreaWidth - this.ClientSize.Width;
                        mainFormPosition.Y += currentMousePosition.Y - oldMousePosition.Y;
                        //保存上一个时刻的鼠标位置
                        oldMousePosition.Y = currentMousePosition.Y;
                        FirstRight = true;
                    }
                    else if (currentMousePosition.Y < relativetMousePosition.Y && currentMousePosition.X > relativetMousePosition.X && currentMousePosition.X < workingAreaWidth - this.ClientSize.Width + relativetMousePosition.X)//上边窗体越界坐标纠正
                    {
                        mainFormPosition.Y = 0;
                        mainFormPosition.X += currentMousePosition.X - oldMousePosition.X;
                        //保存上一个时刻的鼠标位置
                        oldMousePosition.X = currentMousePosition.X;
                        FirstUp = true;
                    }
                    else if (currentMousePosition.Y > workingAreaHeight - this.ClientSize.Height + relativetMousePosition.Y && currentMousePosition.X > relativetMousePosition.X && currentMousePosition.X < workingAreaWidth - this.ClientSize.Width + relativetMousePosition.X)//下边窗体越界坐标纠正
                    {
                        mainFormPosition.Y = workingAreaHeight - this.ClientSize.Height;
                        mainFormPosition.X += currentMousePosition.X - oldMousePosition.X;
                        //保存上一个时刻的鼠标位置
                        oldMousePosition.X = currentMousePosition.X;
                        FirstDown = true;
                    }
                    else if (currentMousePosition.X < relativetMousePosition.X && currentMousePosition.Y < relativetMousePosition.Y)//左上角窗体越界坐标纠正
                    {
                        mainFormPosition.X = 0;
                        mainFormPosition.Y = 0;
                        mainFormPosition.X += currentMousePosition.X - oldMousePosition.X;
                        mainFormPosition.Y += currentMousePosition.Y - oldMousePosition.Y;
                        //保存上一个时刻的鼠标位置
                        oldMousePosition.X = currentMousePosition.X;
                        oldMousePosition.Y = currentMousePosition.Y;
                        FirstLeft = true;
                        FirstUp = true;
                    }
                    else if (currentMousePosition.X > workingAreaWidth - this.ClientSize.Width + relativetMousePosition.X && currentMousePosition.Y < relativetMousePosition.Y)//右上角窗体越界坐标纠正
                    {
                        mainFormPosition.X = workingAreaWidth - this.ClientSize.Width;
                        mainFormPosition.Y = 0;
                        mainFormPosition.X += currentMousePosition.X - oldMousePosition.X;
                        mainFormPosition.Y += currentMousePosition.Y - oldMousePosition.Y;
                        //保存上一个时刻的鼠标位置
                        oldMousePosition.X = currentMousePosition.X;
                        oldMousePosition.Y = currentMousePosition.Y;
                        FirstRight = true;
                        FirstUp = true;
                    }
                    else if (currentMousePosition.X < relativetMousePosition.X && currentMousePosition.Y > workingAreaHeight - this.ClientSize.Height + relativetMousePosition.Y)//左下角窗体越界坐标纠正
                    {
                        mainFormPosition.X = 0;
                        mainFormPosition.Y = workingAreaHeight - this.ClientSize.Height;
                        mainFormPosition.X += currentMousePosition.X - oldMousePosition.X;
                        mainFormPosition.Y += currentMousePosition.Y - oldMousePosition.Y;
                        //保存上一个时刻的鼠标位置
                        oldMousePosition.X = currentMousePosition.X;
                        oldMousePosition.Y = currentMousePosition.Y;
                        FirstLeft = true;
                        FirstDown = true;
                    }
                    else if (currentMousePosition.X > workingAreaWidth - this.ClientSize.Width + relativetMousePosition.X && currentMousePosition.Y > workingAreaHeight - this.ClientSize.Height + relativetMousePosition.Y)//右下角窗体越界坐标纠正
                    {
                        mainFormPosition.Y = workingAreaHeight - this.ClientSize.Height;
                        mainFormPosition.X = workingAreaWidth - this.ClientSize.Width;
                        mainFormPosition.X += currentMousePosition.X - oldMousePosition.X;
                        mainFormPosition.Y += currentMousePosition.Y - oldMousePosition.Y;
                        //保存上一个时刻的鼠标位置
                        oldMousePosition.X = currentMousePosition.X;
                        oldMousePosition.Y = currentMousePosition.Y;
                        FirstRight = true;
                        FirstDown = true;
                    }
                    if (FirstLeft)
                    {
                        currentMousePosition.X = relativetMousePosition.X;
                        FirstLeft = false;
                    }
                    if (FirstRight)
                    {
                        currentMousePosition.X = workingAreaWidth - this.ClientSize.Width + relativetMousePosition.X;
                        FirstRight = false;
                    }
                    if (FirstUp)
                    {
                        currentMousePosition.Y = relativetMousePosition.Y;
                        FirstUp = false;
                    }
                    if (FirstDown)
                    {
                        currentMousePosition.Y = workingAreaHeight - this.ClientSize.Height + relativetMousePosition.Y;
                        FirstDown = false;
                    }
                    if (FirstLeft && FirstUp)
                    {
                        currentMousePosition.X = relativetMousePosition.X;
                        currentMousePosition.Y = relativetMousePosition.Y;
                        FirstLeft = false;
                        FirstUp = false;

                    }
                    if (FirstRight && FirstUp)
                    {
                        currentMousePosition.X = workingAreaWidth - this.ClientSize.Width + relativetMousePosition.X;
                        currentMousePosition.Y = relativetMousePosition.Y;
                        FirstUp = false;
                        FirstRight = false;
                    }
                    if (FirstLeft && FirstDown)
                    {
                        currentMousePosition.X = relativetMousePosition.X;
                        currentMousePosition.Y = workingAreaHeight - this.ClientSize.Height + relativetMousePosition.Y;
                        FirstLeft = false;
                        FirstDown = false;
                    }
                    if (FirstRight && FirstDown)
                    {
                        currentMousePosition.X = workingAreaWidth - this.ClientSize.Width + relativetMousePosition.X;
                        currentMousePosition.Y = workingAreaHeight - this.ClientSize.Height + relativetMousePosition.Y;
                        FirstRight = false;
                        FirstDown = false;
                    }
                    //对窗体进行移动
                    mainFormPosition.X += currentMousePosition.X - oldMousePosition.X;
                    mainFormPosition.Y += currentMousePosition.Y - oldMousePosition.Y;
                    //保存上一个时刻的鼠标位置
                    oldMousePosition = currentMousePosition;

                    #region 越界处理
                    if (mainFormPosition.X < 0)//左边越界
                    {
                        mainFormPosition.X = 0;
                    }
                    else if (mainFormPosition.Y < 0)//上边越界
                    {
                        mainFormPosition.Y = 0;
                    }
                    else if (mainFormPosition.X > workingAreaWidth - this.ClientSize.Width)//右边越界
                    {
                        mainFormPosition.X = workingAreaWidth - this.ClientSize.Width;
                    }
                    else if (mainFormPosition.Y > workingAreaHeight - this.ClientSize.Height)//下边越界
                    {
                        mainFormPosition.Y = workingAreaHeight - this.ClientSize.Height;
                    }
                    //更新主窗口位置
                    Location = mainFormPosition;
                    #endregion
                }
            }
            #endregion

            #region 鼠标在按钮Button1抬起事件
            private void Button1_MouseUp(object sender, MouseEventArgs e)
            {
                isFirstDown = true;
                //如果主窗体在这个位置,就判断允许主窗体在鼠标抬起后执行移动事件
                if (mainFormPosition.X == workingAreaWidth - this.ClientSize.Width)
                {
                    isMoveOut = false;
                }
                if (mainFormPosition.X == 0)
                {
                    isMoveOut = false;
                }
            }
            #endregion
        }
    }

    动画效果如下:

     

    这是本人在一个项目中遇到的问题,所以特意总结出来分享给大家。

  • 相关阅读:
    蝶恋花
    JVM解毒——JVM与Java体系结构
    超赞!IDEA 最新版本,支持免打扰和轻量模式!
    SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存
    神奇的 SQL 之 WHERE 条件的提取与应用
    终于放弃了单调的swagger-ui了,选择了这款神器—knife4j
    Git 高级用法,喜欢就拿去用
    既然有 HTTP 请求,为什么还要用 RPC 调用?
    SpringBoot和Spring到底有没有本质的不同?
    一条简单的更新语句,MySQL是如何加锁的?
  • 原文地址:https://www.cnblogs.com/qiantao/p/9531532.html
Copyright © 2020-2023  润新知