http://jhlong12345.blog.163.com/blog/static/1230631292015544450189/# 
结合上一篇,继续
矩形大小的调整
 
还有小bug,思路有了,就行了,就不贴修改正常的代码了,自己动动手,有思路基本都可以很快写出来的
 
思路:

画一个矩形,然后在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 动态画矩形 矩形大小可以拖动的更多相关文章

  1. WinForm动态查询

    WinForm 动态查询 1. 使用场景 在对数据进行筛选, 包含多个筛选字段时适用. 2. 接口设计 /// <summary> /// 定义可作为追加到 WHERE 子句的控件接口 / ...

  2. 算法(第四版)学习笔记之java实现可以动态调整数组大小的栈

    下压(LIFO)栈:可以动态调整数组大小的实现 import java.util.Iterator; public class ResizingArrayStack<Item> imple ...

  3. Winform 动态 画图 不闪

    一.问题:解决winform动态画图闪的问题,网上搜的方法,大部分都是: “this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlSty ...

  4. rem布局和使用js rem动态改变字体大小,自适应

    解决rem文字动态改变字体大小: <script> console.log(window.devicePixelRatio); var iScale = 1; iScale = iScal ...

  5. winform建立非矩形窗体

    非规则窗体可能会需要加的功能代码: 1:因为没有了最上边的标题栏,所以需要加窗体鼠标拖动功能,在Form里面加如下代码: #region 移动窗体 // 移动窗体 const int WM_NCLBU ...

  6. Wordpress编辑器(Tinymce)在Chrome中动态修改图片大小

    Chrome不支持tinymce中图片动态修改大小,可以在theme的functions.php中加入下面代码在Tinymce中模拟这一功能: function tinymce_editor_sett ...

  7. C# WinForm动态添加MSChart控件

    添加mschart.dll动态链接库 添加引用 System.Windows.Forms.DataVisualization     MSChart控件作为方便的用户数据展示控件,可以方便的使用控件提 ...

  8. c# winform动态生成控件与获取动态控件输入的值

    差不多有2年没有写winform程序,一直都是写bs.最近项目需要,又开始着手写一个小功能的winform程序,需要动态获取xml文件的节点个数,生成跟节点个数一样的textbox, 最后还要获取操作 ...

  9. winform动态的文字效果

    效果图如下

随机推荐

  1. Resize Instance 操作详解 - 每天5分钟玩转 OpenStack(41)

    Resize 的作用是调整 instance 的 vCPU.内存和磁盘资源. Instance 需要多少资源是定义在 flavor 中的,resize 操作是通过为 instance 选择新的 fla ...

  2. Chrome/Firefox 中头toFixed方法四舍五入兼容性问题

    每个Number的toFixed()方法可把 Number 四舍五入为指定小数位数的数字.四舍五入顾名思义,4及以下舍去,5及以上加1. 四舍 1.31.toFixed(1) // 1.3 1.32. ...

  3. 理解 Node.js 里的 process.nextTick()

    有很多人对Node.js里process.nextTick()的用法感到不理解,下面我们就来看一下process.nextTick()到底是什么,该如何使用. Node.js是单线程的,除了系统IO之 ...

  4. find

    语法:find [路径] [参数] [action] -name filename,查找名为filename的文件 -iname filename,查找名为filename的文件,但是不区分大小写 - ...

  5. 如何在github中创建演示demo

    在项目中创建一个新的gh-pages分支: 将你想要展示的示例demo上传到改分支,具体操作就看你自己啦,是merge其他分支的过来还是重新写代码都可以. 最后,通过http://<userna ...

  6. Java的String中的subString()方法

    方法如下: public String substring(int beginIndex, int endIndex) 第一个int为开始的索引,对应String数字中的开始位置, 第二个是截止的索引 ...

  7. POJ1273Drainage Ditches[最大流]

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 71559   Accepted: 2784 ...

  8. P1774 最接近神的人_NOI导刊2010[树状数组 逆序对 离散化]

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的 ...

  9. 从客户端(Content="<EM ><STRONG ><U >这是测试这...")中检测到有潜在危险的Request.Form 值。

    说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止.该值可能指示存在危及应用程序安全的尝试,如跨站点脚本攻击.若要允许页面重写应用程序请求验证设置,请将 httpRuntime  ...

  10. echo print() print_r() var_dump()的区别

    常用调试方法 echo()可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用. print()函数 ...