📄 designerbacktransitiontool.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 + -