c# winfom从0学习开发开发OA、BPM工作流程与自定义表单系统(十)流程中心-流程设计器

发布时间 2023-10-26 17:06:26作者: 程序员一诺

 

 

 

 

 

 

 如同我第一个版本一样

版本一功能说明一下:

  1.支持拖动绘制工作节点

  2.支持移动每个节点的移动

  3.支持直线连接节点

  4.支持节点移动连接线自动跟随

  5.支持高亮显示选中的节点连线

  6.支持能删除选中节点和连线

  7.支持选中节点能显示节点的属性,同时可以进行节点更改

  8.支持能保存已绘制流程图(后续可根据个人情况配置,入库或者配置文件)

  9.支持能加载保存后的数据(根据入库或者配置文件做相对应的开发)

  10.支持能绘制节点和线的文字

  11.支持能自动计算两个节点之间的连接点,不要手动调整

  12.支持修改节点文字颜色背景颜色等等功能

  13.支持绘制超出边界自动回显功能

  14.支持节点右键删除功能

  15.支持连接线高亮右键删除功能

最后说明:软件基于 +GDI 绘制工作流程图 软件没有使用任何第三方插件。方便新手进行拓展其他功能开发。

 当前版本因为实在整个系统里面,所以使用的是数据库(MYSQL)进行的存储
流程纯GDI+没有使用任何第三方

都是代码实现的

 try
            {
                lab_connect.Text = "-";
                // 获取当前鼠标位置
                Point p = new Point();
                p.X = e.X;
                p.Y = e.Y;
                foreach (Tuple<ButtonX, ButtonX, int, string> t in lines)
                {


                    // 进行计算连线箭头的位置
                    Point p1 = new Point();
                    Point p2 = new Point();
                    if (t.Item1.Top + t.Item1.Height < t.Item2.Top)
                    {
                        p1 = new Point(t.Item1.Left + t.Item1.Width / 2, t.Item1.Top + t.Item1.Height);
                        p2 = new Point(t.Item2.Left + t.Item2.Width / 2, t.Item2.Top);
                    }
                    else if (t.Item1.Top > t.Item2.Top + t.Item2.Height)
                    {
                        p1 = new Point(t.Item1.Left + t.Item1.Width / 2, t.Item1.Top);
                        p2 = new Point(t.Item2.Left + t.Item2.Width / 2, t.Item2.Top + t.Item2.Height);
                    }
                    if (t.Item1.Top + t.Item1.Height * 4 < t.Item2.Top)
                    {
                        p1 = new Point(t.Item1.Left + t.Item1.Width / 2, t.Item1.Top + t.Item1.Height);
                        p2 = new Point(t.Item2.Left + t.Item2.Width / 2, t.Item2.Top);
                    }
                    else if (t.Item1.Top > t.Item2.Top + t.Item2.Height * 4)
                    {
                        p1 = new Point(t.Item1.Left + t.Item1.Width / 2, t.Item1.Top);
                        p2 = new Point(t.Item2.Left + t.Item2.Width / 2, t.Item2.Top + t.Item2.Height);
                    }
                    else if (t.Item1.Left + t.Item1.Width < t.Item2.Left)
                    {
                        p1 = new Point(t.Item1.Left + t.Item1.Width, t.Item1.Top + t.Item1.Height / 2);
                        p2 = new Point(t.Item2.Left, t.Item2.Top + t.Item2.Height / 2);
                    }
                    else if (t.Item1.Left > t.Item2.Left + t.Item2.Width)
                    {
                        p1 = new Point(t.Item1.Left, t.Item1.Top + t.Item1.Height / 2);
                        p2 = new Point(t.Item2.Left + t.Item2.Width, t.Item2.Top + t.Item2.Height / 2);
                    }
                    newPen.CustomEndCap = lineCap;
                    bool is_hover = LineIsHover.GetPointIsInLine(p, p1, p2, 2);
                    g = this.pictureBox1.CreateGraphics();
                    if (is_hover)
                    {
                        lab_connect.Text = t.Item4;

                        newPen.Color = Color.Red;
                        g.DrawLine(newPen, p1, p2);
                    }
                    else
                    {

                        newPen.Color = Color.SeaGreen;
                        g.DrawLine(newPen, p1, p2);
                    }
                }


            }
            catch (Exception ex)
            { }