0
点赞
收藏
分享

微信扫一扫

自定义窗口交互控件 四:放大长宽超过65535 绘制多线段拖动更改

心如止水_c736 2022-05-06 阅读 51

前面解决了缩放的问题,但用PictureBox显示图像时,受到控件大小的限制,图像的最大放大长宽是受限的:65535

解决思路:通过虚拟一个PictureBox画布 矩形画布 Canvas RectangleF类型,长宽无限制。

下载地址:https://download.csdn.net/download/weixin_42253874/85299154icon-default.png?t=M3K6https://download.csdn.net/download/weixin_42253874/85299154

2022-05-05 16-38-27-313

bandicam 2022-05-05 16-35-33-896

        /// <summary>
        /// 画布大小
        /// </summary>
        private RectangleF Canvas;
        private Bitmap image;

多边形结构体

    /// <summary>
    /// 多边形
    /// </summary>
    public struct PolygonF
    {
       
        public List<PointF> PointFs;
        public static readonly PolygonF Empty;

        public PolygonF(float x,float y)
        {
            PointFs = new List<PointF>();
            PointFs.Add(new PointF(x, y));
        }

        public PolygonF(PointF[] points)
        {
            PointFs = new List<PointF>();
            PointFs.AddRange(points);
            
        }

        public PointF[] points
        {
            get => PointFs.ToArray();
        }

        public void Add(PointF point)
        {
            PointFs.Add(point);
            PointFs.TrimExcess();
        }

        public void AddRange(PointF[] points)
        {
            PointFs.AddRange(points);
            PointFs.TrimExcess();
        }

        public void Replace(int index, PointF point)
        {
            if (PointFs.Count>index)
            {
                PointFs.RemoveAt(index);
                PointFs.Insert(index, point);
            }
            
        }

        public void RemoveLast()
        {
            if (PointFs.Count>3)
            {
                PointFs.RemoveAt(PointFs.Count - 1);
            }
            
        }
        public int Count
        {
            get => PointFs.Count;
        }
        public static bool operator ==(PolygonF left, PolygonF right)
        {
            return left.points == right.points;
        }

        public static bool operator !=(PolygonF left, PolygonF right)
        {
            return !(left == right);
        }
    }

 绘制时判断是画了一个点,还是线,还是三个点以上(面)

               else if (selectrect is PolygonF)
               {
                   if (selectrect.points.Length > 2)
                   {
                       PointF[] points = selectrect.points;
                       PointF[] pos = Array.ConvertAll(points, value => new PointF(value.X / sizeratio + Canvas.X, value.Y / sizeratio + Canvas.Y));
                       
                       e.Graphics.DrawPolygon(MyPens.Select, pos);
                       e.Graphics.DrawEllipse(MyPens.Select,
                           new RectangleF(pos[polygonPoint].X - 10, pos[polygonPoint].Y - 10, 20, 20));
                   }
                   else if (selectrect.points.Length == 2)
                   {
                       PointF[] points = selectrect.points;
                       PointF[] pos = Array.ConvertAll(points, value => new PointF(value.X / sizeratio + Canvas.X, value.Y / sizeratio + Canvas.Y));
                       e.Graphics.DrawLines(MyPens.Select, pos);
                       e.Graphics.DrawEllipse(MyPens.Select,
                           new RectangleF(pos[1].X - 10, pos[1].Y - 10, 20, 20));
                    }
                   else
                   {
                       PointF[] points = selectrect.points;
                       PointF[] pos = Array.ConvertAll(points, value => new PointF(value.X / sizeratio + Canvas.X, value.Y / sizeratio + Canvas.Y));
                       e.Graphics.DrawEllipse(MyPens.Select,
                           new RectangleF(pos[0].X - 10, pos[0].Y - 10, 20, 20));
                    }
               }

绘制时的思路和画圆画矩形一样,但不能通过鼠标松开判断是否结束,这里通过邮件菜单结束

        private void 结束绘制ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            isdrawing = false;
            drawpolygon = false;
            selectrect = null;
            drawrect = null;
        }
举报

相关推荐

0 条评论