c# 矩形框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 矩形框相关的知识,希望对你有一定的参考价值。

我现在能实现用鼠标画出一个矩形框,可是每次点击的时候上次的矩形框就消失了,我需要画出多个矩形框,所以要把上次画的要保存下来,这要怎么做?我的代码如下(网上的。。。):
Pen m_pen = new Pen(Color.Blue , 1);

int startx = 0;
int starty = 0;
int endx = 0;
int endy = 0;
bool isdraw = false;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

if (e.Button ==MouseButtons.Left)

startx = e.X;
starty = e.Y;
isdraw = true;





private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

endx = e.X;
endy = e.Y;
if (isdraw)

Refresh();




private void pictureBox1_Paint(object sender, PaintEventArgs e)


Graphics g =e.Graphics;
if (isdraw)


//设置虚线格式
m_pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

int width = Math.Abs(startx - endx);
int height = Math.Abs(starty - endy);
int leftupx = startx;
if (endx < startx)
leftupx = endx;
int leftupy = starty;
if (endy < starty)
leftupy = endy;

g.DrawRectangle(m_pen, leftupx, leftupy, width, height);




private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

isdraw = false;


-------------------
还有个问题,假设我已经画出多个矩形框,我在其中一个矩形框上点右键,这一个矩形框就会消失,其他的不动,怎么实现?
-------------
我要画十几个矩形,不是要创建十几个对象了吗?。。。有点夸张吧。
----------------------
非常感谢你们的关注,我用数组实现多个矩形框,第二个问题还是没有办法实现:我已经画出多个矩形框,我在其中一个矩形框上点右键,这一个矩形框就会消失,其他的不动,怎么实现?

你应该把矩形的数据保留起来,在 Paint 中重画
如使用 List<Rectangle> 类型数据

Rectangle 类型包括一个 Rectangle.Contains (Point) 的方法,此方法可以确定指定的点是否包含在此 Rectangle 结构内。
你只要在 MouseDown 事件里,判断 e.Button==MouseButtons.Right 为右键
通过一个 for 中使用 Rectangle.Contains (Point) 方法在数组中找到那个矩形,然后从数组中删除,然后使用 pictureBox1.Invalidate () 要求重画就OK了
参考技术A 创建一个于画图工作区大小一致的BITMAP对象。获取在窗口上的操作,在BITMAP上画图,再显示在窗口里。

只要一个对象呀。。只要对一个BITMAP画就OK

楼下的是LIST是用于保存数据的

每次操作都会触发Paint事件,处理OnPaint事件

c# PictureBox 的图像上使用鼠标画矩形框

   C# 中在图像上画框,通过鼠标来实现主要有四个消息响应函数MouseDown, MouseMove, MouseUp, Paint重绘函数实现。当鼠标键按下时开始画框,鼠标键抬起时画框结束。

Point start; //画框的起始点
Point end,//画框的结束点
bool blnDraw;//判断是否绘制
Rectangel rect;

  鼠标按下响应

private void PictureBox1_MouseDown(object sender, MouseEventArgs e)
{
      start = e.Location;
      Invalidate();
      blnDraw = true;
}

 鼠标移动响应 

 private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (blnDraw)
    {
        if (e.Button != MouseButtons.Left)//判断是否按下左键
            return;
        Point tempEndPoint = e.Location; //记录框的位置和大小
        rect.Location = new Point(
        Math.Min(start.X, tempEndPoint.X),
        Math.Min(start.Y, tempEndPoint.Y));
        rect.Size = new Size(
        Math.Abs(start.X - tempEndPoint.X),
        Math.Abs(start.Y - tempEndPoint.Y));
        PictureBox1.Invalidate();
     }
}        

  鼠标键抬起响应

private void PictureBox1_MouseUp(object sender, MouseEventArgs e)
 {
    blnDraw = false; //结束绘制
 }

 重绘响应

private void imageBox1_Paint(object sender, PaintEventArgs e)
{
     if (blnDraw)
     {
         if (imageBox1.Image != null)
         {
             if (rect != null && rect.Width > 0 && rect.Height > 0)
              {
                  e.Graphics.DrawRectangle(new Pen(Color.Red, 3),rect);//重新绘制颜色为红色
               }
          }
      }

}

 注意:在绘制中如果导入的图像的SizeMode为StretchImage时,画框后图像会缩放,导致框有可能不在pictureBox中,需要将PictureBox的FunctionMode 修改为Minimum 便可。

以上是关于c# 矩形框的主要内容,如果未能解决你的问题,请参考以下文章

如何使用C#实现可拖动的透明矩形框/窗体

如何在winforms c#中从图片框中裁剪和保存非矩形但多边形区域[重复]

c# PictureBox 的图像上使用鼠标画矩形框

删除填充矩形c#

请问c# 中如何实现在PictureBox中通过鼠标拖拽画出矩形框呢?picturebox中的MouseDown和MouseMove如何使用

c# winform中怎么画出圆角矩形或者就有这样的控件,求指点