winform快速開發平台 -> 工作流組件(仿GooFlow)


     對於web方向的工作流,一直在用gooflow對於目前我的winform開發平台卻沒有較好的工作流組件。

   針對目前的項目經驗告訴我們。一個工作流控件是很必要的。 當然在winform方面的工作流第三方組件在網上找了很久,也沒有發現自己比較心儀的組件。 

     對於工作流組件通過web方式來實現具有絕對的優勢。我的這套winform平台當然也不能少了工作流組件。 

     通過winform來實現自己的工作流組件,目前我想到的指能通過GDI+重繪的方式來實現工作流的方案。

  說干就干,如下圖這是我通過GDI+繪制的工作流控件: 

      圖片

設計思想:

    控件中我們需要一些定義的節點:如開始、結束、自定義節點、畫線,和一個內容畫布組成

    通過抽象出線、點、以及item。進行重繪。

    畫布進行雙緩沖來解決繪制時導致的出線閃屏問題。 

簡單介紹:

    畫布中的網格繪制方法:

 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));
} 

  繪制節點抽象類型代碼:

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快速開發平台 -> 通用權限管理之動態菜單


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM