《开发WinForm的流程设计器》由会员分享,可在线阅读,更多相关《开发WinForm的流程设计器(13页珍藏版)》请在金锄头文库上搜索。
1、开发 WinForm 的流程设计器让软件系统真实的体现工作过程,成为企业经营和管理的重要工具,是使用工作流系统的主要目的。 随着计算机的普及,企业信息化程度的不断加深,对软件系统的要求也越来越高,软件系统的每一个环节不再是独立的,客户对软件系统的要求越来越“苛刻” ,软件系统不仅是一个记录数据、查询数据的工具,还应是一个体现企业管理的工具,如何使软件系统体现企业的管理理念是软件系统发展的新目标。要做到这一点我们引进了工作流的概念,把企业的日常业务梳理成流程,软件系统根据流程进行工作,真正实现软件系统完全代替手工处理。完成这些工作需要用软件把企业的流程再造,这就是 BPM 企业流程再造。在BPM
2、 系统中有一个重要的模块是流程设计器,一款优秀的流程系统,它的设计器必须是可视化的,本文就介绍开发流程设计器的原理,并提供一款已经完成的设计器的源码,供大家学习研究。流程设计器是编辑流程模版的工具,可视化的流程设计器能直观的编辑流程模版,所见即所得,如下图是我们要开发的流程设计器:流程模版存放流程流转所需要的信息,使用流程设计器来管理流程模版是比较常见的方式,我见过一些流程系统使用表格的形式来管理,那样很不直观。也许是因为技术的原因,该篇就介绍如何制作这样的流程设计器,用到的技术 GDI+绘图,数据库存取。要了解GDI+绘图技术的可以先看一下http:/ 这个博客的介绍,比较基础。在开始之前,
3、先介绍一下目前市场上流程设计器的几种形式,无非就是两种形式一种是 B/S 的,一种是 C/S,我个人感觉这两种形式没必要苛求那一种,各有优缺点,B/S 的安装方便一些,不用安装直接使用,但操作灵活性比不上 C/S 的,B/S 的流程设计器目前有几种技术可以实现,一种是 js,一种是 Silverlight 或者 FLex,还有一种是用 ActiveX 插件。流程设计器一般是管理员、实施人员使用,用户群体比较单一固定,但使用要求比较高,必须方便灵活,所以我们的流程设计器采用 C/S 的方式,结合我们前面提供的 WCF 远程数据服务,可以实现远程流程模版管理,绝对不亚于 B/S 的流程设计器。该篇
4、内容比较多,先看一下要介绍的内容:1、流程模版分类管理2、如何使用 GDI+画流程图3、流程任务节点类型和属性4、流程模版的导入导出下面详细介绍每一部分:1、流程模版分类管理按照业务对流程模版进行分类,建立一个树形结构的分类机制,不限级数,如下图:每个分类上可以配置管理界面,如下图:可以配置两种形式的管理界面,一种是 web页面,一种是 winform 的窗体。这些管理界面是在业务平台上使用。2、如何使用 GDI+画流程图GDI+:Graphics Device Interface Plus 是 2D 图形处理的技术,在 C#.NET 中,使用 GDI+处理二维(2D)的图形和图像,使用 Di
5、rectX 处理三维(3D )的图形图像,图形图像处理用到的主要命名空间是 System . Drawing:提供了对 GDI+基本图形功能的访问,主要有Graphics 类、Bitmap 类、从 Brush 类继承的类、Font 类、 Icon 类、Image 类、Pen 类、Color 类等。了解了 GDI+基本概念后,再来了解 2D 图像处理的原理,在窗体或者控件上显示图形或者图像必须使用 OnPaint 事件,把成像的代码放到该事件里,在窗体重画时才会保持显示状态,如果不放在该事件里,那么在窗体重画时图像就无法显示,所以 OnPaint 事件是图像显示的重要事件,每个窗体和窗体上的控件
6、都是利用该事件来显示的,做过控件开发的应该很了解这个机制。根据以上原理,流程图的原理也就很简单了,就是在画布上把表示各种类型的任务节点画出来,再用带箭头的连线把他们连接起来,把这个过程放到画布的 OnPaint 事件里面,这样流程图就可以展现出来,同时选中的节点画上选中标志。要实现可视化操作还需要解决一下问题:a、读取流程模版从数据库中把流程模版中的所有任务节点和连线读出来,放到全局的数组中,在OnPaint 事件中把 TaskItems 数组和 LineItems 数组中的图像画出来。如下图数组定义: / / 流程模板所有节点列表 / public ArrayList TaskItems =
7、 new ArrayList(); / / 流程模板所有连线列表 / public ArrayList LineItems=new ArrayList(); 由于重画事件执行频率比较高,所以该过程内的代码都是操作内存对象,读写数据库的代码不要放到这里面。详细代码参见 HF.WorkFlow.Component 项目的 WorkPlace.csb、如何选中任务节点和多选节点。选中节点的原理是通过图像坐标来判断的,每个图形或者图像都有一个Rectangle 区域,该区域记录着节点 x,y 轴坐标和长度宽度,只要鼠标落点在这个区域内视为选中该节点。这里有个处理技巧,一般任务节点的尺寸是实际看到的图片
8、尺寸,但是在选中的时候鼠标点中图标周围也算选中,这是一种模糊处理的概念,很好用,如果不这么处理,点选任务节点的时候会很别扭,非得点中图片内才算选中。也可以这么理解,任务节点的有效区域范围是图片本身的尺寸加上一个边框,只要在边框内都算点中。我们在OnPaint 事件中把选中的节点的边框以毛边的形式显示出来,并加上 8 个方向的方块句柄,这样选择的节点就很形象了。如下图:判断节点是否选中的函数:/ / 判断给定坐标是否在组件的边界矩形内 / / 给定坐标 / 是否选中 public bool Contains(Point thePoint) if(!Selected)/没有选中 return bo
9、unds.Contains(thePoint); else Rectangle selectionRect=bounds;/节点图像的尺寸区域 selectionRect.Inflate(SystemInformation.FrameBorderSize);/通过各方向的给定值增加矩形的尺寸,加上选择边框 return selectionRect.Contains(thePoint); 然后把选中的节点添加到一个全局的数组中,供拖动或者删除使用。/ / 选中的节点列表 / public SelectedItems SelectedItems = new SelectedItems();多选的处
10、理原理是判断所有节点的坐标是否在鼠标经过的区域内,如果在该区域内添加到 SelectedItems 数组中,画布重画的时候会自动给 SelectedItems 数组的节点画上选中标志,即毛边和抓取句柄。下图是鼠标圈选时滑过的矩形橡皮圈,鼠标抬起时在该区域内的节点都添加到选中数组中。c、如何移动选中的节点。前面介绍了如何选中节点,移动节点就是改变选中节点的坐标,只要配合鼠标移动事件和鼠标抬起事件就可以。在鼠标移动时画出移动的轨迹很关键,这样更直观一些,如下图:方框为移动经过时留下的轨迹,当鼠标抬起时确定选中节点的坐标。重新激活重画事件 OnPaint,重画事件会重新在界面上画出任务节点和连线。这
11、就达到了移动的目的。d、保存流程模版我们在读取模版的时候把任务节点和连线都存放到数组中,那么在保存的时候把数组中的任务节点和连线写入到数据库中即可。上面是流程设计器的主要原理,下面来用代码实现一个简单的设计器。a、先定义一个任务节点的基类首选要确定有多少种类型的节点,每种类型的节点的功能是什么,使用什么样式的图标等,后面会介绍节点类型,这里我们先定义一个节点的基类 BaseComponent,所有节点类型都继承该类。基类的属性字段包括节点的坐标、图片、字体、名称、类型等基本属性。基类的方法包括画节点的方法,选中节点的方法。代码比较多复制到这里也不方便,具体代码参见 BaseComponent.
12、cs。b、如何画节点的毛边和抓取句柄前面见过毛边是任务节点图像周围的边框,详细定义参见 Bounds.cs,八个方向的抓取句柄参见 GrabHandles.cs。c、如何对齐节点节点的对齐操作参见 Dragger.csd、如何定义一个多选时的橡皮圈定义圈选时的橡皮圈轨迹,参见 Rubberband.cs。以上代码中都有详细的注释。下面介绍任务节点的类型和属性定义。定义六种类型的任务节点基本可以概括所有的情况。1、开始节点表示流程的开始,一般情况下一个流程只有一个开始节点,为了简化流程,减少流程模版的配置对可以支持多个开始节点。如下图:2、交互节点交互节点是需要用户交互操作的节点,在交互节点上配
13、置的表单,通过表单进行人机交互。3、查看节点查看节点是只具有任务查看权限的节点,不需要做数据处理,最常用的是审批结果通知发起人。4、控制节点控制节点是控制流程流转的节点,使用多种组合的控制节点可以实现流程的合流、分流。5、子流程节点子流程节点是可以把任何一个已有的流程作为子流程,实现流程的重用。6、适配器节点适配器节点是不需要人机交互但需要数据处理的节点,通过执行存储过程或者 dll 实现数据处理。7、结束节点表示当前流程结束。结束分两种情况,一种是流程全部结束,一种是退出当前流程,进入主流程。以上七种节点基本可以概括所有情况下的应用。下面介绍每个节点对应的属性。1、开始节点,属性界面如下图:
14、在该界面中配置交互表单上的命令按钮,有权限启动流程的处理者,流程中用到的变量,对应的表单。2、交互节点,属性界面如下图:该节点的属性比开始节点增加了超时配置和任务通知的内容,因为在交互任务中,用户可以收到任务到达提醒,任务超时通知等。根据流程启动者设定的紧急程度来确定超时时间。如下图3、查看节点,属性界面如下图:该节点只有处理者和任务通知,一般是用来通知任务审批情况的,可以看做是交互节点的简化版。4、控制节点,属性界面如下图:该节点是用来控制流程引擎流转的,与其他类型的节点配合使用。5、子流程节点,属性界面如下图:每一个已经存在的流程都可以作为子流程。6、适配器节点,属性界面如下图:流程引擎会
15、自动执行适配器节点配置的存储过程或者 dll。7,结束节点,该节点表示流程的结束,没有配置界面。每个节点的属性配置完成后,才能形成一个完整的流程模版,下面介绍流程模版的导入和导出。流程模版可以导出为 xml 文件。如下图导出界面:分两种情况导出,一种是包含表单配置信息,一种是不包含表单配置信息。一般情况都要包含表单配置信息。导入流程模版界面如下图:从 Xml 文件中导入流程模版,导入的时候分三种情况,包含表单配置信息,不包含表单配置信息,这两种情况必须保证要导入的流程模版不存在,否则无法导入。第三种情况是只导入原型,如果流程模版已经存在,那么会新建一个同名的流程模版。后面会继续发布如何开发流程引擎的系列文章。请关注 HF BPM 业务流程系统源码的更新,欢迎下载试用。