首页 > 编程语言 >C# winform 选中区域

C# winform 选中区域

时间:2022-12-14 14:48:18浏览次数:40  
标签:endPoint C# null Value 选中 new winform startPoint defaultSelection

//设置默认选中区域
var defaultSelection = new Rectangle(5, 5, 200, 200);
makeControlRegionSelectable(pictureBox1, defaultSelection);
void makeControlRegionSelectable(Control control, Rectangle? defaultSelection = null)
        {
            var isMouseDown = false;
            var startPoint = new Point();
            var endPoint = new Point();
            Point? lastStartPoint = null;
            Point? lastEndPoint = null;

            if (defaultSelection != null)
            {
                startPoint = defaultSelection.Value.Location;
                endPoint = new Point(defaultSelection.Value.Left + defaultSelection.Value.Width, defaultSelection.Value.Top + defaultSelection.Value.Height);
            }

            Action<Point,Point> DrawRectangle = delegate (Point start, Point end)
            {
                Graphics g1 = pictureBox1.CreateGraphics();
                g1.Clear(Color.White);
                g1.DrawRectangle(new Pen(Color.Green, 1) { DashStyle = System.Drawing.Drawing2D.DashStyle.Dash }, new Rectangle(start.X, start.Y, end.X - start.X, end.Y - start.Y));
            };

            control.MouseDown += delegate (object sender, MouseEventArgs e) 
            {
                lastStartPoint = startPoint;
                lastEndPoint = endPoint;

                startPoint = e.Location;
                endPoint = startPoint;

                isMouseDown = true;
                control.Capture = true;
            };

            control.MouseUp += delegate (object sender, MouseEventArgs e)
            {
                isMouseDown = false;
                control.Capture = false;

                var minMove = 20;   //设置选中精度
                if (e.Location.X - startPoint.X < minMove && e.Location.Y - startPoint.Y < minMove)
                {
                    if(lastStartPoint != null && lastEndPoint != null)
                    {
                        startPoint = lastStartPoint.Value;
                        endPoint = lastEndPoint.Value;
                        return;
                    }
                }

                endPoint = e.Location;
            };

            control.MouseMove += delegate (object sender, MouseEventArgs e)
            {
                if (isMouseDown)
                    DrawRectangle(startPoint, e.Location);
            };

            //自动重绘
            var timer = new Timer();
            timer.Interval = 100;
            timer.Tick += delegate (object sender, EventArgs e) 
            {
                if (isMouseDown)
                    return;

                if(endPoint != null)
                    DrawRectangle(startPoint, endPoint);
            };
            timer.Start();
        }

 

标签:endPoint,C#,null,Value,选中,new,winform,startPoint,defaultSelection
From: https://www.cnblogs.com/nanfei/p/16982092.html

相关文章

  • Codeforces Round #837 (Div. 2) A-C
    A.HossamandCombinatorics题意:给定一个长度为n的序列,求两个不同位置的数的差值等于所有数差值的最大值的数对数量。分析:显然排序后取最大最小就是差的绝对值最大,再......
  • Cesium地下模式
    Cesium地下模式在一般的业务场景中,例如地下管线这些需要看地下模型的场景时候,需要开启地下模式。而开启地下模式也非常简单开启地下模式注释可见constenterUnderGrou......
  • 邮件安全喜报!Coremail两大方案入选“2022年软件行业典型应用案例”
    12月5日,由中国软件行业协会联合中软国际有限公司、江苏省软件行业协会主办的2022中国程序员节在江苏南京圆满落幕,本次活动聚焦当前我国对数字技术创新及应用发展的现实需求,......
  • SiteFactory支持Word一键导入
    ​ 当前功能基于PHP,其它语言流程大致相同 1.新增上传wordjson配置在ueditor\php\config.json中新增如下配置:     /* 上传word配置 */    "wordAction......
  • 巨蟒python全栈开发数据库前端5:JavaScript1
     1.js介绍&变量&基础数据类型2.类型查询&运算符&if判断&for循环3.while循环&三元运算符4.函数5.今日总结 1.js介绍&变量&基础数据类型js介绍(1)什么是JavaScript&一些历史......
  • Chaos 测试下的若干 NebulaGraph Raft 问题分析
    Raft是一种广泛使用的分布式共识算法。NebulaGraph底层采用Raft算法实现metad和storaged的分布式功能。Raft算法使NebulaGraph中的metad和storaged能够集群......
  • docker-compose + mysql8.x 主从数据库配置
    0.准备(略过docker的安装与镜像拉取)docker/docker-compose安装拉取mysql8.x 1.master和slave的mysql配置master:[mysqld]server-id=11118log-bin=mysql-bi......
  • k8s--service 之 HeadLiness、NodePort 使用
    前戏环境还是使用我们上节的环境HeadLiness在某些场景中,开发人员可能不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这种情况,kubernetes 提供了H......
  • 积极拥抱.NET Core开源社区
    潘正磊在上海的TechSummit2018大会上给我们的.NETCore以及开源情况带来了最新信息。.NetCore开源后取得了更加快速的发展,目前越活跃用户高达400万人,每月新增开发者45......
  • 广州 office365的开发者训练营交流活动简报
    2018年10月13日,在微软广州办公室(广州市天河区太古汇1座28层微软广州办公室)成功举办了office365的开发者训练营,本活动在微软官网的地址:​​https://www.microsoft.com/chi......