当我尝试运行此代码时,输出的行为是意外的,我认为代码是正确的。 如果有人有洞察力,请帮助我解决这个问题。
我尝试调整代码以不同的方式解决问题,但没有成功。 主要问题应该出在 MouseMove 事件中,但我看不到故障。
namespace Personal.Forms
{
public partial class NewMainForm : Form
{
private const int BorderWidth = 5;
private bool isResizing = false;
private Point lastMousePosition;
private Size originalSize;
public NewMainForm()
{
InitializeComponent();
InitializeFormEvents();
}
private void InitializeFormEvents()
{
this.MouseDown += MainForm_MouseDown;
this.MouseMove += MainForm_MouseMove;
this.MouseUp += MainForm_MouseUp;
}
private void MainForm_MouseDown(object? sender, MouseEventArgs e)
{
if (IsOnBorder(e.Location))
{
isResizing = true;
lastMousePosition = e.Location;
originalSize = this.Size;
}
}
private void MainForm_MouseMove(object? sender, MouseEventArgs e)
{
if (isResizing)
{
int deltaX = e.X - lastMousePosition.X;
int deltaY = e.Y - lastMousePosition.Y;
if (lastMousePosition.X < BorderWidth)
{
// Adjust left side
this.Width = Math.Max(originalSize.Width - deltaX, this.MinimumSize.Width);
this.Left += originalSize.Width - this.Width;
}
else if (lastMousePosition.X > this.Width - BorderWidth)
{
// Adjust right side
this.Width = Math.Max(originalSize.Width + deltaX, this.MinimumSize.Width);
}
if (lastMousePosition.Y < BorderWidth)
{
// Adjust top side
this.Height = Math.Max(originalSize.Height - deltaY, this.MinimumSize.Height);
this.Top += originalSize.Height - this.Height;
}
else if (lastMousePosition.Y > this.Height - BorderWidth)
{
// Adjust bottom side
this.Height = Math.Max(originalSize.Height + deltaY, this.MinimumSize.Height);
}
lastMousePosition = e.Location;
}
else if (IsOnBorder(e.Location))
{
this.Cursor = Cursors.SizeAll;
}
else
{
this.Cursor = Cursors.Default;
}
}
private void MainForm_MouseUp(object? sender, MouseEventArgs e)
{
isResizing = false;
}
private bool IsOnBorder(Point point)
{
return point.X < BorderWidth || point.X > this.Width - BorderWidth ||
point.Y < BorderWidth || point.Y > this.Height - BorderWidth;
}
}
}
我建议采取稍微不同的方法。让我们将以下声明添加到表单中:
private const int BorderWidth = 5;
private enum Border
{
None,
Near, // left or top
Far // right or bottom
}
private bool _isResizing, _isMoving;
private Border _borderX, _borderY;
private Point _distanceToBorder;
Border
枚举指示哪个边界受到影响。我们在MouseDown
事件中确定:
private void FormBorderlessResize_MouseDown(object sender, MouseEventArgs e)
{
if (e.Location.X < BorderWidth) {
_borderX = Border.Near;
_distanceToBorder.X = MousePosition.X - Left;
} else if (e.Location.X > Width - BorderWidth) {
_borderX = Border.Far;
_distanceToBorder.X = Right - MousePosition.X;
} else {
_borderX = Border.None;
}
if (e.Location.Y < BorderWidth) {
_borderY = Border.Near;
_distanceToBorder.Y = MousePosition.Y - Top;
} else if (e.Location.Y > Height - BorderWidth) {
_borderY = Border.Far;
_distanceToBorder.Y = Bottom - MousePosition.Y;
} else {
_borderY = Border.None;
}
_isResizing = _borderX != Border.None || _borderY != Border.None;
}
private void FormBorderlessResize_MouseUp(object sender, MouseEventArgs e)
{
_isResizing = false;
}
请注意,我正在存储鼠标光标到受影响(即移动)边框的距离。为此,我使用
MousePosition
给出的屏幕坐标。它产生比受表单移动影响的本地鼠标坐标更稳定的位置。我们得到的距离本身就是一个荒谬的数字,但这并不重要,因为我们只需要相对测量值。
移动鼠标变成:
private void FormBorderlessResize_MouseMove(object sender, MouseEventArgs e)
{
if (_isResizing && !_isMoving) {
_isMoving = true;
try {
switch (_borderX) {
case Border.Near:
int right = Right;
Width = Math.Max(MinimumSize.Width, Right - MousePosition.X + _distanceToBorder.X);
Left = right - Width;
break;
case Border.Far:
Width = MousePosition.X + _distanceToBorder.X - Left;
break;
}
switch (_borderY) {
case Border.Near:
int bottom = Bottom;
Height = Math.Max(MinimumSize.Height, Bottom - MousePosition.Y + _distanceToBorder.Y);
Top = bottom - Height;
break;
case Border.Far:
Height = MousePosition.Y + _distanceToBorder.Y - Top;
break;
}
} finally {
_isMoving = false;
}
}
}