您好,我正在编写一些代码来调整无边框表单的大小,但结果是错误的。我找不到问题出在哪里

问题描述 投票:0回答:1

当我尝试运行此代码时,输出的行为是意外的,我认为代码是正确的。 如果有人有洞察力,请帮助我解决这个问题。

我尝试调整代码以不同的方式解决问题,但没有成功。 主要问题应该出在 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;
        }
    }
}
c# winforms mousemove borderless
1个回答
0
投票

我建议采取稍微不同的方法。让我们将以下声明添加到表单中:

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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.