我在带有鼠标事件的图片框上绘制矩形:
private void StreamingWindow_MouseDown(object sender, MouseEventArgs e)
{
rect = new Rectangle(e.X, e.Y, 0, 0);
this.Invalidate();
}
private void StreamingWindow_Paint(object sender, PaintEventArgs e)
{
if (painting == true)
{
using (Pen pen = new Pen(Color.Red, 2))
{
e.Graphics.DrawRectangle(pen, rect);
}
}
}
private void StreamingWindow_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// Draws the rectangle as the mouse moves
rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top);
}
this.Invalidate();
}
绘制矩形后,我可以在其中捕获,并保存为jpg。
我的问题是什么?
我可以绘制边框在图片框区域外的边框:
如何限制图片框边框的矩形区域是矩形的最大允许位置?
抱歉我的英文,我希望你能理解我的问题:) 所以我希望有这样的东西:
答案 0 :(得分:2)
private void StreamingWindow_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
// Draws the rectangle as the mouse moves
rect = new Rectangle(rect.Left, rect.Top, Math.Min(e.X - rect.Left, pictureBox1.ClientRectangle.Width - rect.Left), Math.Min(e.Y - rect.Top, pictureBox1.ClientRectangle.Height - rect.Top));
}
this.Invalidate();
}
答案 1 :(得分:0)
我想说实现这一目标的最简单方法,我个人认为从UX
角度来看更自然的方法是:在MouseUp
之后检查矩形的BottomLeft
角是否在区域之外如果是这样的话,只需将它“拉回”并将其与图片框的角度对齐,就像绘制一样。
修改强>
只是为了让你知道我在说什么,一个伪代码
private void StreamingWindow_MouseUp(object sender, MouseEventArgs e)
{
if(rect.Right > myPictureBox.ClientRectangle.Right)
{
rect.Width = myPictureBox.Right - rect.Left - someoffset;
}
if(rect.Bottom > myPictureBox.ClientRectangle.Bottom)
{
rect.Height= myPictureBox.Bottom - rect.Top - someoffset;
}
}
像这样的东西。但你需要检查一下。
答案 2 :(得分:0)
为什么不将矩形坐标设置为
rect = new Rectangle(min(e.X, pictureBoxX), min(e.Y, pictureBoxY), 0, 0);
您需要根据图片框的位置和位置计算pictureX和pictureY。
答案 3 :(得分:0)
解决这个问题的另一种方法是防止矩形被淹没在pictureBox控件之外
private void StreamingWindow_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (e.X < StreamingWindow.Width && Math.Abs(e.Y) < StreamingWindow.Height)
// Draws the rectangle as the mouse moves
rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y -rect.Top);
}
this.Invalidate();
}
有人可以发现这个解决方案更有用