问题描述
- 在运行程序的过程中 修改 控件的大小、位置。也就是说需要修改控件的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; }
}