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;
-------------------
还有个问题,假设我已经画出多个矩形框,我在其中一个矩形框上点右键,这一个矩形框就会消失,其他的不动,怎么实现?
-------------
我要画十几个矩形,不是要创建十几个对象了吗?。。。有点夸张吧。
----------------------
非常感谢你们的关注,我用数组实现多个矩形框,第二个问题还是没有办法实现:我已经画出多个矩形框,我在其中一个矩形框上点右键,这一个矩形框就会消失,其他的不动,怎么实现?
如使用 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# 矩形框的主要内容,如果未能解决你的问题,请参考以下文章
如何在winforms c#中从图片框中裁剪和保存非矩形但多边形区域[重复]
请问c# 中如何实现在PictureBox中通过鼠标拖拽画出矩形框呢?picturebox中的MouseDown和MouseMove如何使用