⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 designerbacktransitiontool.cs

📁 这个是自己制作的工作流设计器,可以可视化的拖拉
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace WorkflowDesigner.Designer
{
    public class DesignerBackTransitionTool : DesignerTool
    {

        #region 字段
        /// <summary>
        /// 开始鼠标位置的x轴坐标
        /// </summary>
        private int startMouseX;


        /// <summary>
        /// 开始鼠标位置的y轴坐标
        /// </summary>
        private int startMouseY;


        /// <summary>
        /// 记录前一个鼠标位置的x轴坐标
        /// </summary>
        private int prevMouseX;


        /// <summary>
        /// 记录前一个鼠标位置的y轴坐标
        /// </summary>
        private int prevMouseY;

        /// <summary>
        /// 开始节点
        /// </summary>
        private WfAbstractActivity startActivity;
        #endregion

         #region 属性

        /// <summary>
        /// 开始鼠标位置的x轴坐标
        /// </summary>
        public int StartMouseX
        {
            get { return startMouseX; }
            set { startMouseX = value; }
        }

        /// <summary>
        /// 开始鼠标位置的y轴坐标
        /// </summary>
        public int StartMouseY
        {
            get { return startMouseY; }
            set { startMouseY = value; }
        }

        /// <summary>
        /// 记录前一个鼠标位置的x轴坐标
        /// </summary>
        public int PrevMouseX
        {
            get { return prevMouseX; }
            set { prevMouseX = value; }
        }

        /// <summary>
        /// 记录前一个鼠标位置的y轴坐标
        /// </summary>
        public int PrevMouseY
        {
            get { return prevMouseY; }
            set { prevMouseY = value; }
        }
        #endregion

        #region 构造函数
        /// <summary>
        /// 构造函数
        /// </summary>
        public DesignerBackTransitionTool()
        {
            
        }
        #endregion

        #region 操作

        #region 私有
        #endregion

        #region 保护

        #endregion

        #region 公用

         

        /// <summary>
        /// 当鼠标按下时
        /// </summary>
        /// <param name="x">鼠标点所在的位置x轴坐标</param>
        /// <param name="y">鼠标点所在的位置y轴坐标</param>
        public override void OnMouseDown(int x, int y)
        {
           
            //得到鼠标点击下去的对象(调用document中的方法)
            HitTestResult start = this.Ctrl.Document.HitTest(x, y);
            //如果为空或者不为节点对象
            if ((start == null) || !(start.result is WfAbstractActivity))
            {
                MessageBox.Show("退回流向没有开始在节点上!");
                //如果ctrl没有按下
                if (!this.IsControlPressed())
                {
                    //设置当前的设计工具为指针设计工具
                    this.Ctrl.CurrentTool = new DesignerSelector();
                }
            }
            else if (start.result is WfEndActivity)
            {
                MessageBox.Show("退回流向开始不能为结束节点!");
                //如果ctrl没有按下
                if (!this.IsControlPressed())
                {
                    //设置当前的设计工具为指针设计工具
                    this.Ctrl.CurrentTool = new DesignerSelector();
                }
            }
            else if (start.result is WfStartActivity)
            {
                MessageBox.Show("退回流向开始不能为开始节点!");
                //如果ctrl没有按下
                if (!this.IsControlPressed())
                {
                    //设置当前的设计工具为指针设计工具
                    this.Ctrl.CurrentTool = new DesignerSelector();
                }
            }
            else
            {
                //设置开始节点
                startActivity = start.result as WfAbstractActivity;
                //使画布被鼠标捕获
                Ctrl.SetCapture();
                SavePrevMousePosition(x, y);
                startMouseX = x;
                startMouseY = y;
            }
        }

        /// <summary>
        /// 当鼠标弹开时
        /// </summary>
        /// <param name="x">鼠标点所在的位置x轴坐标</param>
        /// <param name="y">鼠标点所在的位置y轴坐标</param>
        public override void OnMouseUp(int x, int y)
        {
            //得到横向滚动条和竖向滚动条交叉的(top,hight)点
            Point scrollOffset = Ctrl.ScrollOffset;
            //得到开始点的屏幕坐标 计算公式:[注:25为设计器画布初始时增加的偏移数值]x坐标=开始点的x轴坐标-横向滚动条+25
            Point startPoint = Ctrl.PointToScreen(new Point(startMouseX - scrollOffset.X + 25, startMouseY - scrollOffset.Y + 25));
            //根据屏幕坐标绘制线(前一个鼠标位置)
            ControlPaint.DrawReversibleLine(startPoint, Ctrl.PointToScreen(new Point(prevMouseX - scrollOffset.X + 25, prevMouseY - scrollOffset.Y + 25)), Color.Black);
            //鼠标处是否有可视化对象
            HitTestResult end = Ctrl.Document.HitTest(x, y);
            //如果为空或者不是节点
            if ((end == null) || (!(end.result is WfAbstractActivity)))
            {
                MessageBox.Show("退回流向没有结束在节点上");
            }
            //如果是开始和结束都是相同节点
            else if (end.result == startActivity)
            {
                MessageBox.Show("退回流向的开始和结束都是相同活动");
            }
            //如果是开始节点
            else if (end.result is WfStartActivity)
            {
                MessageBox.Show("退回流向不能结束于开始节点");
            }
            else if (end.result is WfEndActivity)
            {
                MessageBox.Show("流向不能结束于结束节点");
            }
            else
            {
                //初始化可视化流转对象
                WfBackTransition trans = new WfBackTransition(startActivity, end.result as WfAbstractActivity);
                //对齐到表格
                trans.AlignToGrid();
                //加入到指定文档的可视化对象的队列中
                this.Ctrl.Document.VisualObjectList.Add(trans);
            }
            //重绘制
            Ctrl.RedrawAll();
            //如果没有按下contrl键
            if (!IsControlPressed())
            {
                //当前工具为选择
                Ctrl.CurrentTool = new DesignerSelector();
            }

        }


        /// <summary>
        /// 当鼠标移动时
        /// </summary>
        /// <param name="x">鼠标点所在的位置x轴坐标</param>
        /// <param name="y">鼠标点所在的位置y轴坐标</param>
        public override void OnMouseMove(int x, int y)
        {
          // 得到偏移点
          // 根据偏移点和上次画的点画出起始点到目前鼠标所在点的线段
            //得到横向滚动条和竖向滚动条交叉的(top,hight)点
            Point scrollOffset = Ctrl.ScrollOffset;
            //得到开始点的屏幕坐标 计算公式:[注:25为设计器画布初始时增加的偏移数值]x坐标=开始点的x轴坐标-横向滚动条+25
            Point startPoint = Ctrl.PointToScreen(new Point(startMouseX - scrollOffset.X + 25, startMouseY - scrollOffset.Y + 25));
            //根据屏幕坐标绘制线(前一个鼠标位置)
            ControlPaint.DrawReversibleLine(startPoint, Ctrl.PointToScreen(new Point(prevMouseX - scrollOffset.X + 25, prevMouseY - scrollOffset.Y + 25)), Color.Black);
            //根据屏幕坐标绘制线(当前鼠标位置)
            ControlPaint.DrawReversibleLine(startPoint, Ctrl.PointToScreen(new Point(x - scrollOffset.X + 25, y - scrollOffset.Y + 25)), Color.Black);
            //保存前一个鼠标所在的位置
            this.SavePrevMousePosition(x, y);
            

        }

         /// <summary>
        /// 保存前一个鼠标所在的位置
        /// </summary>
        /// <param name="x">前一个鼠标所在位置的x轴坐标</param>
        /// <param name="y">前一个鼠标所在位置的y轴坐标</param>
        private void SavePrevMousePosition(int x, int y)
        {
            prevMouseX = x;
            prevMouseY = y;
        }
        
        #endregion
        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -