亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#實現流程圖設計器

2020-01-24 01:22:11
字體:
來源:轉載
供稿:網友

最近一個偶然的機會竟然實現了一個簡單的流程圖設計器(雖然其功能還有很多不完善之處,但是心中還是非常高興,滿滿的成就感)。

話不多說,先看一下實現的主界面效果:

左邊是一個ListView(listView1),右邊的畫布是一個Panel(panel1)。下面將主要思路介紹如下:

  1)允許拖放,listView1和panel1設置其AllowDrop=true;

  2)非連接線類型的圖形拖放處理:左邊的listView1的項目被選中后,可以獲取其圖形類型(是路由器、是服務器還是云等),并在全局變量中記錄下當前的操作對象類型,然后拖放到panel1后,panel1獲得對應的圖形類型,首先判斷圖的類型是否為非連接線,如果是則獲取對應的圖片,用g.DrawImage將其繪制到畫布中,圖片的坐標參考自當前鼠標(拖放到panel1最后松開鼠標左鍵時的坐標)的坐標。

  3)連接線類型的圖形處理:如果是連接線,應該要有兩個點來確定一條直線。當選中listView1的連接線時,會在全局變量中記錄下當前的操作對象類型是連接線,當在panel1上單擊時,首選判斷當前的操作對象類型的全局對象是否為連接線,如果是,則記錄第一次單擊的點,然后等待記錄單擊的第二個點,當第二次單擊完成后,調用繪制直線的方法在畫布中進行繪制直線。

  4)當線和圖形綁定后,拖放圖形時,直線附屬在圖形的那個點會隨著圖形位置的變化而變化,當最后定位后,panel1會重繪網格和流程圖。

  5)編輯圖形信息:在panel1上雙擊時,程序獲取雙擊的坐標點離所有的圖形區域中最近的圖形,然后計算距離,看是否滿足設置的閾值,如果小于閾值,則認為是在該圖形上雙擊,是要進行編輯操作。

下面給出繪制網格的代碼:

/// <summary>  /// 繪制網格  /// </summary>  private void renderGrid()  {   //全局變量存儲最大最小值,作為繪制區域   Graphics g = this.panel1.CreateGraphics();   Color color = Color.DarkGray;   Pen p = new Pen(color, 1);   p.DashStyle = DashStyle.Dash;   for (int x = 0; x <= this.panel1.Width; x = x + 20)   {    PointF p1 = new PointF(x, 0);    PointF p2 = new PointF(x, Height);    g.DrawLine(p, p1, p2);   }   for (int y = 0; y <= panel1.Height; y = y + 20)   {    PointF p1 = new PointF(0, y);    PointF p2 = new PointF(Width, y);    g.DrawLine(p, p1, p2);   }  }

下面給出在panel1上進行鼠標單擊的處理程序:

private void panel1_MouseClick(object sender, MouseEventArgs e)  {   int X = e.X;   int Y = e.Y;   if (this.__gObjType== "")   {    return;   }   if (this.__gObjType != "Line")   {    AddObjectFromMouseLocation(X, Y, 0, 0, this.__gObjType);   }   else   {    //line    if (__lineMouseClickedCount == 1)    {     __lineX2 = e.X;     __lineY2 = e.Y;     AddObjectFromMouseLocation(__lineX1, __lineY1, __lineX2, __lineY2, this.__gObjType);     //連接線方向判斷     __lineMouseClickedCount = 0;     __lineX1 = 0;     __lineY1 = 0;     __lineX2 = 0;     __lineY2 = 0;    }    else if (__lineMouseClickedCount == 0)    {     __lineX1 = e.X;     __lineY1 = e.Y;     __lineMouseClickedCount = 1;    }    else    {     __lineMouseClickedCount = 0;     __lineX1 = 0;     __lineY1 = 0;     __lineX2 = 0;     __lineY2 = 0;    }   }  }

下面給出重繪的程序:

private void ReDrawAll()  {   renderGrid();   Graphics g = this.panel1.CreateGraphics();   g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;   GObject CurrObj = new GObject();   Rectangle Rct = new Rectangle();   Pen p = new Pen(Color.Black);   //p.Width = 2;   p.Width = __penWidth * __zoomTimes;   Image ObjImg;   int xm = 0;   int ym = 0;   int _maxX = 0;   int _maxY = 0;   int _minX = 0;   int _minY = 0;   int _oldW = this.panel1.Width;   int _oldH = this.panel1.Height;   string IsLine = "";   //Nobj==50為當前畫布最大的對象個數   for (int i = 0; i < GNetworkFlow.Nobj; i++)   {    CurrObj = GNetworkFlow.GObjects[i];    //當前對象類型判斷    if (CurrObj.Type == "") IsLine = "N/D";    if (CurrObj.Type == "Line") IsLine = "Y";    if ((CurrObj.Type != "Line") && (CurrObj.Type != "")) IsLine = "N";    //    #region old panel1作為畫布,將其嵌套在panel2中實現超出邊界出現滾動條    if (_maxX < CurrObj.x2)    {     _maxX = CurrObj.x2;    }    if (_maxY < CurrObj.y2)    {     _maxY = CurrObj.y2;    }    if (_minX > CurrObj.x1)    {     _minX = CurrObj.x1;    }    if (_minY > CurrObj.y1)    {     _minY = CurrObj.y1;    }    if (_oldW < _maxX - _minX)    {     this.panel1.Width = _maxX - _minX;    }    if (_oldH < _maxY - _minY)    {     this.panel1.Height = _maxY - _minY;    }    if (this.panel1.Height < this.panel2.Height)    {     this.panel1.Height = this.panel2.Height;    }    if (this.panel1.Width < this.panel2.Width)    {     this.panel1.Width = this.panel2.Width;    }    #endregion    switch (IsLine)    {     case "Y":      arrow.DrawArrow(g, p, p.Brush, CurrObj.x1, CurrObj.y1, CurrObj.x2, CurrObj.y2);      xm = (CurrObj.x1 + CurrObj.x2) / 2;      ym = (CurrObj.y1 + CurrObj.y2) / 2;      AddText(xm, ym, CurrObj.Name, false);      break;     case "N":      Rct.X = CurrObj.x1;      Rct.Y = CurrObj.y1;      Rct.Width = CurrObj.x2 - CurrObj.x1;      Rct.Height = CurrObj.y2 - CurrObj.y1;      if (CurrObj.Type != String.Empty)      {       ObjImg = FindGObjectTypeImage(CurrObj.Type);       g.DrawImage(ObjImg, Rct);       AddText(CurrObj.x1, CurrObj.y1, CurrObj.Name, true);       GNetworkFlow.AdjustLinkedTo(CurrObj.Name);      }      break;    }   }  }

下面將繼續完善以下幾個功能:

1)序列化:可以將圖形序列化和反序列化,將序列化的信息保存到數據庫,也可以從數據庫加載圖形;

2)圖形節點必須要附加其他屬性和方法,為流程記錄更多的信息、例如權限配置、當前處理的人、下一步是什么節點等;

3)繪圖功能的加強,繪圖可以動態修改顏色,這樣可以區分流程在不同節點的顏色顯示;

4)布局優化算法,能否根據畫布大小,自動排列圖形...

現在又將界面做了美化,界面如下:

以上就是C#實現流程圖設計器的全部步驟,還分享了完善設計器的技巧,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品情侣自拍| 高清欧美性猛交xxxx| 一区二区三区视频免费在线观看| 国产精品一区二区三区毛片淫片| 日韩欧美在线视频观看| 精品国产一区二区三区久久久狼| 国产一区二区三区在线观看网站| 91成人在线视频| 在线观看欧美日韩国产| 日韩欧美一区视频| 久久激情视频免费观看| 亚洲精品按摩视频| 亚洲电影成人av99爱色| 欧美xxxx综合视频| 亚洲男人的天堂在线| 日韩激情av在线免费观看| 日韩久久精品电影| 日av在线播放中文不卡| 亚洲性生活视频在线观看| 亚洲免费一在线| 欧美黑人巨大xxx极品| 91精品国产自产在线老师啪| 日韩激情av在线免费观看| 在线观看日韩欧美| 国产亚洲精品91在线| 久久精品电影网| 中文字幕不卡av| 久久亚洲国产精品成人av秋霞| 国产欧美日韩中文字幕在线| 97av在线影院| 久久精品视频中文字幕| 国产日韩欧美在线视频观看| 亚洲字幕一区二区| 国外色69视频在线观看| 日韩成人av在线播放| 久久亚洲一区二区三区四区五区高| 久久久精品电影| 国产婷婷成人久久av免费高清| 中文字幕精品在线| 26uuu亚洲国产精品| 久久99国产精品自在自在app| 日韩精品免费电影| 日韩欧美在线视频| 久久免费国产视频| 色狠狠久久aa北条麻妃| 色狠狠av一区二区三区香蕉蜜桃| 亚洲欧美综合图区| 国产丝袜一区二区三区| 国产亚洲精品一区二区| 亚洲国产成人精品久久| 欧美在线www| 国产日韩av在线| 亚洲人成亚洲人成在线观看| www.99久久热国产日韩欧美.com| 欧美影院成年免费版| 清纯唯美日韩制服另类| 国内成人精品一区| 亚洲国产精品小视频| 国产成人精品久久亚洲高清不卡| 成人欧美一区二区三区黑人| 欧美亚洲国产另类| 国产精品久久久久久久久男| 精品国产999| 国产一区二区三区久久精品| 久久男人av资源网站| 欧美日韩亚洲一区二区| 日韩精品免费一线在线观看| 亚洲欧美国产一本综合首页| 亚洲精品99久久久久| 日韩欧美在线观看视频| 亚洲欧美另类国产| 成人国产在线激情| 88xx成人精品| 国产精品久久久久久久久久免费| 欧美精品在线第一页| 欧美激情极品视频| 久久在线免费视频| 成人免费淫片视频软件| 国产精品丝袜视频| 97精品免费视频| 成人久久精品视频| 亚洲激情小视频| 亚洲精品久久久久久久久久久久| xxxxx91麻豆| 亚洲欧美日韩精品久久奇米色影视| 国产婷婷成人久久av免费高清| 欧美插天视频在线播放| 国产精品91免费在线| 亚洲欧洲在线观看| 亚洲人成网在线播放| 性欧美办公室18xxxxhd| 欧美乱大交xxxxx另类电影| 成人精品在线视频| 亚洲第一福利在线观看| 亚洲激情中文字幕| 亚洲国产精品999| 亚洲精品美女在线观看播放| 亚洲欧美日韩天堂一区二区| 欧美电影免费观看| 欧美日韩一二三四五区| 国产精品自产拍在线观| 九色91av视频| 中文字幕日韩有码| 国产精品女主播视频| 亚洲 日韩 国产第一| 亚洲色图18p| 久久亚洲欧美日韩精品专区| 国产日韩精品综合网站| 91po在线观看91精品国产性色| 国内偷自视频区视频综合| 久久精品国产亚洲| 色香阁99久久精品久久久| 情事1991在线| 亚洲另类欧美自拍| 久久久久久久久91| 亚洲第一区在线| 国产91在线播放精品91| 精品国内亚洲在观看18黄| 欧美丰满少妇xxxxx| 亚洲免费电影在线观看| 亚洲免费高清视频| 国产狼人综合免费视频| 日韩视频精品在线| 国产一区二区色| 中文字幕久精品免费视频| 精品福利一区二区| 日韩中文字幕视频| 97视频在线观看免费| 日韩av影院在线观看| 中文字幕日韩精品在线观看| 亚洲美腿欧美激情另类| 欧洲亚洲女同hd| 亚洲r级在线观看| 欧美成年人在线观看| 亚洲美腿欧美激情另类| 欧美黄色片视频| 日日狠狠久久偷偷四色综合免费| 日韩精品中文字| 亚洲成色www8888| 国产小视频91| 亚洲精品美女久久久久| 成人激情视频在线播放| 欧美日韩激情小视频| 国产婷婷97碰碰久久人人蜜臀| 色综合91久久精品中文字幕| 美乳少妇欧美精品| 成人午夜一级二级三级| 久久精品国产69国产精品亚洲| 日韩亚洲国产中文字幕| 欧美性受xxx| 97在线看福利| 性欧美视频videos6一9| 欧美色另类天堂2015| 国产精品久久久久久久7电影| 国产精品久久久久久久久久ktv| 91爱视频在线| 欧美激情一区二区三级高清视频| 欧美性xxxx极品hd满灌| 最新国产成人av网站网址麻豆| 亚洲最大在线视频| 欧美成年人在线观看| 欧美性猛交xxxx| 亚洲美女视频网| 成人免费观看网址|