SelectionBox

SelectionBox

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CanvasDemo.Canvas
{
    public class SelectionBox : Element
    {
        /// <summary>
        /// 是否从左往右选择
        /// </summary>
        public bool IsLeftToRight { get; set; } = true;

        public bool SelectionBoxIsShow { get; set; } = false;

        //框选开始坐标
        Point Start;
        //鼠标中键按下
        bool IsMouseLeftDown = false;

        ElementEditor Editor;

        public SelectionBox(ElementEditor editor, TimCanvas canvas) : base(canvas,nameof(SelectionBox))
        {
            Editor = editor;
        }

        public override void Drawing(Graphics g)
        {
            if (SelectionBoxIsShow == true)
            {
                if (IsLeftToRight == true)
                {
                    g.FillRectangle(new SolidBrush(Color.FromArgb(100, 51, 153, 255)), Viewer.LocalToShow(Rect));
                    g.DrawRectangle(new Pen(Color.FromArgb(255, 51, 153, 255)), Viewer.LocalToShow(Rect));
                }
                else
                {
                    g.FillRectangle(new SolidBrush(Color.FromArgb(100, 153, 255, 51)), Viewer.LocalToShow(Rect));
                    g.DrawRectangle(new Pen(Color.FromArgb(255, 153, 255, 51)), Viewer.LocalToShow(Rect));
                }

            }
        }

        public void MouseDown(MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                IsMouseLeftDown = true;
                Start = Viewer.MousePointToLocal(e.Location);
                Rect.Width = 0;
                Rect.Height = 0;
                SelectionBoxIsShow = true;
            }
        }

        public void MouseMove(MouseEventArgs e)
        {
            //比例缩放后结束坐标也要做调整
            if (IsMouseLeftDown == true)
            {
                var end = Viewer.MousePointToLocal(e.Location);

                IsLeftToRight = Start.X < end.X;

                Rect.X = Start.X < end.X ? Start.X : end.X;
                Rect.Y = Start.Y < end.Y ? Start.Y : end.Y;

                Rect.Width = Math.Abs(Start.X - end.X);
                Rect.Height = Math.Abs(Start.Y - end.Y);
            }
        }

        public void MouseUp(MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                IsMouseLeftDown = false;
                SelectionBoxIsShow = false;

                var end = Viewer.MousePointToLocal(e.Location);
        
                if (end.Distance(Start) < 15)
                {//开始和结束距离短,认为是鼠标点击选择
                    PointSelectOver(e.Location);
               }
                else
                {
                    BoxSelectOver();
                }

            }
        }

        public void MouseWheel(MouseEventArgs e)
        {

        }

        /// <summary>
        /// 选择单个对象
        /// </summary>
        private void PointSelectOver(Point mousePoint)
        {
            if (Control.ModifierKeys != Keys.Control)
            {
                Editor.ClearSelected();
            }
            var point = Viewer.MousePointToLocal(mousePoint);
            foreach (var item in Canvas.Layers)
            {
                if (item.IsActive == false) continue;
                var elm = item.Elements.FirstOrDefault(x => x.Rect.Contains(point) == true);
                if (elm != null)
                {

                    Editor.AddSelected(new List<ObjElement>() { elm });
                    Editor.SetCurrent(elm);
                    return;
                }
            }

        }

        /// <summary>
        /// 选择被框选的对象
        /// </summary>
        private void BoxSelectOver()
        {
            if (Control.ModifierKeys != Keys.Control)
            {
                //撤销以前的选择
                Editor.ClearSelected();
            }
            foreach (var item in Canvas.Layers)
            {
                if (item.IsActive == false) continue;

                if (IsLeftToRight == true)
                {//全部选中才算选中
                    Editor.AddSelected(item.Elements.AsParallel().Where(x => Rect.Contains(x.Rect) == true).ToList());
                }
                else
                {//相交就认为已经选中
                    Editor.AddSelected(item.Elements.AsParallel().Where(x => x.Rect.IntersectsWith(Rect) == true).ToList());
                }
            }
            Editor.SetCurrent(Editor.SelectedElements.FirstOrDefault());
        }

        public override void DrawingAfter(Graphics g)
        {
        
        }


    }
    public static class PointExtension
    {


        /// <summary>
        /// 计算两点之间的距离
        /// </summary>
        /// <param name="source"></param>
        /// <param name="pt"></param>
        /// <returns></returns>
        public static double Distance(this Point source, Point pt)
        {
            return Math.Sqrt((source.X - pt.X) * (source.X - pt.X) + (source.Y - pt.Y) * (source.Y - pt.Y));
        }




    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这段代码中,scaleX和scaleY被认为是不合法的定义,是因为Canvas并没有这两个属性。如果你想要给Canvas设置缩放比例,可以使用scale属性。 如果你想要在Canvas中创建一个带缩放和旋转的选择框,你可以为Canvas添加一个transform属性,然后将缩放和旋转应用到选择框上。 下面是修改后的代码示例: ``` Canvas { id: canvas // ... transform: Scale { id: canvasScale xScale: 1 yScale: 1 } Rectangle { id: rect x: 100 y: 100 width: 50 height: 50 color: "red" property bool selected: false MouseArea { anchors.fill: parent onClicked: { rect.selected = true; } } onSelectedChanged: { if (selected) { var selectionBox = canvas.createSelectionBox(rect); selectionBox.transform = canvasScale; } else { canvas.removeSelectionBox(rect); } } } Rectangle { id: selectionBox color: "transparent" border.color: "blue" border.width: 2 visible: false transform: Scale { xScale: 1 yScale: 1 } } function createSelectionBox(item) { if (item.parent === canvas) { selectionBox.x = item.x - 5; selectionBox.y = item.y - 5; selectionBox.width = item.width + 10; selectionBox.height = item.height + 10; selectionBox.visible = true; canvas.setChildIndex(selectionBox, canvas.children.length - 1); return selectionBox; } } function removeSelectionBox(item) { if (selectionBox.parent === canvas) { selectionBox.visible = false; } } } ``` 在这个修改后的代码中,我添加了一个transform属性到Canvas元素中,用于控制Canvas的缩放比例。在选择框创建时,将缩放比例应用到选择框的transform属性中。同时,我也将选择框的scaleX和scaleY属性修改为transform的xScale和yScale属性,这样就可以正确的使用缩放比例了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值