c#在pictureBox控件上绘制多个矩形框及删除绘制的矩形框
在pictureBox上每次只绘制一个矩形框,绘制下一个矩形框时上次绘制的矩形框取消,代码如链接:https://www.cnblogs.com/luxiao/p/5625196.html
在绘制矩形框时要在程序中添加鼠标相应的事件MouseDown、MouseUp、MouseMove、Paint。
绘制矩形框的代码如下:
Point start, end;//绘制矩形框的起点和终点
bool blnDraw;//在MouseMove事件中判断是否绘制矩形框
public struct StartAndEndPoint
{
Point Start;
Point End;
}
//绘制矩形起始点和终止点的集合
List<StartAndEndPoint> multiAreaPoint=new List<StartAndEndPoint>(); private void pic_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
start = e.Location;
blnDraw = true;
}
// 点击鼠标右键绘制整个pictureBox区域
if (e.Button == MouseButtons.Right)
{
start = new Point(, );
}
} private void pic_MouseUp(object sender, MouseEventArgs e)
{
PictureBox pic = sender as PictureBox; if (e.Button == MouseButtons.Left)
{
end = e.Location;
blnDraw = false;
}
if (e.Button == MouseButtons.Right)
{
end = new Point(pic.Width, pic.Height);
} if (pic.Image != null)
{
if (start != end)
{
StartAndEndPoint onepoint = new StartAndEndPoint();
onepoint.start = start;
onepoint.end = end; if ((!multiAreaPoint.Contains(onepoint)))
{
multiAreaPoint.Add(onepoint);//添加不同区域起始和终止点的结构体数组
}
}
} //pic.Refresh();
} private void pic_MouseMove(object sender, MouseEventArgs e)
{
if (blnDraw)
{
if (e.Button != MouseButtons.Left)//判断是否按下左键
return;
end = e.Location;
pic.Invalidate();
}
}
private void pic_Paint(object sender, PaintEventArgs e)
{
PictureBox pic = sender as PictureBox; Pen pen = new Pen(Color.Red, );
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;//绘制线的格式
if (blnDraw)
{
if (pic.Image != null)
{
//此处是为了在绘制时可以由上向下绘制,也可以由下向上绘制
e.Graphics.DrawRectangle(pen, Math.Min(start.X, end.X), Math.Min(start.Y, end.Y), Math.Abs(start.X - end.X), Math.Abs(start.Y - end.Y));
}
} //将之前绘制的矩形框再次绘制一遍
foreach (StartAndEndPoint points in multiAreaPoint)
{
Point p1 = points.start;
Point p2 = points.end;
e.Graphics.DrawRectangle(pen, Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y), Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y));
} pen.Dispose();
}
多个矩形框绘制相对于绘制单个矩形框而言不能自动取消掉上一次的绘制了,那么如何取消绘制在pictureBox上的矩形框呢?
绘制多个矩形框的原理是将多个起始点与终止点放到数组中,在调用Paint方法时,将这些点重新绘制一遍,那么取消绘制这些矩形就可以将数组中的点删除掉,在调用Paint方法就可以删除这些矩形啦!
代码如下:
multiAreaPoint.Clear();
pic.Refresh();
pic.Refresh();是为了调用Paint方法。
若有不同见解或其他实现方法,欢迎与我交流。
c#在pictureBox控件上绘制多个矩形框及删除绘制的矩形框的更多相关文章
- C#与Halcon联合编程之用PictureBox控件替代HWindowControl控件
在使用HALCON和C#联合编程,有时候要使用halcon的HWindowControl控件,但是我发现,HWindowControl的图片显示控件,不能使用GDI+绘制ROI,不知道为什么,反正我测 ...
- C# Winform学习---MDI窗体的设计,PictureBox控件(图片上一页下一页),Timer控件,MenuStrip控件
一.MDI窗体的设计 1.MDI简介 MDI(Multiple Document Interface)就是所谓的多文档界面,与此对应就有单文档界面 (SDI), 它是微软公司从Windows 2.0下 ...
- C#picturebox控件图片以json格式上传java后台保存
关于winform上传图片到Java后端,保存到数据库,有多种方法,本文主要介绍利用picturebox控件,点击按钮上传图片,将图片转化为base64格式,以json格式上传到Java后台,再从ja ...
- (转)C#picturebox控件使用
PictureBox是C#常用图片空间,本文是学习中搜集网络资料的一些整理和记录 1,PictureBox加载图片 using System.Drawing; //方式1,从图片文件载入 //下面的路 ...
- C# GDI在控件上绘图
本文以以在chart控件上和窗体上画矩形为例子 不多解释了,代码很简单. 还有一些童鞋要别的源码,给我发邮箱吧 using System; using System.Collections.Gener ...
- PictureBox控件鼠标进入的手形改变和提示
PictureBox控件载入了图片后,如果要设置其为链接作用的功能,一般需要当鼠标移动到其上时鼠标自动变为手形以提示用户此时可以点击,如果图形无法方便辨识链接的具体功能,最好此时给与一定提示. 1.鼠 ...
- 背水一战 Windows 10 (57) - 控件(集合类): ListViewBase - 增量加载, 分步绘制
[源码下载] 背水一战 Windows 10 (57) - 控件(集合类): ListViewBase - 增量加载, 分步绘制 作者:webabcd 介绍背水一战 Windows 10 之 控件(集 ...
- 对话框上动态控件的创建、在Picture Control控件上显示图片
1 MFC对话框之上的动态控件的创建 对话框上的控件是MFC类的一个具体对象. 当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息.响应函数以及变量. 当需要在对话框中动态的创建某个控 ...
- PictureBox控件
PictureBox控件可以显示来自位图.图标或者元文件,以及来自增强的元文件.JPEG.GIF文件的图形,如果控件不足以显示整幅图像,则裁剪图像以适应控件的大小. Sizemode 图片的大小方式 ...
随机推荐
- Excel常用的格式处理
你有没有碰到在Excel中设置了行高自适应后,部分行的行高太小,整体界面不美观的问题呢? 你有没有碰到Excel中的各个sheet页中的各列内容中都有不同个数的回车换行符,内容看起来参差不齐,不美观呢 ...
- new/delete和malloc/free的比较
从C++角度上说,使用new分配堆空间可以调用类的构造函数,而malloc()函数仅仅是一个函数调用,它不会调用构造函数,它所接受的参数是一个unsigned long类型.同样,delete在释放堆 ...
- SpringMVC, Spring和Mybatis整合案例一
一 准备工作 包括:spring(包括springmvc).mybatis.mybatis-spring整合包.数据库驱动.第三方连接池. 二 整合思路 Dao层: 1.SqlMapConfig. ...
- SSM-SpringMVC-23:SpringMVC中初探异常解析器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客要讲的是异常解析器,SimpleMappingExceptionResolver简单映射异常解析器 可 ...
- nexus私服搭建及maven生命周期
一.maven找库流程 从流程上看创建nexus私服,能够优化流程,而且更加快速 二.nexus下载.安装 1.nexus下载地址 https://sonatype-download.global.s ...
- Linux用户登录日志查询
# 1 utmp.wtmp.btmp文件 Linux用户登录信息放在三个文件中: 1 /var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记 ...
- Embedded servlet containers
73. Embedded servlet containers 73.1 Add a Servlet, Filter or Listener to an application There are t ...
- 区分getchar(),getch(),getche()三个函数:
区分getchar(),getch(),getche()三个函数: 第一行是手动输入的,第二行是printf输出的. getch()和getche()这两个函数使用时要包含conio.h头文件: ge ...
- selenium chromedriver与谷歌浏览器版本映射表
chromedriver版本 支持的Chrome版本 v2.35 v62-64 v2.34 v61-63 v2.33 v60-62 v2.32 v59-61 v2.31 v58-60 v2.30 v5 ...
- GitHub 系列之「向GitHub 提交代码」
1.SSH 你拥有了一个 GitHub 账号之后,就可以自由的 clone 或者下载其他项目,也可以创建自己的项目,但是你没法提交代码.仔细想想也知道,肯定不可能随意就能提交代码的,如果随意可以提交代 ...