📄 wftransition.cs
字号:
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 + -