C#winform运行时拉伸、移动控件

问题描述

  • 在运行程序的过程中 修改 控件的大小、位置。也就是说需要修改控件的Location(位置)、Size(大小)两个属性的值
  • 我这边采取的方式时直接通过鼠标拉伸边框,移动操作

解决问题思路

  • 假如需要通过鼠标进行移动、拉伸控件,则需要实现MouseMove、MouseLeave两个事件
  • MouseMove用于拉伸、移动控件
  • MouseLeave用于确保鼠标还在控件里面

效果展示

使用代码的效果图

解决问题

  • 可以通过Cursor.Position获取鼠标的移动方向
  • 下面代码中Offset是鼠标变化的偏移量,用于判断鼠标是否处于控件边缘,定义 int Offset=20(按实际情况填写)
		/// <summary>
        /// 对控件创建相关鼠标事件
        /// </summary>
        /// <param name="control"></param>
        private void CreateEvent(Control control)
        {
            Point Position = Point.Empty;
            control.MouseMove += (sender, e) =>
            {
                //控件大小
                var Size = control.Size;
                //在控件中的相对位置
                var Location = e.Location;

                //取中间的点
                var centreX = Size.Width / 2;
                var centreY = Size.Height / 2;

                //查看鼠标是否处于控件 上边
                var IsUp = Location.Y <= Offset;
                //查看鼠标是否处于控件 下边
                var IsDown = Location.Y >= Size.Height - Offset;
                //查看鼠标是否处于控件 左边
                var IsLeft = Location.X <= Offset;
                //查看鼠标是否处于控件 右边
                var IsRight = Location.X >= Size.Width - Offset;

                if (Location.X <= Offset && Location.Y <= Offset)
                {
                    if (Cursor.Current.Equals(Cursors.SizeAll) && e.Button.Equals(MouseButtons.Left))
                    {
                        //算两次鼠标移动的距离
                        var AddY = Cursor.Position.Y - Position.Y;
                        var AddX = Cursor.Position.X - Position.X;
                        //调整位置
                        control.Location = new Point(control.Location.X + AddX, control.Location.Y + AddY);
                    }
                    Position = Cursor.Position;
                    Cursor.Current = Cursors.SizeAll;
                }
                else if (Math.Abs(centreX - Location.X) <= Offset && (IsUp || IsDown))
                {
                    if (Cursor.Current.Equals(Cursors.SizeNS) && e.Button.Equals(MouseButtons.Left))
                    {
                        var AddY = Cursor.Position.Y - Position.Y;
                        if (IsUp)
                        {
                            control.Top += AddY;
                            AddY = -AddY;
                        }
                        if (Size.Height + AddY >= 0)
                        {
                            control.Size = new Size(Size.Width, Size.Height + AddY);
                        }
                    }
                    Position = Cursor.Position;
                    Cursor.Current = Cursors.SizeNS;
                }
                else if (Math.Abs(centreY - Location.Y) <= Offset && (IsLeft || IsRight))
                {
                    if (Cursor.Current.Equals(Cursors.SizeWE) && e.Button.Equals(MouseButtons.Left))
                    {
                        var AddX = Cursor.Position.X - Position.X;
                        if (IsLeft)
                        {
                            control.Left += AddX;
                            AddX = -AddX;
                        }
                        if (Size.Width + AddX >= 0)
                        {
                            control.Size = new Size(Size.Width + AddX, Size.Height);
                        }
                    }
                    Position = Cursor.Position;
                    Cursor.Current = Cursors.SizeWE;
                }
                else
                {
                    Cursor.Current = Cursors.Default;
                }
            };

            control.MouseLeave += (sender, ee) =>
            {
                Cursor.Current = Cursors.Default;
            };
        }

完整代码类(复制可用)

/// <summary>
    /// 缩放、移动控件
    /// </summary>
    public class ScaleMoveControl
    {
        /// <summary>
        /// 实例化
        /// </summary>
        /// <param name="Controls"></param>
        public ScaleMoveControl(params Control[] Controls)
        {
            Offset = 20;
            IsCanOperate = true;
            foreach (var control in Controls)
            {
                CreateEvent(control);
            }
        }

        /// <summary>
        /// 对控件创建相关鼠标事件
        /// </summary>
        /// <param name="control"></param>
        private void CreateEvent(Control control)
        {
            Point Position = Point.Empty;
            control.MouseMove += (sender, e) =>
            {
                if (!IsCanOperate)
                {
                    return;
                }
                //控件大小
                var Size = control.Size;
                //在控件中的相对位置
                var Location = e.Location;

                //取中间的点
                var centreX = Size.Width / 2;
                var centreY = Size.Height / 2;

                //查看鼠标是否处于控件 上边
                var IsUp = Location.Y <= Offset;
                //查看鼠标是否处于控件 下边
                var IsDown = Location.Y >= Size.Height - Offset;
                //查看鼠标是否处于控件 左边
                var IsLeft = Location.X <= Offset;
                //查看鼠标是否处于控件 右边
                var IsRight = Location.X >= Size.Width - Offset;

                if (Location.X <= Offset && Location.Y <= Offset)
                {
                    if (Cursor.Current.Equals(Cursors.SizeAll) && e.Button.Equals(MouseButtons.Left))
                    {
                        //算两次鼠标移动的距离
                        var AddY = Cursor.Position.Y - Position.Y;
                        var AddX = Cursor.Position.X - Position.X;
                        //调整位置
                        control.Location = new Point(control.Location.X + AddX, control.Location.Y + AddY);
                    }
                    Position = Cursor.Position;
                    Cursor.Current = Cursors.SizeAll;
                }
                else if (Math.Abs(centreX - Location.X) <= Offset && (IsUp || IsDown))
                {
                    if (Cursor.Current.Equals(Cursors.SizeNS) && e.Button.Equals(MouseButtons.Left))
                    {
                        var AddY = Cursor.Position.Y - Position.Y;
                        if (IsUp)
                        {
                            control.Top += AddY;
                            AddY = -AddY;
                        }
                        if (Size.Height + AddY >= 0)
                        {
                            control.Size = new Size(Size.Width, Size.Height + AddY);
                        }
                    }
                    Position = Cursor.Position;
                    Cursor.Current = Cursors.SizeNS;
                }
                else if (Math.Abs(centreY - Location.Y) <= Offset && (IsLeft || IsRight))
                {
                    if (Cursor.Current.Equals(Cursors.SizeWE) && e.Button.Equals(MouseButtons.Left))
                    {
                        var AddX = Cursor.Position.X - Position.X;
                        if (IsLeft)
                        {
                            control.Left += AddX;
                            AddX = -AddX;
                        }
                        if (Size.Width + AddX >= 0)
                        {
                            control.Size = new Size(Size.Width + AddX, Size.Height);
                        }
                    }
                    Position = Cursor.Position;
                    Cursor.Current = Cursors.SizeWE;
                }
                else
                {
                    Cursor.Current = Cursors.Default;
                }
            };

            control.MouseLeave += (sender, ee) =>
            {
                if (!IsCanOperate)
                {
                    return;
                }
                Cursor.Current = Cursors.Default;
            };
        }

        /// <summary>
        /// 鼠标变化的偏移量(默认20)
        /// </summary>
        public int Offset { get; set; }

        /// <summary>
        /// 是否可以移动,缩放控件(默认true)
        /// </summary>
        public bool IsCanOperate { get; set; }
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值