c# - 如何使用 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
}
但是,当移动到原始锚点的左侧时,这导致在屏幕上向左推一条垂直线。由于某种原因,宽度没有正确更新。
解决方案
问题中提出的解决方案看起来不错:
_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;
WhereinitiallySelectedX
和initiallySelectedY
are variables set onMouseDown
。这只是一个粗略的想法。背后的想法是矩形的宽度和高度不能为负!
推荐阅读
- vue.js - 在VueJS中如何确定模板内元素的元素宽度
- reactjs - 为什么我在生产中收到服务器错误(500)?
- r - 如何在列的连接中放置条件
- r - 使用 tidyr,当传播值得到 NA
- php - 根据 Laravel 刀片中的状态过滤结果
- python - PyQt QFileSystemModel 在 MyWindow 中缺少参数?
- android - 具有 76800 字节的 Android TensorFlowLite 缓冲区和具有 307200 字节的 ByteBuffer
- c++ - 模板区分有符号和无符号
- javascript - 无法获取图像的大小,但长度可以吗?
- java - 如何使用流而不是循环来迭代 jsonarray?