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快速开发平台 -> 让有限的资源创造无限的价值!
3.winform快速开发平台 -> 绑定ComboBox数据控件
4.winform快速开发平台 -> 工作流组件(仿GooFlow)
5.winform快速开发平台 -> 通用权限管理之动态菜单
winform快速开发平台 -> 工作流组件(仿GooFlow)的更多相关文章
- winform快速开发平台 -> 基础组件之分页控件
一个项目控件主要由及部分的常用组件,当然本次介绍的是通用分页控件. 处理思想:我们在处理分页过程中主要是针对数据库操作. 一般情况主要是传递一些开始位置,当前页数,和数据总页数以及相关关联的业务逻辑. ...
- winform快速开发平台->让有限的资源创造无限的价值!
最近一直在维护一套自己的快速开发平台. 主要应对针对C/S架构下的项目.然而对winform这快,还真没有看到过相对好的快速开发平台, 何为快速,在博客园逛了了好久, 预览了很多通用权限管理系统. 确 ...
- winform快速开发平台 -> 通用权限管理之动态菜单
这几个月一直忙APP的项目,没来得及更新项目,想想该抽出时间整理一下开发思路,跟大家分享,同时也希望得到宝贵的建议. 先说一下我们的权限管理的的设计思路,首先一个企业信息化管理系统一定会用到权限管理, ...
- winform快速开发平台 -> 快速绑定ComboBox数据控件
通常我们在处理编辑窗体时.往往会遇到数据绑定.例如combobox控件绑定数据字典可能是我们经常用到的.然而在我的winform快速开发平台中我是如何处理这个频繁的操作呢? 首先,我们要绑定combo ...
- C#.NET Winform 快速开发平台
C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4.0.htm 适用软件:适合开 ...
- SNF开发平台WinForm之六-上传下载组件使用-SNF快速开发平台3.3-Spring.Net.Framework
6.1运行效果: 6.2开发实现: 1.先在要使用的项目进行引用,SNF.WinForm.Attachments.dll文件. 2.在工具箱内新建选项卡->选择项,浏览找到文件SNF.WinFo ...
- SNF开发平台WinForm之十四-站内发送系统信息-SNF快速开发平台3.3-Spring.Net.Framework
1运行效果: 2开发实现: .组装站内信息发送实体对象. SNFService SNFService = new SNFService(); if (this.ucUser.SelectedIds ! ...
- SNF开发平台WinForm之十三-单独从服务器上获取PDF文件进行显示-SNF快速开发平台3.3-Spring.Net.Framework
1运行效果: 2开发实现: 如果需要单独显示PDF文件时用下面代码去实现,指定url地址. 地址: . 获取附件管理的实体对象: List<KeyValuePair<string, obj ...
- SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework
1.调用前组装参数 2.调用发送信息服务脚本 .调用前组装参数: BaseSendTaskEntity entity = new BaseSendTaskEntity(); entity.Mess ...
随机推荐
- C#技术漫谈之垃圾回收机制(GC)
GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...
- 浅谈Nginx负载均衡和F5的区别
前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处 ...
- matlab下二重积分的蒙特卡洛算法
%%monte_carlo_ff.m %被积函数(二重) function ff=monte_carlo_ff(x,y) ff=x*y^2;%函数定义处 end %%monte_carlo.m %蒙特 ...
- java内存泄漏的几种情况
转载于http://blog.csdn.net/wtt945482445/article/details/52483944 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静态 ...
- KMP学习之旅
说起kmp就要从字符串的匹配说起,下面我们谈谈字符串的匹配 给定一个原字符串:bababababababababb,再给定一个模式串:bababb,求模式串是否在源字符串中出现 最简单的方法就是遍历源 ...
- Error:failed to find Build Tools revision 23.0.0 rc3
解决,选择AS里有的版本就可以了,已有的我这就一个23.0.3,导入的项目是23.0.2 Donate:)
- 求两圆相交部分面积(C++)
已知两圆圆心坐标和半径,求相交部分面积: #include <iostream> using namespace std; #include<cmath> #include&l ...
- python 装饰器的理解
一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...
- sublime注释插件DocBlockr
DocBlockr很好用,不仅仅可以自动生成注释,还可以手动编辑注释的格式. 安装方法: Cmd+Shift+P -> Install Package -> docblockr win ...
- C语言 完美字符串
约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...