首页 > 解决方案 > 如何使用 C# 在 MouseDown 后沿任何方向绘制矩形?

问题描述

如何在所有方向上绘制一个矩形?当前代码:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    // Starting point of the selection:
    if (e.Button == MouseButtons.Left)
    {
        _selecting = true;
        _selection = new Rectangle(new Point(e.X, e.Y), new Size());
    }
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    // Update the actual size of the selection:
    if (_selecting)
    {
        _selection.Width = e.X - _selection.X;
        _selection.Height = e.Y - _selection.Y;
        pictureBox1.Refresh(); // redraw picturebox

    }
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left && _selecting)
    {
        _selecting = false;
    }
}

这允许我MouseDown然后向下和向右绘制,但我无法在锚点之外的任何其他方向上绘制。如何在任何方向上绘制矩形,例如 Microsoft Paint?

在此处输入图像描述

我第一次尝试:

_selection.Width = Math.Abs(e.X - _selection.X);
_selection.Height = Math.Abs(e.Y - _selection.Y);

但这会产生有趣的镜面效果(这不是我想要的)。然后我尝试了一个简单的转变:

_selection.X = _selection.Left - 5;

这达到了我的预期,并将一个静态矩形向左移动了 5 个单位,所以我认为在 Paint 事件期间不断移动锚点是一件简单的事情:

private void UpdateRectange(Point newPos)
{
    var width = newPos.X - _selection.X;
    var height = newPos.Y - _selection.Y;
    _selection.Width = Math.Abs(width);
    _selection.Height = Math.Abs(height);
    if (width < 0 && height > 0) // move down (+) and left (-)
    {
        //_selection.X = _selection.Left + width;
        _selection.Offset(width, 0);
    }
    uxScreenGrab.Refresh(); // redraw picturebox
}

但是,当移动到原始锚点的左侧时,这导致在屏幕上向左推一条垂直线。由于某种原因,宽度没有正确更新。

在此处输入图像描述

标签: c#.netwinforms

解决方案


问题中提出的解决方案看起来不错:

_selection.Width = Math.Abs(e.X - initiallySelectedX);
_selection.Height = Math.Abs(e.Y - initiallySelectedY);

...但是当 (eX - initialSelectedX) < 0 时,您必须移动矩形的原点

所以可能你想在你的代码中添加这样的东西:

var diffX = e.x - initiallySelectedX;
if (diffX < 0) _selection.X = initiallySelectedX - diffX;
var diffY = e.y - initiallySelectedY;
if (diffY < 0) _selection.Y = initiallySelectedY - diffY;

WhereinitiallySelectedXinitiallySelectedYare variables set onMouseDown。这只是一个粗略的想法。背后的想法是矩形的宽度和高度不能为负!


推荐阅读