winform快速开发平台 -> 工做流组件(仿GooFlow)

     对于web方向的工做流,一直在用gooflow对于目前个人winform开发平台却没有较好的工做流组件。html

   针对目前的项目经验告诉咱们。一个工做流控件是很必要的。 固然在winform方面的工做流第三方组件在网上找了好久,也没有发现本身比较心仪的组件。 web

     对于工做流组件经过web方式来实现具备绝对的优点。个人这套winform平台固然也不能少了工做流组件。 post

     经过winform来实现本身的工做流组件,目前我想到的指能经过GDI+重绘的方式来实现工做流的方案。this

  说干就干,以下图这是我经过GDI+绘制的工做流控件: url

      图片

设计思想:spa

    控件中咱们须要一些定义的节点:如开始、结束、自定义节点、画线,和一个内容画布组成

    经过抽象出线、点、以及item。进行重绘。

    画布进行双缓冲来解决绘制时致使的出线闪屏问题。 设计

简单介绍:orm

    画布中的网格绘制方法:htm

 var gridPen = new Pen(Color.Silver)
{
    DashStyle = DashStyle.Custom,
    DashPattern = new float[] { 2f, 2f }
};
 for (int column = 0; column < (int)Math.Ceiling((double)this.Width / (double)gridAverage); column++)
{
    bufferGraphics.DrawLine(gridPen, new Point(column * gridAverage, 0), new Point(column * gridAverage, this.Height));
}
 for (int row = 0; row < (int)Math.Ceiling((double)this.Height / (double)gridAverage); row++)
{
    bufferGraphics.DrawLine(gridPen, new Point(0, row * gridAverage), new Point(this.Width, row * gridAverage));
} 

  绘制节点抽象类型代码:blog

public enum ItemType
{
    /// <summary>
    /// 开始
    /// </summary>
    Start,
    /// <summary>
    /// 工做流
    /// </summary>
    Custom, 
    /// <summary>
    /// 线
    /// </summary>
    Line,
    /// <summary>
    /// 结束
    /// </summary>
    End
 }

绘制连线

public void DrawLine(Graphics grp, Pen pen)
{
    if (m_startPoint == null || m_endPoint == null) return;

    var startX = m_startPoint.ItemLocate.X + m_startPoint.ItemImage.Width / 2;
    var startY = m_startPoint.ItemLocate.Y + m_startPoint.ItemImage.Height / 2;

    var endX = m_endPoint.ItemLocate.X + m_endPoint.ItemImage.Width / 2;
    var endY = m_endPoint.ItemLocate.Y + m_endPoint.ItemImage.Height / 2;

    #region 计算开始点位置
    if (m_startPoint.ItemLocate.X < m_endPoint.ItemLocate.X)
    {
        if (m_startPoint.ItemLocate.Y < m_endPoint.ItemLocate.Y - m_startPoint.ItemLocate.Y)
        {
            startX = m_startPoint.ItemLocate.X + m_startPoint.ItemImage.Width / 2;
            startY = m_startPoint.ItemLocate.Y + m_startPoint.ItemImage.Height;
        }
        else if (m_startPoint.ItemLocate.Y < m_endPoint.ItemLocate.Y + m_endPoint.ItemImage.Height)
        {
            startX = m_startPoint.ItemLocate.X + m_startPoint.ItemImage.Width;
            startY = m_startPoint.ItemLocate.Y + m_startPoint.ItemImage.Height / 2;
        }
        else
        {
            startX = m_startPoint.ItemLocate.X + m_startPoint.ItemImage.Width / 2;
            startY = m_startPoint.ItemLocate.Y;
        }
    }
    else
    {
        if (m_startPoint.ItemLocate.Y < m_endPoint.ItemLocate.Y - m_startPoint.ItemLocate.Y)
        {
            startX = m_startPoint.ItemLocate.X + m_startPoint.ItemImage.Width / 2;
            startY = m_startPoint.ItemLocate.Y + m_startPoint.ItemImage.Height;
        }
        else if (m_startPoint.ItemLocate.Y < m_endPoint.ItemLocate.Y + m_endPoint.ItemImage.Height)
        {
            startX = m_startPoint.ItemLocate.X;
            startY = m_startPoint.ItemLocate.Y + m_startPoint.ItemImage.Height / 2;
        }
        else
        {
            startX = m_startPoint.ItemLocate.X + m_startPoint.ItemImage.Width / 2;
            startY = m_startPoint.ItemLocate.Y;
        }
    }
    #endregion

    #region 计算结束点位置

    if (m_startPoint.ItemLocate.X < m_endPoint.ItemLocate.X)
    {
        if (m_startPoint.ItemLocate.Y < m_endPoint.ItemLocate.Y - m_startPoint.ItemLocate.Y)
        {
            endX = m_endPoint.ItemLocate.X + m_endPoint.ItemImage.Width / 2;
            endY = m_endPoint.ItemLocate.Y;
        }
        else if (m_startPoint.ItemLocate.Y < m_endPoint.ItemLocate.Y + m_endPoint.ItemImage.Height)
        {
            endX = m_endPoint.ItemLocate.X;
            endY = m_endPoint.ItemLocate.Y + m_endPoint.ItemImage.Height / 2;
        }
        else
        {
            endX = m_endPoint.ItemLocate.X + m_endPoint.ItemImage.Width / 2;
            endY = m_endPoint.ItemLocate.Y + m_endPoint.ItemImage.Height;
        }
    }
    else
    {
        if (m_startPoint.ItemLocate.Y < m_endPoint.ItemLocate.Y - m_startPoint.ItemLocate.Y)
        {
            endX = m_endPoint.ItemLocate.X + m_endPoint.ItemImage.Width / 2;
            endY = m_endPoint.ItemLocate.Y;
        }
        else if (m_startPoint.ItemLocate.Y < m_endPoint.ItemLocate.Y + m_endPoint.ItemImage.Height)
        {
            endX = m_endPoint.ItemLocate.X + m_endPoint.ItemImage.Width;
            endY = m_endPoint.ItemLocate.Y + m_endPoint.ItemImage.Height / 2;
        }
        else
        {
            endX = m_endPoint.ItemLocate.X + m_endPoint.ItemImage.Width / 2;
            endY = m_endPoint.ItemLocate.Y + m_endPoint.ItemImage.Height;
        }
    }
    #endregion
    var startPoint = new Point(startX, startY);
    var endPoint = new Point(endX, endY);

    grp.DrawLine(pen, startPoint, endPoint);
}

  

经过一点一滴的付出,每一个时间点都会看到他的完善。同时也期待着的他的成长。

Winform快速开发平台系列:

官网链接

1.winform快速开发平台 -> 让有限的资源创造无限的价值!

2.winform快速开发平台 -> 基础组件之分页控件

3.winform快速开发平台 -> 绑定ComboBox数据控件

4.winform快速开发平台 -> 工做流组件(仿GooFlow)

5.winform快速开发平台 -> 通用权限管理之动态菜单

相关文章
相关标签/搜索