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快速開發平臺 -> 通用權限管理之動態菜單
總結
以上是生活随笔為你收集整理的winform快速开发平台 -> 工作流组件(仿GooFlow)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 读取文件夹命令,Linux系
- 下一篇: linux内外部命令,Shell、内外部