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 ...
随机推荐
- IE的F12开发人员工具不显示
IE的F12开发人员工具不显示问题: 按下F12之后,开发人员工具在桌面上看不到,但是任务栏里有显示.将鼠标放在任务栏的开发人员工具上,出现一片透明的区域,选中之后却出不来.将鼠标移动到开发人员工具的 ...
- Quick Cocos (2.2.5plus)CoinFlip解析(MenuScene display AdBar二次封装)
转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621 从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工 ...
- Python中函数、类、模块和包的调用
初学python阶段,大多数人对函数.类.模块和包的调用都搞得不是很清楚,这篇随笔就简单的进行说明. (1)函数 当函数定义好之后,可以直接调用. 比如:def summ(add1,add2),那么 ...
- URI编码解码
.NET string s= System.Web.HttpUtility.UrlEncode("123", System.Text.Encoding.Unicode); //编码 ...
- android Viewpager HorizontalScrollView 实现分页栏拖拽
源码:http://files.cnblogs.com/android100/ViewPaperDemo.rar首先我们先看一个效果: 前两个是网易的,它做的title不能拖拽,.不过点击动画效果挺 ...
- JS利用取余实现toggle多函数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 我的C语言进化史
Hello, world! 这三年就看看我的C语言还有JAVAscript进化史吧.更厉害的sunmarvell,我等你
- CI模板加载css和js
1.需求 ci无法加载css和js文件. 2.解决 删除..htaccess文件. 在config目录下配置base_url,并传给页面 $base_url = $this->config-&g ...
- UEFI模式下Win10和Linux双系统
一.准备 用Win自带的磁盘管理或者进PE分出一块空间来. 你必须要有一个U盘,然后使用软碟通或者ImageWriter把iso系统镜像文件烧录进去,这是比较传统的方法,但既然我们UEFI启动,那就根 ...
- mysql 日期查询 总结
1,对一天24小时内每小时的数据量求和: SELECT IFNULL(SUM(CASE HOUR(时间字段) WHEN 0 THEN 1 ELSE 0 END),0)as '0', IFNULL(SU ...