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

📄 wftransition.cs

📁 这个是自己制作的工作流设计器,可以可视化的拖拉
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace WorkflowDesigner.Designer
{
    /// <summary>
    /// 流转可视化对象
    /// </summary>
    public class WfTransition :DesignerVisualObject
    {
        #region 字段

        /// <summary>
        /// 开始节点
        /// </summary>
        private WfAbstractActivity _start;

        /// <summary>
        /// 结束节点
        /// </summary>
        private WfAbstractActivity _end;
        
        /// <summary>
        /// 当前流转中间位置的x轴坐标
        /// </summary>
        private int _x;

        /// <summary>
        /// 当前流转中间位置的y轴坐标
        /// </summary>
        private int _y;

        /// <summary>
        /// 存放图标矩形框
        /// </summary>
        private Rectangle _rect;

        /// <summary>
        /// 条件
        /// </summary>
        private IList<TransCondition> conditions = new List<TransCondition>();


        private String _name = "";

       
        //参数集合
        #endregion

        #region 属性

        public String Name
        {
            get { return _name; }
            set { _name = value; }
        }

        /// <summary>
        /// 条件
        /// </summary>
        public IList<TransCondition> Conditions
        {
            get { return conditions; }
            set { conditions = value; }
        }
        /// <summary>
        /// 当前流转中间位置的y轴坐标
        /// </summary>
        public int Y
        {
            get
            {
                return _y;
            }
            set
            {
                _y = value;
                _rect = new Rectangle(_x - 4, _y - 4, 8, 8);
            }
        }
        /// <summary>
        /// 当前流转中间位置的x轴坐标
        /// </summary>
        public int X
        {
            get
            {
                return _x;
            }
            set
            {
                _x = value;
                _rect = new Rectangle(_x - 4, _y - 4, 8, 8);
            }
        }
        /// <summary>
        /// 开始节点
        /// </summary>
        public WfAbstractActivity StartActivity
        {
            get
            {
                return _start;
            }
            set
            {
                _start = value;
            }
        }
        /// <summary>
        /// 结束节点
        /// </summary>
        public WfAbstractActivity EndActivity
        {
            get
            {
                return _end;
            }
            set
            {
                _end = value;
            }
        }
        #endregion

        #region 构造函数
        /// <summary>
        /// 构造函数
        /// </summary>
        public WfTransition(WfAbstractActivity start, WfAbstractActivity end)
        {
            //设置开始节点
            this._start = start;
            //设置结束节点
            this._end = end;
            //得到中心点坐标
            this._x = start.X + (end.X - start.X) / 2;
            this._y = start.Y + (end.Y - start.Y) / 2;
            //根据中心点坐标绘制调整节点矩形
            _rect = new Rectangle(_x-4,_y-4, 8, 8);
            
        }
        #endregion

        #region 操作

        #region 私有
        #endregion

        #region 保护

        #endregion

        #region 公用

        /// <summary>
        /// 判断鼠标点击出是否有可视化对象
        /// </summary>
        /// <param name="x">鼠标所在位置的x轴坐标</param>
        /// <param name="y">鼠标所在位置的y轴坐标</param>
        /// <returns>点击出的可视化对象</returns>
        public override HitTestState HitTest(int x, int y)
        {
            
            if (_rect.Contains(x, y))
            {
                return HitTestState.Center;
            }
            else
            {
                return HitTestState.None;
            }
        }
        

        /// <summary>
        /// 对齐到画布上的表格
        /// </summary>
        public override void AlignToGrid()
        {
            //如果中间点的x轴坐标小于0那么中间点的x轴坐标为0
            if (_x < 0)
            {
                _x = 0;
            }
            //如果中间点的x轴坐标大于等于2000那么中间点的x轴坐标为2000
            else if (_x >= 2000)
            {
                _x = 2000;
            }
            else
            {
                //否则对齐到最近的表格线位置
                _x = AlignToNumber(_x, GridSize);
            }
            //如果中间点的x轴坐标小于0那么中间点的y轴坐标为0
            if (_y < 0)
            {
                _y = 0;
            }
            //如果中间点的y轴坐标大于等于2000那么中间点的x轴坐标为2000
            else if (_y >= 2000)
            {
                _y = 2000;
            }
            else
            {
                //否则对齐到最近的表格线位置
                _y = AlignToNumber(_y, GridSize);
            }
            //重新画中间点的矩形
            _rect = new Rectangle(_x - 4, _y - 4, 8, 8);
        }

        /// <summary>
        /// 框选
        /// </summary>
        /// <param name="rect">选中的矩形范围</param>
        public override void RangeSelect(Rectangle rect)
        {
            //判断流转中间调整点是否在大的橡皮筋框内,如果在内则将属性设置为被选中
            if (rect.Contains(this._rect))
            {
                this.IsSelected = true;
            }
        }

        /// <summary>
        /// 绘制
        /// </summary>
        /// <param name="g">绘图图面</param>
        public override void Draw(Graphics g)
        {
            //定义画笔
            using (Pen pen = new Pen(Color.Green))
            {
                //根据开始节点和中间控制点位置画线
                g.DrawLine(pen, StartActivity.X, StartActivity.Y, _x, _y);
                //根据中间控制点和结束节点位置画线
                g.DrawLine(pen, _x, _y, EndActivity.X, EndActivity.Y);
            }
            Color nodeColor;
            //如果选中,中间控制点是以红色填充的否则以蓝色填充
            if (IsSelected)
            {
               
                nodeColor = Color.Red;
            }
            else
            {
                nodeColor = Color.Blue;
            }
            //填充中间控制点矩形的颜色
            using (Brush brush = new SolidBrush(nodeColor))
            {
                g.FillEllipse(brush, _rect);
            }
            //得到起始位置(中间控制点位置)
            Point source = new Point(_x, _y);
            //得到目标位置(结束节点的位置)
            Point target = new Point(EndActivity.X, EndActivity.Y);
            //旋转角度
            double angle = 0;

            double x = (target.X - source.X);
            double y = (target.Y - source.Y);

            int x1 = 0;
            int y1 = 0;

⌨️ 快捷键说明

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