C#无边框窗体调整大小的方法

来源:互联网 发布:软件开发部规章制度 编辑:程序博客网 时间:2024/04/30 03:03

#region 窗体大小调整的方法
        public bool isMouseDown = false;      
        /// <summary>
        /// 调整大小时,鼠标感应的边框宽度
        /// </summary>
        private int ResizeBorderWidth = 6;
        /// <summary>
        /// 位置类型
        /// </summary>
        private MouseLocationStyle loactionStyle = MouseLocationStyle.S22_MiddelCenter;
        /// <summary>
        /// 上一次鼠标坐标
        /// </summary>
        private Point LastMoustLocation;

        /// <summary>
        /// 根据鼠标坐标,返回鼠标位置类型
        /// </summary>
        /// <param name="mouseLocation">鼠标距窗体左上角的坐标</param>
        /// <returns></returns>
        private MouseLocationStyle GetLocationStyle(Point mouseLocation)
        {
            //左上
            if (mouseLocation.X <= ResizeBorderWidth &&
                mouseLocation.Y <= ResizeBorderWidth)
            {
                return MouseLocationStyle.S11_LeftTop;
            }

            //中上
            if (mouseLocation.X > ResizeBorderWidth &&
                mouseLocation.X <= this.Width - ResizeBorderWidth &&
                mouseLocation.Y <= ResizeBorderWidth)
            {
                return MouseLocationStyle.S12_CenterTop;
            }

            //右上
            if (mouseLocation.X > this.Width - ResizeBorderWidth &&
                mouseLocation.Y <= ResizeBorderWidth)
            {
                return MouseLocationStyle.S13_RightTop;
            }

            //左中
            if (mouseLocation.X <= ResizeBorderWidth &&
                mouseLocation.Y > ResizeBorderWidth &&
                mouseLocation.Y <= this.Height - ResizeBorderWidth)
            {
                return MouseLocationStyle.S21_MiddleLeft;
            }

            //中中
            if (mouseLocation.X > ResizeBorderWidth &&
                mouseLocation.X <= this.Width - ResizeBorderWidth &&
                mouseLocation.Y > ResizeBorderWidth &&
                mouseLocation.Y <= this.Height - ResizeBorderWidth)
            {
                return MouseLocationStyle.S22_MiddelCenter;
            }

            //右中
            if (mouseLocation.X > this.Width - ResizeBorderWidth &&
                mouseLocation.Y > ResizeBorderWidth &&
                mouseLocation.Y <= this.Height - ResizeBorderWidth)
            {
                return MouseLocationStyle.S23_RightMiddel;
            }

            //左下
            if (mouseLocation.X <= ResizeBorderWidth
                && mouseLocation.Y > this.Height - ResizeBorderWidth)
            {
                return MouseLocationStyle.S31_LeftBottom;
            }

            //中下
            if (mouseLocation.X > ResizeBorderWidth &&
                mouseLocation.X <= this.Width - ResizeBorderWidth &&
                mouseLocation.Y > this.Height - ResizeBorderWidth)
            {
                return MouseLocationStyle.S32_CenterBottom;
            }

            //右下
            if (mouseLocation.X > this.Width - ResizeBorderWidth &&
                mouseLocation.Y > this.Height - ResizeBorderWidth)
            {
                return MouseLocationStyle.S33_RightBottom;
            }

            throw new Exception("未知区域");
        }

        /// <summary>
        /// 根据鼠标位置类型,返回鼠标光标类型
        /// </summary>
        /// <param name="mouseStyle">鼠标位置类型</param>
        /// <returns>鼠标光标类型</returns>
        private Cursor GetCursorByMouseLocationStyle(MouseLocationStyle mouseStyle)
        {
            switch (mouseStyle)
            {
                case MouseLocationStyle.S11_LeftTop:
                    return Cursors.SizeNWSE;
                case MouseLocationStyle.S12_CenterTop:
                    return Cursors.SizeNS;
                case MouseLocationStyle.S13_RightTop:
                    return Cursors.SizeNESW;
                case MouseLocationStyle.S21_MiddleLeft:
                    return Cursors.SizeWE;
                case MouseLocationStyle.S22_MiddelCenter:
                    return Cursors.Default;
                case MouseLocationStyle.S23_RightMiddel:
                    return Cursors.SizeWE;
                case MouseLocationStyle.S31_LeftBottom:
                    return Cursors.SizeNESW;
                case MouseLocationStyle.S32_CenterBottom:
                    return Cursors.SizeNS;
                case MouseLocationStyle.S33_RightBottom:
                    return Cursors.SizeNWSE;
                default:
                    return Cursors.Default;
            }
        }

        /// <summary>
        /// 根据鼠标坐标和鼠标坐标类型调整窗体大小
        /// </summary>
        /// <param name="mouseLocation">鼠标坐标</param>
        /// <param name="mouseStyle">鼠标位置类型</param>
        private void ChangeSize(Point mouseLocation, MouseLocationStyle mouseStyle)
        {
            Size newSize = new Size(this.Width, this.Height);
            switch (mouseStyle)
            {
                case MouseLocationStyle.S11_LeftTop:
                    //左上
                    newSize.Width -= mouseLocation.X;
                    newSize.Height -= mouseLocation.Y;
                    this.Location = new Point(this.Location.X + mouseLocation.X, this.Location.Y + mouseLocation.Y);
                    break;
                case MouseLocationStyle.S12_CenterTop:
                    //中上
                    newSize.Height -= mouseLocation.Y;
                    this.Location = new Point(this.Location.X, this.Location.Y + mouseLocation.Y);
                    break;
                case MouseLocationStyle.S13_RightTop:
                    //右上
                    newSize.Width = mouseLocation.X;
                    newSize.Height -= mouseLocation.Y;
                    this.Location = new Point(this.Location.X, this.Location.Y + mouseLocation.Y);
                    break;
                case MouseLocationStyle.S21_MiddleLeft:
                    //左中
                    newSize.Width -= mouseLocation.X;
                    this.Location = new Point(this.Location.X + mouseLocation.X, this.Location.Y);
                    break;
                case MouseLocationStyle.S22_MiddelCenter:
                    //中中【无需调整】
                    break;
                case MouseLocationStyle.S23_RightMiddel:
                    //中右
                    newSize.Width = mouseLocation.X;
                    break;
                case MouseLocationStyle.S31_LeftBottom:
                    //左下
                    newSize.Width -= mouseLocation.X;
                    newSize.Height = mouseLocation.Y;
                    this.Location = new Point(this.Location.X + mouseLocation.X, this.Location.Y);
                    break;
                case MouseLocationStyle.S32_CenterBottom:
                    //中下
                    newSize.Height = mouseLocation.Y;
                    break;
                case MouseLocationStyle.S33_RightBottom:
                    //右下
                    newSize.Width = mouseLocation.X;
                    newSize.Height = mouseLocation.Y;
                    break;
            }
            if (newSize.Width>250&&newSize.Height>200)
                this.Size = newSize;
          

        }
          
        /// <summary>
        /// 鼠标坐标类型枚举
        /// 【用于调整窗体大小】
        /// 【对应九宫格】
        /// </summary>
        public enum MouseLocationStyle
        {
            S11_LeftTop,
            S12_CenterTop,
            S13_RightTop,
            S21_MiddleLeft,
            S22_MiddelCenter,
            S23_RightMiddel,
            S31_LeftBottom,
            S32_CenterBottom,
            S33_RightBottom
        }

        private void Test_MouseMove(object sender, MouseEventArgs e)
        {
            //鼠标距界面左上角的坐标
            Point  mouseLocation = new Point(Control.MousePosition.X - this.Location.X, Control.MousePosition.Y - this.Location.Y);
            //如果允许调整大小
            if (this.isMouseDown && this.loactionStyle != MouseLocationStyle.S22_MiddelCenter)
            {
                //调整大小
                if (this.LastMoustLocation == null || Math.Abs(this.LastMoustLocation.X - mouseLocation.X) >= 5 || Math.Abs(this.LastMoustLocation.Y - mouseLocation.Y) >= 5)
                {
                    this.ChangeSize(mouseLocation, this.loactionStyle);                   
                    this.LastMoustLocation = new Point(mouseLocation.X, mouseLocation.Y);

                    //this.Text = string.Format("X: {0} Y:{1}", mouseLocation.X, mouseLocation.Y);
                }
            }
            else
            {
                //鼠标位置
                this.loactionStyle = this.GetLocationStyle(mouseLocation);
                this.Cursor = this.GetCursorByMouseLocationStyle(this.loactionStyle);
            }
        }

        private void Test_MouseDown(object sender, MouseEventArgs e)
        {
            isMouseDown = true;
           
        }

        private void Test_MouseUp(object sender, MouseEventArgs e)
        {
            //调用窗体移动的方法           
            isMouseDown = false;           
            this.Cursor = Cursors.Default;
        }
        #endregion

原创粉丝点击