在picturebox上绘制矩形 - 如何限制矩形区域?

时间:2011-08-24 19:28:13

标签: c# winforms

我在带有鼠标事件的图片框上绘制矩形:

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。

我的问题是什么?

我可以绘制边框在图片框区域外的边框:

enter image description here

如何限制图片框边框的矩形区域是矩形的最大允许位置?

抱歉我的英文,我希望你能理解我的问题:) 所以我希望有这样的东西:

enter image description here

4 个答案:

答案 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();
    }

有人可以发现这个解决方案更有用