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

首頁 > 學院 > 開發設計 > 正文

C#如何實現一個簡單的流程圖設計器

2019-11-14 13:49:42
字體:
來源:轉載
供稿:網友

  以前看過不少Window Form開發的流程圖設計器,支持節點拖放,非常方便即可設計出很美觀的流程圖,作為一個程序員,對其內部實現原理一直很好奇,感嘆有朝一日自己如果可以開發一款類似的軟件那是多么讓人興奮的事情呀!自從有了這樣的想法,一直都在積累和學習這方面的知識,最近一個偶然的機會竟然實現了一個簡單的流程圖設計器(雖然其功能還有很多不完善之處,但是心中還是非常高興,滿滿的成就感)。

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

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

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

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

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

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

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

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

 1         /// <summary> 2         /// 繪制網格 3         /// </summary> 4         PRivate void renderGrid() 5         { 6             //全局變量存儲最大最小值,作為繪制區域 7             Graphics g = this.panel1.CreateGraphics(); 8             Color color = Color.DarkGray; 9             Pen p = new Pen(color, 1);10             p.DashStyle = DashStyle.Dash;11             for (int x = 0; x <= this.panel1.Width; x = x + 20)12             {13                 PointF p1 = new PointF(x, 0);14                 PointF p2 = new PointF(x, Height);15                 g.DrawLine(p, p1, p2);16             }17 18             for (int y = 0; y <= panel1.Height; y = y + 20)19             {20                 PointF p1 = new PointF(0, y);21                 PointF p2 = new PointF(Width, y);22                 g.DrawLine(p, p1, p2);23 24             }25 26         }
View Code

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

 1        private void panel1_MouseClick(object sender, MouseEventArgs e) 2         { 3             int X = e.X; 4             int Y = e.Y; 5             if (this.__gObjType== "") 6             { 7                 return; 8             } 9             if (this.__gObjType != "Line")10             {11                 AddObjectFromMouseLocation(X, Y, 0, 0, this.__gObjType);12             }13             else14             {15                 //line16                 if (__lineMouseClickedCount == 1)17                 {18                     __lineX2 = e.X;19                     __lineY2 = e.Y;20                     AddObjectFromMouseLocation(__lineX1, __lineY1, __lineX2, __lineY2, this.__gObjType);21 22                     //連接線方向判斷23                     __lineMouseClickedCount = 0;24                     __lineX1 = 0;25                     __lineY1 = 0;26                     __lineX2 = 0;27                     __lineY2 = 0;28                 }29                 else if (__lineMouseClickedCount == 0)30                 {31                     __lineX1 = e.X;32                     __lineY1 = e.Y;33                     __lineMouseClickedCount = 1;34                 }35                 else36                 {37                     __lineMouseClickedCount = 0;38                     __lineX1 = 0;39                     __lineY1 = 0;40                     __lineX2 = 0;41                     __lineY2 = 0;42                 }43 44             }45         }
View Code

下面給出重繪的程序:

 1        private void ReDrawAll() 2         { 3             renderGrid(); 4             Graphics g = this.panel1.CreateGraphics(); 5             g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 6             GObject CurrObj = new GObject(); 7             Rectangle Rct = new Rectangle(); 8             Pen p = new Pen(Color.Black); 9             //p.Width = 2;10             p.Width = __penWidth * __zoomTimes;11 12             Image ObjImg;13             int xm = 0;14             int ym = 0;15 16             int _maxX = 0;17             int _maxY = 0;18             int _minX = 0;19             int _minY = 0;20             int _oldW = this.panel1.Width;21             int _oldH = this.panel1.Height;22 23             string IsLine = "";24             //Nobj==50為當前畫布最大的對象個數25             for (int i = 0; i < GNetworkFlow.Nobj; i++)26             {27                 CurrObj = GNetworkFlow.GObjects[i];28                 //當前對象類型判斷29                 if (CurrObj.Type == "") IsLine = "N/D";30                 if (CurrObj.Type == "Line") IsLine = "Y";31                 if ((CurrObj.Type != "Line") && (CurrObj.Type != "")) IsLine = "N";32                 //33                 #region old panel1作為畫布,將其嵌套在panel2中實現超出邊界出現滾動條34 35                 if (_maxX < CurrObj.x2)36                 {37                     _maxX = CurrObj.x2;38                 }39                 if (_maxY < CurrObj.y2)40                 {41                     _maxY = CurrObj.y2;42                 }43                 if (_minX > CurrObj.x1)44                 {45                     _minX = CurrObj.x1;46                 }47                 if (_minY > CurrObj.y1)48                 {49                     _minY = CurrObj.y1;50                 }51 52 53 54                 if (_oldW < _maxX - _minX)55                 {56                     this.panel1.Width = _maxX - _minX;57                 }58                 if (_oldH < _maxY - _minY)59                 {60                     this.panel1.Height = _maxY - _minY;61                 }62                 if (this.panel1.Height < this.panel2.Height)63                 {64                     this.panel1.Height = this.panel2.Height;65                 }66                 if (this.panel1.Width < this.panel2.Width)67                 {68                     this.panel1.Width = this.panel2.Width;69                 }70 71                 #endregion72 73 74                 switch (IsLine)75                 {76                     case "Y":77                         arrow.DrawArrow(g, p, p.Brush, CurrObj.x1, CurrObj.y1, CurrObj.x2, CurrObj.y2);78                         xm = (CurrObj.x1 + CurrObj.x2) / 2;79                         ym = (CurrObj.y1 + CurrObj.y2) / 2;80                         AddText(xm, ym, CurrObj.Name, false);81                         break;82                     case "N":83                         Rct.X = CurrObj.x1;84                         Rct.Y = CurrObj.y1;85                         Rct.Width = CurrObj.x2 - CurrObj.x1;86                         Rct.Height = CurrObj.y2 - CurrObj.y1;87                         if (CurrObj.Type != String.Empty)88                         {89                             ObjImg = FindGObjectTypeImage(CurrObj.Type);90                             g.DrawImage(ObjImg, Rct);91                             AddText(CurrObj.x1, CurrObj.y1, CurrObj.Name, true);92                             GNetworkFlow.AdjustLinkedTo(CurrObj.Name);93                         }94                         break;95                 }96             }97 98         }
View Code

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

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

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

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

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

今天又將界面做了美化,界面如下:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲视频一区二区| 欧美成人精品在线观看| 色老头一区二区三区| 亚洲色图综合久久| 日韩精品免费视频| 久久精品国产一区二区三区| 欧美麻豆久久久久久中文| 亚洲精品视频免费| 亚洲免费视频在线观看| 国产精品一区二区久久国产| 亚洲性av网站| 国产精品一区二区av影院萌芽| 91老司机精品视频| 夜夜躁日日躁狠狠久久88av| 久久九九全国免费精品观看| 久久这里只有精品视频首页| 精品国产91久久久久久| 日韩欧美国产网站| 欧美夫妻性视频| 亚洲女人天堂网| 国产日韩精品在线播放| 欧美精品aaa| 这里只有精品在线观看| 精品无码久久久久久国产| 2018国产精品视频| 国产拍精品一二三| 丝袜美腿亚洲一区二区| 国产精品视频免费在线| 欧美日韩亚洲视频一区| 精品偷拍各种wc美女嘘嘘| 免费不卡欧美自拍视频| 精品国偷自产在线视频| 欧美伊久线香蕉线新在线| 日韩成人高清在线| 懂色aⅴ精品一区二区三区蜜月| 日韩电视剧免费观看网站| 成人国产精品色哟哟| 亚洲女人天堂成人av在线| 国产欧美va欧美va香蕉在线| 日韩精品免费视频| 91久久久久久国产精品| 久久国产精品免费视频| 成人写真福利网| 色婷婷综合成人av| 最近中文字幕mv在线一区二区三区四区| 精品亚洲一区二区三区在线播放| 亚洲精品国产电影| 色老头一区二区三区| 欧美丰满少妇xxxxx| 国产精品一区二区三区成人| 狠狠干狠狠久久| 欧美在线视频a| 国产精品尤物福利片在线观看| 国产视频精品在线| 久久精品99国产精品酒店日本| wwwwwwww亚洲| 日韩久久精品电影| 热久久视久久精品18亚洲精品| 中文字幕精品在线| 国产在线日韩在线| xvideos亚洲人网站| 日韩精品免费视频| 俺去亚洲欧洲欧美日韩| 欧美电影《睫毛膏》| 国产精品久久久久91| 久久久www成人免费精品张筱雨| 亚洲综合在线做性| 日韩中文字幕网| 日韩精品视频在线观看网址| 国产成人久久久精品一区| 欧美大片网站在线观看| 狠狠躁18三区二区一区| 91精品国产91久久久| 亚洲精品国产suv| 欧美成人免费播放| 懂色av中文一区二区三区天美| 欧美日韩激情视频| 欧美精品在线观看| 国产aⅴ夜夜欢一区二区三区| 国产精品精品一区二区三区午夜版| 黑人精品xxx一区| 国产在线观看精品| 色与欲影视天天看综合网| 亚洲天堂男人天堂女人天堂| 欧美日韩亚洲一区二| 亚洲欧洲国产精品| 久久这里有精品视频| 亚洲精品一区二区三区不| 成人黄色片网站| 久久久久久久97| 久久久国产一区二区三区| 日韩69视频在线观看| 在线观看精品国产视频| 亚洲香蕉伊综合在人在线视看| 亚洲欧美在线播放| 国产精品九九九| 亚洲国产成人精品电影| 色综合导航网站| 久久久久五月天| 中文字幕亚洲色图| 成人黄色av播放免费| 亚洲视频在线免费看| 亚洲一区二区三区香蕉| 日韩专区中文字幕| 91情侣偷在线精品国产| 国产精品丝袜久久久久久高清| 精品国产一区二区三区久久久| 亚洲天堂视频在线观看| 国产精品视频久久| 亚洲精品免费在线视频| 九九热在线精品视频| 久久久久成人精品| 亚洲精品日韩在线| 1769国内精品视频在线播放| 国产999视频| 日韩欧美在线观看视频| 国产精品网站入口| 欧美—级高清免费播放| 欧美亚洲日本网站| 亚洲第一福利在线观看| 成人网中文字幕| 亚洲www在线观看| 欧美做受高潮电影o| 欧美日韩国产第一页| 中文字幕亚洲自拍| 91精品啪在线观看麻豆免费| 欧美另类暴力丝袜| 日韩电视剧在线观看免费网站| 国产视频在线观看一区二区| 国产不卡精品视男人的天堂| 成人久久一区二区| 亚洲成人a**站| 亚洲精品福利资源站| 亚洲第一网中文字幕| 全球成人中文在线| 久久亚洲精品中文字幕冲田杏梨| 亚洲一区精品电影| 亚洲精品99久久久久| 亚洲女人天堂色在线7777| 成人精品网站在线观看| 中文字幕亚洲欧美日韩2019| 亚洲精品资源美女情侣酒店| 欧美国产日本高清在线| 国产欧美在线看| 日韩电影网在线| 亚洲偷欧美偷国内偷| 欧美中文在线免费| 亚洲无av在线中文字幕| 国产精品入口免费视| 欧美日韩国产丝袜美女| 日韩av综合网| 欧美日韩成人黄色| 国产这里只有精品| 国产欧美最新羞羞视频在线观看| 国产视频在线观看一区二区| 亚洲一区二区三区在线视频| 亚洲福利视频在线| 国产精品丝袜高跟| 精品国产鲁一鲁一区二区张丽| 欧美做受高潮电影o| 欧美黑人xxxx| 神马国产精品影院av| 日韩精品一二三四区| 欧美日韩视频免费播放|