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动态的文字效果
效果图如下
随机推荐
- JavaScript中知而不全的this
都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言.它把 函数式编程和 面向对象编程糅合一起,再加上 动态语言特性,简直强大无比(其实是不能和C++比的,^_^ ). 这 ...
- 搞ACM的你伤不起[转自RoBa]------(看一次,笑一次)
RoBa原创,转载请注明出处 劳资六年前开始搞ACM啊!!!!!!!!!! 从此踏上了尼玛不归路啊!!!!!!!!!!!! 谁特么跟劳资讲算法是程序设计的核心啊!!!!!! 尼玛除了面试题就没见过用 ...
- [原创]基于rsync算法的目的性改进-RexSync
rsync是一种文件差异传输的算法,特点是高效且相似块识别率较高.具体算法这边就不赘述,网上很多,官方文档也描述的很清楚. rsync提高文件比对效率的一个核心算法之一就是rolling checks ...
- Java Generics and Collections-2.1
2.1 子类化以及替换原理 为什么List<Integer> 不是List<Number> 的子类? 首先看下面的代码,这段代码是编译不过的 package java_gene ...
- java设计模式之中介者模式
中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式UML图 中介者模式代码 package com ...
- Merge k Sorted Lists
1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...
- 一维码:EAN-13码的识别
1.一维码简述: 一维条码是一种能用于信息编码和信息自动识别的标准符号,是由一组宽度不同的黑白符号按一定规则交替排列编码组成的图形符号,用于表示一定的信息. 码制指条码符号的类型,不同的类型有不同的编 ...
- 一种全新的屏幕适配方法 自动百分比适配 一切px说了算
看hongyang的博客 发现他的一个按百分比适配的方案 : 库地址https://github.com/hongyangAndroid/AndroidAutoLayout 博客地址http://bl ...
- Computer vision labs
积累记录一些视觉实验室,方便查找 1. 多伦多大学计算机科学系 2. 普林斯顿大学计算机视觉和机器人实验室 3. 牛津大学Torr Vision Group 4. 伯克利视觉和学习中心 Pro ...
- Ubuntu 下配置apache和APR
软件环境:ubuntu14.04 虚拟机Vmware 软件:http://httpd.apache.org/ httpd-2.2.29.tar.gz 不需要单独下载APR. 1.解压apach ...