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 ...
随机推荐
- ORM之殇,我们需要什么样的ORM框架?
最近在研究ORM,究竟什么样的框架才是我们想要的 开发框架的意义在于 开发更标准,更统一,不会因为不同人写的代码不一样 开发效率更高,无需重新造轮子,重复无用的代码,同时简化开发流程 运行效率得到控制 ...
- Python socket编程之八:阶段性总结
f1.py # -*- coding: utf-8 -*- import sqlalchemy import tushare import pandas import socket import st ...
- [UML]UML系列——时序图(顺序图)sequence diagram
系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) [UML]UML系列——类图Class [UML]UML系列——类 ...
- C# WinForm 技巧:控件截图
Point screenPoint = 控件.PointToScreen(new Point()); Rectangle rect = new Rectangle(screenPoint, chart ...
- 现代软件工程作业 第二章 学习github笔记
在网上大量资料的辅助下,学习了github的基本使用方法,尝试了一些常见的命令.为了便于记忆总结了自己的学习内容. 1.首先需要在github的官网上注册一个帐号,并新建一个repository,选这 ...
- How to build .apk file from command line(转)
How to build .apk file from command line Created on Wednesday, 29 June 2011 14:32 If you don’t want ...
- python 解压 压缩包
转 http://m.blog.csdn.net/blog/wice110956/26597179# 这里讨论使用Python解压如下五种压缩文件: .gz .tar .tgz .zip .rar ...
- .htaccess中Apache配置详解
1.<IfDefine> 指令 说明 封装一组只有在启动时当测试结果为真时才生效的指令 语法 <IfDefine [!]parameter-name> ... </IfD ...
- mybatis批量删除提示类型错误
一. 这里主要考虑两种参数类型:数组或者集合. 而这点区别主要体现在EmpMapper.xml文件中标签的collection属性: 当collection="array"时,表名 ...
- 基础知识《十》unchecked异常和checked异常
运行时异常在运行期间才能被检查出来,一般运行期异常不需要处理.也称为unchecked异常.Checked异常在编译时就能确定,Checked异常需要自己处理. checked 异常也就是我们经常遇到 ...