c# winform 动态画矩形 矩形大小可以拖动
画一个矩形,然后在mousedown时,判断鼠标是否在区域内,如果在,就在四个角画四个小正方形,然后在mousemove中判断是否在四个方格中,如果在,就出现箭头鼠标,然后做个标记,表示开始调整尺寸
//是否开始画了 bool bDrawStart = false; //矩形的起始点 Point pointStart = Point.Empty; //矩形的起始点的对角点,鼠标移动点 Point pointContinue = Point.Empty; //是否要修改矩形,以鼠标点击点在矩形内部为准,修改时自动在4个端点创建4个小方框,不能创建其他的矩形 bool bChange = false; //修改矩形时移动点的X、Y记录,好根据它在dicPoints找到对应的矩形,或dicPointsChange找到对应小方框 Point pMove1 = Point.Empty; Point pMove2 = Point.Empty; //修改矩形时鼠标点击进4个小方框内,确认要根据鼠标移动修改 bool bChangeMove = false; //当前全部创建的矩形的记录 Dictionary<Point, Point> dicPoints = new Dictionary<Point, Point>(); //矩形要修改大小时4个端点创建4个小方框的记录 Dictionary<Point, Point> dicPointsChange = new Dictionary<Point, Point>(); private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (bDrawStart) { bDrawStart = false; } else { bDrawStart = true; pointStart = e.Location; } if (bChange) { bDrawStart = false; foreach (var item in dicPointsChange) { Point p1 = item.Key; Point p2 = item.Value; //如果在4个小框里 if ((e.Location.X > p1.X && e.Location.X < p2.X && e.Location.Y > p1.Y && e.Location.Y < p2.Y) || (e.Location.X > p2.X && e.Location.X < p1.X && e.Location.Y > p2.Y && e.Location.Y < p1.Y) || (e.Location.X > p2.X && e.Location.X < p1.X && e.Location.Y > p1.Y && e.Location.Y < p2.Y) || (e.Location.X > p1.X && e.Location.X < p2.X && e.Location.Y > p2.Y && e.Location.Y < p1.Y)) { bChangeMove = true; //p1、p2为小方框的对角点,中心点为矩形的端点,首先获取端点, //然后根据pMove1,pMove2确定小方框在的端点是矩形的哪个端点 //最后确定起始点,起始点pointStart为移动点(鼠标点击点、小方框在的端点)的对角点 //pointContinue为移动点(鼠标点击点、小方框在的端点) Point p = Point.Empty; p.X = p1.X > p2.X ? p1.X - : p1.X + ; p.Y = p1.Y > p2.Y ? p1.Y - : p1.Y + ; if (p == pMove1) { pointStart = pMove2; } else if (p == pMove2) { pointStart = pMove1; } else if (p == new Point(pMove1.X, pMove2.Y)) { pointStart = new Point(pMove2.X, pMove1.Y); } else if (p == new Point(pMove2.X, pMove1.Y)) { pointStart = new Point(pMove1.X, pMove2.Y); } break; } } //如果没点击4个小方框,则默认放弃修改 if (!bChangeMove) { bDrawStart = true; dicPointsChange.Clear(); bChange = false; } } else { foreach (var item in dicPoints) { Point p1 = item.Key; Point p2 = item.Value; if ((e.Location.X > p1.X && e.Location.X < p2.X && e.Location.Y > p1.Y && e.Location.Y < p2.Y) || (e.Location.X > p2.X && e.Location.X < p1.X && e.Location.Y > p2.Y && e.Location.Y < p1.Y) || (e.Location.X > p2.X && e.Location.X < p1.X && e.Location.Y > p1.Y && e.Location.Y < p2.Y) || (e.Location.X > p1.X && e.Location.X < p2.X && e.Location.Y > p2.Y && e.Location.Y < p1.Y)) { bChange = true; bDrawStart = false; //不能画新矩形了 dicPointsChange.Clear(); pMove1 = p1; pMove2 = p2; //画出点击矩形的4个端点的4个小方框,并记录入dicPointsChange Graphics g = pictureBox1.CreateGraphics(); System.Drawing.Pen pen = new System.Drawing.Pen(Color.Red); g.DrawRectangle(pen, p1.X - , p1.Y - , , ); g.DrawRectangle(pen, p2.X - , p2.Y - , , ); g.DrawRectangle(pen, p1.X - , p2.Y - , , ); g.DrawRectangle(pen, p2.X - , p1.Y - , , ); pen.Dispose(); dicPointsChange.Add(new Point(p1.X - , p1.Y - ), new Point(p1.X + , p1.Y + )); dicPointsChange.Add(new Point(p2.X - , p2.Y - ), new Point(p2.X + , p2.Y + )); dicPointsChange.Add(new Point(p2.X - , p1.Y - ), new Point(p2.X + , p1.Y + )); dicPointsChange.Add(new Point(p1.X - , p2.Y - ), new Point(p1.X + , p2.Y + )); break; } } } } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (bDrawStart) { pointContinue = e.Location; Refresh(); } if (bChangeMove) { pointContinue = e.Location; Point p = Point.Empty; foreach (var item in dicPoints) { Point p1 = item.Key; Point p2 = item.Value; //找到dicPoints里的原始记录 if (p1 == pointStart || p2 == pointStart || new Point(p1.X, p2.Y) == pointStart || new Point(p2.X, p1.Y) == pointStart) { p = p1; break; } } if (p != Point.Empty) { //先删除dicPoints里的原始记录,再根据新点创建新的记录 dicPoints.Remove(p); dicPoints.Add(pointStart, pointContinue); dicPointsChange.Clear(); Point p1 = pointStart; Point p2 = pointContinue; //移动过程即时创建4个小方框,看起来小方框和矩形一起变大变小的效果 dicPointsChange.Add(new Point(p1.X - , p1.Y - ), new Point(p1.X + , p1.Y + )); dicPointsChange.Add(new Point(p2.X - , p2.Y - ), new Point(p2.X + , p2.Y + )); dicPointsChange.Add(new Point(p2.X - , p1.Y - ), new Point(p2.X + , p1.Y + )); dicPointsChange.Add(new Point(p1.X - , p2.Y - ), new Point(p1.X + , p2.Y + )); Refresh(); } } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { if (bDrawStart) { //此时矩形画完,记录矩形两个对角点,在Paint里画 dicPoints.Add(pointStart, pointContinue); } if (bChangeMove) { bChangeMove = false; bChange = false; } bDrawStart = false; } private void pictureBox1_Paint(object sender, PaintEventArgs e) { System.Drawing.Pen pen = new System.Drawing.Pen(Color.LimeGreen); pen.Width = ; if (bDrawStart) { //实时的画矩形 Graphics g = e.Graphics; g.DrawRectangle(pen, pointStart.X, pointStart.Y, pointContinue.X - pointStart.X, pointContinue.Y - pointStart.Y); } //实时的画之前已经画好的矩形 foreach (var item in dicPoints) { Point p1 = item.Key; Point p2 = item.Value; e.Graphics.DrawRectangle(pen, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y); } if (bChangeMove) { pen.Color = Color.Red; foreach (var item in dicPointsChange) { Point p1 = item.Key; Point p2 = item.Value; e.Graphics.DrawRectangle(pen, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y); } } pen.Dispose(); }
c# winform 动态画矩形 矩形大小可以拖动的更多相关文章
- WinForm动态查询
WinForm 动态查询 1. 使用场景 在对数据进行筛选, 包含多个筛选字段时适用. 2. 接口设计 /// <summary> /// 定义可作为追加到 WHERE 子句的控件接口 / ...
- 算法(第四版)学习笔记之java实现可以动态调整数组大小的栈
下压(LIFO)栈:可以动态调整数组大小的实现 import java.util.Iterator; public class ResizingArrayStack<Item> imple ...
- Winform 动态 画图 不闪
一.问题:解决winform动态画图闪的问题,网上搜的方法,大部分都是: “this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlSty ...
- rem布局和使用js rem动态改变字体大小,自适应
解决rem文字动态改变字体大小: <script> console.log(window.devicePixelRatio); var iScale = 1; iScale = iScal ...
- winform建立非矩形窗体
非规则窗体可能会需要加的功能代码: 1:因为没有了最上边的标题栏,所以需要加窗体鼠标拖动功能,在Form里面加如下代码: #region 移动窗体 // 移动窗体 const int WM_NCLBU ...
- Wordpress编辑器(Tinymce)在Chrome中动态修改图片大小
Chrome不支持tinymce中图片动态修改大小,可以在theme的functions.php中加入下面代码在Tinymce中模拟这一功能: function tinymce_editor_sett ...
- C# WinForm动态添加MSChart控件
添加mschart.dll动态链接库 添加引用 System.Windows.Forms.DataVisualization MSChart控件作为方便的用户数据展示控件,可以方便的使用控件提 ...
- c# winform动态生成控件与获取动态控件输入的值
差不多有2年没有写winform程序,一直都是写bs.最近项目需要,又开始着手写一个小功能的winform程序,需要动态获取xml文件的节点个数,生成跟节点个数一样的textbox, 最后还要获取操作 ...
- winform动态的文字效果
效果图如下
随机推荐
- spring security oauth2.0 实现
oauth应该属于security的一部分.关于oauth的的相关知识可以查看阮一峰的文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html ...
- spring类型自动转换——@InitBinder和Converter
spring有2种类型转换器,一种是propertyEditor,一种是Converter.虽然都是类型转换,但是还是有细微差别. 所以这里以一个例子的形式来分析一下这2种类型转换的使用场景和差别. ...
- KAFKA一异常处理记录
kafka-console-consumer.sh --topic TOPIC_KEYWORD --from-beginning --zookeeper localhost报异常,Exception ...
- 关于Web报表FineReport打印的开发应用案例
报表打印是报表使用和开发过程中经常碰到的问题,这里汇总了关于Web报表开发打印功能的一些典型应用案例,以应用最广泛的FineReport为例. 案例一:java直接调用报表打印 当java后台定义定时 ...
- 【转载、推荐】不要自称是程序员,我十多年的 IT 职场总结
注评:一气读完后,有些和我的观点类似.这篇文章显然是外国老写的,但是不妨碍我们的跨国交流. 如果我可以给每个工程教育增加一门课,它不会涉及编译器.门电路或是时间复杂度,而是一门介绍行业现实的入门课,因 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
- 与JSP的初次邂逅……
JSP是可以内嵌在网页中,由服务器端来执行与解释的程序,是一种动态网页技术标准. 在传统的HTML文件(*.htm或*.html)中加入Java程序片段和JSP标记,就构成了JSP网页(*.jsp). ...
- Java程序生成exe可执行文件详细教程(图文说明)
ava程序打包成exe可执行文件,分为两大步骤. 第一步:将Java程序通过Eclipse或者Myeclipse导成Jar包 第二步:通过exe4j讲Jar包程序生成exe可执行文件 第一步详解: 将 ...
- 轻松搞懂WebService工作原理
用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助. WebService是基于网络的.分布式的模块化组件. 我们直接来看WebService的一个简易工作流程: ...
- Android与Struts2简单json通信
具体要求是: 服务器端得到客户端传递来的数据,并返回给客户端一条json格式的字符串 闲话不多说,直接上代码 首先是服务器端代码:建立一个web工程,导入struts2和json的jar包,并在web ...