FlowMap.cs
上传用户:yhzmled
上传日期:2014-08-04
资源大小:35k
文件大小:37k
源码类别:

xml/soap/webservice

开发平台:

C#

  1. /*
  2.  *author: l_dragon  email:l_dragon2000@163.com
  3.  *last update:2003/04/03
  4.  * */
  5. using System;
  6. using System.Collections;
  7. using System.ComponentModel;
  8. using System.Drawing;
  9. using System.Data;
  10. using System.Windows.Forms;
  11. using System.Xml;
  12. namespace gdiFlow
  13. {
  14. /// <summary>
  15. /// FlowMap 的摘要说明。
  16. /// </summary>
  17. public class FlowMap : System.Windows.Forms.UserControl
  18. {
  19. private System.ComponentModel.IContainer components;
  20. //7种状态对应菜单
  21. private System.Windows.Forms.ContextMenu menuStatus;
  22. private System.Windows.Forms.MenuItem menuAdd;
  23. private System.Windows.Forms.MenuItem menuBegin;
  24. private System.Windows.Forms.MenuItem menuCommon;
  25. private System.Windows.Forms.MenuItem menuChild;
  26. private System.Windows.Forms.MenuItem menuAuto;
  27. private System.Windows.Forms.MenuItem menuBranch;
  28. private System.Windows.Forms.MenuItem menuTogether;
  29. private System.Windows.Forms.MenuItem menuGoto;
  30. private System.Windows.Forms.MenuItem menuEnd;
  31. //状态处理对应的操作菜单
  32. private System.Windows.Forms.ContextMenu  menuDelSet;
  33. private System.Windows.Forms.MenuItem menuDelStatus;
  34. private System.Windows.Forms.MenuItem menuSetStatus;
  35. private  System.Collections.ArrayList  aryStatus=new ArrayList();//存放所有status对象,
  36. private  System.Collections.ArrayList aryDisposal=new ArrayList();//存放所有Disposal对象
  37. public  FlowStatus gStatus;//在Form中被选中的唯一状态;
  38. private FlowStatus gFrom=null,gTo=null;//画线时的from 和 to
  39. private int intMouseX;//鼠标按下时坐标x值
  40. private int intMouseY;//鼠标按下时坐标Y值
  41. private bool blCtrlDown=false;//ctrl键是否按下
  42. private int intStatusW=90;//状态对象矩形的宽度;
  43. private int intStautsH=45;//状态对象矩形的高度;
  44. /*
  45.  * 状态类型ID,STATUS_TYPE_ID  
  46.  *  0 开始
  47. 1 结束
  48. 2 普通
  49. 3 子流
  50. 4 自动
  51. 5 分流
  52. 6 合流
  53. 7 转流程
  54. */
  55. private int intStatusType;//状态类型
  56. public FlowMap()
  57. {
  58. // 该调用是 Windows.Forms 窗体设计器所必需的。
  59. InitializeComponent();
  60. }
  61. /// <summary> 
  62. /// 清理所有正在使用的资源。
  63. /// </summary>
  64. protected override void Dispose( bool disposing )
  65. {
  66. if( disposing )
  67. {
  68. if(components != null)
  69. {
  70. components.Dispose();
  71. }
  72. }
  73. base.Dispose( disposing );
  74. }
  75. #region Component Designer generated code
  76. /// <summary> 
  77. /// 设计器支持所需的方法 - 不要使用代码编辑器 
  78. /// 修改此方法的内容。
  79. /// </summary>
  80. private void InitializeComponent()
  81. {
  82. // 
  83. // FlowMap
  84. // 
  85. this.Name = "FlowMap";
  86. this.Size = new System.Drawing.Size(512, 344);
  87. this.Load += new System.EventHandler(this.FlowMap_Load);
  88. this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.myMouseUp);
  89. this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.myKeyUp);
  90. this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.myKeyDown);
  91. this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.myMouseMove);
  92. this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.myMouseDown);
  93. }
  94. #endregion
  95. private void menuBegin_Click(object sender, System.EventArgs e)
  96. {
  97. this.intStatusType=0;
  98. addStatus();
  99. }
  100. private void menuCommon_Click(object sender, System.EventArgs e)
  101. {
  102. this.intStatusType=2;
  103. addStatus();
  104. }
  105. private void menuChild_Click(object sender, System.EventArgs e)
  106. {
  107. this.intStatusType=3;
  108. addStatus();
  109. }
  110. private void menuAuto_Click(object sender, System.EventArgs e)
  111. {
  112. this.intStatusType=4;
  113. addStatus();
  114. }
  115. private void menuBranch_Click(object sender, System.EventArgs e)
  116. {
  117. this.intStatusType=5;
  118. addStatus();
  119. }
  120. private void menuTogether_Click(object sender, System.EventArgs e)
  121. {
  122. this.intStatusType=6;
  123. addStatus();
  124. }
  125. private void menuGoto_Click(object sender, System.EventArgs e)
  126. {
  127. this.intStatusType=7;
  128. addStatus();
  129. }
  130. private void menuEnd_Click(object sender, System.EventArgs e)
  131. {
  132. this.intStatusType=1;
  133. addStatus();
  134. }
  135. public void addStatus()
  136. {
  137. //增加状态按钮按下,新建一个状态,在状态列表中增加一个状态对象.
  138. //如果状态对象列表中有已经被删除的状态对象,
  139. //将其在新位置重新显示
  140. for(int i=0;i<aryStatus.Count;i++)
  141. FlowStatus objTempS=(FlowStatus)aryStatus[i];
  142. if(objTempS.blDisplay==false)
  143. {   
  144.   objTempS._x=this.intMouseX;
  145.   objTempS._y=this.intMouseY;
  146.   objTempS.intStatusTypeId=this.intStatusType;
  147.   objTempS.blDisplay=true;
  148.   int j=i+1;
  149.   objTempS.dblStatusId=Convert.ToDouble(j); 
  150.   objTempS.strStatusName="状态"+Convert.ToString(j);
  151.   repaint();
  152.   return;
  153. }
  154. }
  155. FlowStatus objStatus=new FlowStatus(intMouseX,intMouseY,this.intStatusW,this.intStautsH);
  156. objStatus.intStatusTypeId=this.intStatusType; 
  157. int intI=aryStatus.Count+1;
  158. objStatus.dblStatusId=Convert.ToDouble(intI); 
  159. objStatus.strStatusName="状态"+Convert.ToString(intI); 
  160. this.aryStatus.Add(objStatus); 
  161.     repaint();
  162. }
  163. //删除一个状态(status)对象
  164. private void menuDelStatus_Click(object sender, System.EventArgs e)
  165. {
  166. if(this.gStatus!=null)
  167. {
  168. if(gStatus.intStatusTypeId==0)
  169. {
  170. MessageBox.Show("开始状态不能删除!"); 
  171. return;
  172. }
  173. if(gStatus.intStatusTypeId==1)
  174. {
  175. MessageBox.Show("结束状态不能删除!"); 
  176. return;
  177. }
  178. double tempStatusId=gStatus.dblStatusId;
  179.  
  180. int j=aryDisposal.Count;
  181. for(int i=0;i<j;i++)
  182. {   
  183. FlowDisposal objDisp=(FlowDisposal)aryDisposal[i];
  184. if(objDisp.dblCurStatusId==tempStatusId || objDisp.dblPreStatusId==tempStatusId)
  185. {
  186.  objDisp.clearProperty();
  187. }
  188. }
  189. this.gStatus.clearProperty();
  190. this.gStatus=null;
  191. }
  192. }
  193. private void menuSetStatus_Click(object sender, System.EventArgs e)
  194. {
  195. frmStatusSet frmSet=new frmStatusSet();
  196. frmSet.setThisStatus(this.gStatus);
  197. frmSet.setAryStatus(this.aryStatus);
  198. frmSet.setAryDisposal(this.aryDisposal); 
  199. frmSet.MaximizeBox=false;
  200. frmSet.MinimizeBox=false;
  201. frmSet.ShowDialog(); 
  202. repaint();
  203. }
  204. //显示增加时的右键菜单
  205. public void showMenu(MouseEventArgs ex)
  206. {
  207. this.intMouseX=ex.X;
  208. this.intMouseY=ex.Y;
  209. this.menuStatus = new System.Windows.Forms.ContextMenu();
  210. this.menuAdd = new System.Windows.Forms.MenuItem();
  211. this.menuBegin = new System.Windows.Forms.MenuItem();
  212. this.menuCommon = new System.Windows.Forms.MenuItem();
  213. this.menuChild = new System.Windows.Forms.MenuItem();
  214. this.menuAuto = new System.Windows.Forms.MenuItem();
  215. this.menuBranch = new System.Windows.Forms.MenuItem();
  216. this.menuTogether = new System.Windows.Forms.MenuItem();
  217. this.menuGoto = new System.Windows.Forms.MenuItem();
  218. this.menuEnd = new System.Windows.Forms.MenuItem();
  219. // 
  220. // menuStatus
  221. // 
  222. this.menuStatus.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
  223.    this.menuAdd});
  224. // 
  225. // menuAdd
  226. // 
  227. this.menuAdd.Index = 0;
  228. this.menuAdd.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
  229. this.menuBegin,
  230. this.menuCommon,
  231. this.menuChild,
  232. this.menuAuto,
  233. this.menuBranch,
  234. this.menuTogether,
  235. this.menuGoto,
  236. this.menuEnd});
  237. this.menuAdd.Text = "添加状态";
  238. // 
  239. // menuBegin
  240. // 
  241. this.menuBegin.Index = 0;
  242. this.menuBegin.Text = "开始";
  243. this.menuBegin.Click += new System.EventHandler(this.menuBegin_Click);
  244. // 
  245. // menuCommon
  246. // 
  247. this.menuCommon.Index = 1;
  248. this.menuCommon.Text = "普通";
  249. this.menuCommon.Click += new System.EventHandler(this.menuCommon_Click);
  250. // 
  251. // menuChild
  252. // 
  253. this.menuChild.Index = 2;
  254. this.menuChild.Text = "子流";
  255. this.menuChild.Click += new System.EventHandler(this.menuChild_Click);
  256. // 
  257. // menuAuto
  258. // 
  259. this.menuAuto.Index = 3;
  260. this.menuAuto.Text = "自动";
  261. this.menuAuto.Click += new System.EventHandler(this.menuAuto_Click);
  262. // 
  263. // menuBranch
  264. // 
  265. this.menuBranch.Index = 4;
  266. this.menuBranch.Text = "分流";
  267. this.menuBranch.Click += new System.EventHandler(this.menuBranch_Click);
  268. // 
  269. // menuTogether
  270. // 
  271. this.menuTogether.Index = 5;
  272. this.menuTogether.Text = "合流";
  273. this.menuTogether.Click += new System.EventHandler(this.menuTogether_Click);
  274. // 
  275. // menuGoto
  276. // 
  277. this.menuGoto.Index = 6;
  278. this.menuGoto.Text = "转流程";
  279. this.menuGoto.Click += new System.EventHandler(this.menuGoto_Click);
  280. // 
  281. // menuEnd
  282. // 
  283. this.menuEnd.Index = 7;
  284. this.menuEnd.Text = "结束";
  285. this.menuEnd.Click += new System.EventHandler(this.menuEnd_Click);
  286. this.ContextMenu=  this.menuStatus;
  287. }
  288. //设置处理的右键菜单
  289. public void showStatusMenu()
  290. {
  291. this.menuDelSet=new System.Windows.Forms.ContextMenu();
  292. this.menuDelStatus  =new  System.Windows.Forms.MenuItem() ;
  293. this.menuSetStatus =new  System.Windows.Forms.MenuItem();
  294. this.menuDelStatus.Text="删除";
  295. this.menuDelStatus.Click += new System.EventHandler(this.menuDelStatus_Click);
  296. this.menuSetStatus.Text="属性";
  297. this.menuSetStatus.Click += new System.EventHandler(this.menuSetStatus_Click);
  298. this.menuDelSet.MenuItems.Add(menuDelStatus);
  299. this.menuDelSet.MenuItems.Add("-");   
  300. this.menuDelSet.MenuItems.Add(menuSetStatus); this.ContextMenu=this.menuDelSet;     
  301. }
  302. public void myMouseDown(object sender, MouseEventArgs ex)
  303. {  
  304. int intClickCount=ex.Clicks;
  305. if(ex.Button == MouseButtons.Left)
  306. {
  307. if(intClickCount==1)
  308.    {
  309.    this.drawMouseObjs(ex,1);
  310.    }
  311. if(intClickCount==2 )//鼠标左键双击
  312. {
  313. this.gStatus=this.SelectStatus(ex.X,ex.Y);//选中了某状态对象 
  314. if(gStatus!=null)
  315. {
  316. frmStatusSet frmSet=new frmStatusSet();
  317. frmSet.setThisStatus(this.gStatus);
  318. frmSet.setAryStatus(this.aryStatus);
  319. frmSet.setAryDisposal(this.aryDisposal); 
  320. frmSet.MaximizeBox=false;
  321. frmSet.MinimizeBox=false;
  322. frmSet.ShowDialog(); 
  323. repaint();
  324. }
  325. }
  326. }
  327. if(ex.Button == MouseButtons.Right)//鼠标右键
  328. {
  329. this.gStatus=this.SelectStatus(ex.X,ex.Y);//选中了某状态对象 
  330. if(gStatus!=null)
  331. {
  332. this.showStatusMenu(); //显示设置当前状态对象的菜单
  333. }
  334. else
  335. {
  336. showMenu(ex);//显示增加对象的菜单
  337. }
  338. }
  339. }
  340. public void myMouseMove(object sender, MouseEventArgs ex)
  341. {
  342. if(ex.Button == MouseButtons.Left )
  343. {   
  344. this.drawMouseObjs(ex,2);
  345. }
  346. }
  347. public void myMouseUp(object sender, MouseEventArgs ex)
  348. {
  349. if(ex.Button == MouseButtons.Left )
  350. {   
  351. this.drawMouseObjs(ex,3);
  352. }
  353. }
  354. public void myKeyDown(object sender, KeyEventArgs  ex)
  355. {
  356. if(ex.Control==true)//键盘中ctrl键被按下
  357. {
  358. int intCount=this.aryStatus.Count;
  359. if(intCount==0)
  360. return;
  361. }
  362. else
  363. {
  364. foreach (Object item in aryStatus)
  365. {
  366. FlowStatus objTemp=(FlowStatus)item;
  367. objTemp.isMove=0;
  368. }
  369. }  
  370. this.blCtrlDown=true;  
  371. }
  372. }
  373. // public void myKeyPressed(Object o, KeyPressEventArgs e)
  374. //{
  375. //if(e.KeyChar == (char)13)
  376. //e.Handled=true;
  377. //}
  378. public void myKeyUp(object sender, KeyEventArgs  ex)//键盘中ctrl键被松开
  379. {
  380. if(ex.Control==true)
  381. {
  382. int intCount=this.aryStatus.Count;
  383. if(intCount==0)
  384. return;
  385. }
  386. else
  387. {
  388. foreach (Object item in aryStatus)
  389. {
  390. FlowStatus objTemp=(FlowStatus)item;
  391. objTemp.isMove=1;
  392. }
  393. }
  394. }
  395. this.blCtrlDown=false;
  396. }
  397. /**
  398.  *   鼠标事件触发时画图的处理
  399.  * @param MouseEventArgs ex鼠标事件
  400.  * @param int  intEvent 鼠标事件类型
  401.  * <br>intEvent等于1.代表鼠标按下.intEvent等于2.代表鼠标移动.intEvent等于3.代表鼠标松开.
  402. *<br>处理步骤如下:
  403. *<br>intEvent等于1,鼠标按下时如果鼠标的坐标在某状态内,更新状态的last_x,last_y坐标(用来在以移动后更新状态坐标位置)
  404. * 该状态可以移动
  405. *<br>intEvent等于2,如果状态可以移动,更新状态位置
  406. *<br>intEvent等于3,如果状态可以移动,更新状态位置,设置该状态为不能移动。
  407. *  **/
  408. public void drawMouseObjs(MouseEventArgs ex,int intEvent)
  409. {
  410. int statusSize=aryStatus.Count;  
  411. if(statusSize==0) return ;
  412. if(this.blCtrlDown==false)//ctrl键没有按下
  413. {
  414. foreach (Object item in aryStatus)
  415. {
  416. FlowStatus objStatus=(FlowStatus)item;
  417. switch(intEvent) 
  418. {
  419. case 1://mouseDown()
  420. if(objStatus.contains(ex.X,ex.Y))
  421. {
  422. Graphics g = this.CreateGraphics();
  423. objStatus.last_x= objStatus._x - ex.X;
  424. objStatus.last_y = objStatus._y-ex.Y;
  425. objStatus.isMove=1;
  426. int x1=objStatus._x;
  427. int y1=objStatus._y;
  428. int w1=objStatus._w;
  429. int h1=objStatus._h;
  430. Pen penWhite=new Pen(Color.White,2);
  431. g.DrawRectangle(penWhite,x1,y1,w1,h1);
  432. g.FillRectangle(new SolidBrush(Color.White),x1,y1,w1,h1);
  433. g.FillRectangle(new SolidBrush(Color.White),x1+6,y1+6,w1,h1); 
  434. g.DrawRectangle(new Pen(Color.Black),x1,y1,w1,h1);
  435. g.Dispose();
  436. return;
  437. }
  438. break;
  439. case 2://mouseMove()
  440. if(objStatus.isMove==1)
  441. {
  442. Graphics g = this.CreateGraphics();
  443. int x1=objStatus._x;
  444. int y1=objStatus._y;
  445. int w1=objStatus._w;
  446. int h1=objStatus._h;
  447. g.DrawRectangle(new Pen(Color.White),x1,y1,w1,h1); 
  448. objStatus.setLocation(ex.X,ex.Y);
  449. this.checkStatus(objStatus);
  450. int x2=objStatus._x;
  451. int y2=objStatus._y;
  452. Pen penBlack=new Pen(Color.Black);
  453. g.DrawRectangle(penBlack,x2,y2,w1,h1); 
  454. g.Dispose();
  455. return;
  456. }
  457. break;
  458. case 3://mouseUp()
  459. if(objStatus.isMove==1)
  460. {
  461. updateLocation(ex,objStatus);
  462. objStatus.isMove=0;
  463. repaint();
  464. return;
  465. }
  466. break;
  467. }//end switch
  468. }//end for
  469. }//end if
  470. else if(this.blCtrlDown==true)//ctrl键按下
  471. {
  472. foreach (Object item in aryStatus)
  473. {
  474. FlowStatus objStatus=(FlowStatus)item;
  475. switch(intEvent) 
  476. {
  477. case 1://mouseDown()
  478. if(objStatus.contains(ex.X,ex.Y))
  479. {
  480. this.gFrom=objStatus;
  481. return;
  482. }
  483. break;
  484. case 2://mouseMove()
  485. break;
  486. case 3://mouseUp()
  487. this.blCtrlDown=false;
  488. if(this.gFrom!=null)
  489. {
  490. if(objStatus.contains(ex.X,ex.Y)&&objStatus.dblStatusId!=gFrom.dblStatusId)
  491. {  
  492. this.gTo=objStatus;
  493. if(gFrom.intStatusTypeId==1)
  494. {
  495. MessageBox.Show("结束状态只有流入的处理!");
  496. gFrom=null;
  497. gTo=null;
  498. return;
  499. }
  500. if(gTo.intStatusTypeId==0)
  501. {
  502. MessageBox.Show("起始状态只有流出的处理!");
  503. gFrom=null;
  504. gTo=null;
  505. return;
  506. }
  507. int intDispCount=this.aryDisposal.Count;
  508. if(intDispCount!=0)
  509. {
  510. foreach (Object item2 in aryDisposal)
  511. {
  512. FlowDisposal objTemp=(FlowDisposal)item2;
  513. if(objTemp.dblPreStatusId ==gFrom.dblStatusId  && objTemp.dblCurStatusId==gTo.dblStatusId)
  514. {
  515. MessageBox.Show("该处理已经存在!");
  516. return;
  517. }
  518. }
  519. }
  520. //如果处理对象列表中有已经被删除的处理对象,
  521. //将其在新位置重新显示
  522. for(int i=0;i<this.aryDisposal.Count;i++)
  523. FlowDisposal tempDisp=(FlowDisposal)aryDisposal[i];
  524. if(tempDisp.blDisplay==false)
  525. {   
  526. int x1=gFrom._x+Convert.ToInt32(gFrom._w/2);
  527. int y1=gFrom._y+Convert.ToInt32(gFrom._h/2);
  528. int x2=gTo._x+Convert.ToInt32(gTo._w/2);
  529. int y2=gTo._y+Convert.ToInt32(gTo._h/2); tempDisp.x1=x1; tempDisp.y1=y1; tempDisp.x2=x2; tempDisp.y2=y2; tempDisp.intCurX=Convert.ToInt32((x1+x2)/2); tempDisp.intCurY=Convert.ToInt32((y1+y2)/2); tempDisp.dblPreStatusId=gFrom.dblStatusId; tempDisp.dblCurStatusId=gTo.dblStatusId;
  530. tempDisp.blDisplay=true;
  531. int j=i+1;
  532. tempDisp.dblDisposalId=Convert.ToDouble(j); 
  533. tempDisp.strDisposalName="处理"+Convert.ToString(j);
  534. tempDisp.lbDispName.Text="处理"+Convert.ToString(j);
  535. tempDisp.lbDispName.Location = new System.Drawing.Point(tempDisp.intCurX-Convert.ToInt32(tempDisp.intlblw/2) , tempDisp.intCurY-Convert.ToInt32(tempDisp.intlblh/2) );
  536. tempDisp.lbDispName.Visible=true;
  537. tempDisp.aryStatusObjs=this.aryStatus;
  538. repaint();
  539. return;
  540. }
  541. }
  542. FlowDisposal objTempDisp=new FlowDisposal(gFrom,gTo);
  543. objTempDisp.getFormwh(this.Width,this.Height);//让Disposal中的lable得到Form的大小,防止label在移动时移出Form;
  544. int intTemp=this.aryDisposal.Count+1;
  545. objTempDisp.dblDisposalId=Convert.ToDouble(intTemp); 
  546. objTempDisp.strDisposalName="处理"+Convert.ToString(intTemp); 
  547. objTempDisp.lbDispName.Text="处理"+Convert.ToString(intTemp); 
  548. this.aryDisposal.Add(objTempDisp);
  549. objTempDisp.aryDisp=this.aryDisposal; //将aryDisposal传入Disposal对象.用来在删除时,remove掉Disposal列表里面对应的对象
  550. objTempDisp.aryStatusObjs=this.aryStatus;//将aryStatus传入到disposal对象,用来设置经办状态;
  551. repaint();
  552. return;
  553. }
  554. }
  555. break;
  556. }//end switch
  557. }//end for
  558. }
  559. }
  560. public void drawAllDisposal()//画所有的线
  561. {
  562. foreach (Object item in aryDisposal)
  563. {
  564. FlowDisposal objDisp=(FlowDisposal)item;
  565. if(objDisp.blDisplay)
  566. {
  567. Graphics g = this.CreateGraphics();
  568. Pen penBlack=new Pen(Color.Black);
  569. g.DrawLine(penBlack,objDisp.x1,objDisp.y1,objDisp.intCurX,objDisp.intCurY); 
  570. drawArrowLine(objDisp.intCurX,objDisp.intCurY,objDisp.x2,objDisp.y2);
  571. g.Dispose();
  572. this.Controls.Add(objDisp.lbDispName);
  573. }
  574. }
  575. }
  576. public void drawArrowLine(int xFrom,int yFrom,int xTo,int yTo)//画第2点带箭头的线
  577. {
  578. Graphics g = this.CreateGraphics();
  579. Pen penBlack=new Pen(Color.Black);
  580. g.DrawLine( penBlack,xFrom,yFrom,xTo,yTo);
  581. int cxArrow = 12 ;
  582. double angSlope = 0;
  583. double angOffset = Math.PI/8;
  584. int xDiv = 0, yDiv = 0;
  585. int xTD = 0, yTD = 0;
  586. int xTF = xFrom - xTo;
  587. int yTF = yFrom - yTo;
  588. if (xTF == 0)
  589. {//如果是垂直线没有atan2
  590. if (yTF>0)
  591. {
  592. angSlope = Math.PI/2;//90度
  593. }
  594. else
  595. {
  596. angSlope = -(Math.PI/2);//负90度
  597. }
  598. }
  599. else
  600. {
  601. angSlope = Math.Atan2(yTF,xTF);//正切弧度
  602. }
  603. xTD = (int)( cxArrow * Math.Cos( angSlope - angOffset) );
  604. yTD = (int)( cxArrow * Math.Sin( angSlope - angOffset) );
  605. xDiv = xTo + xTD;
  606. yDiv = yTo + yTD;
  607. g.DrawLine(penBlack,xTo,yTo,xDiv,yDiv);
  608. xTD = (int)( cxArrow * Math.Cos( angSlope + angOffset) );
  609. yTD = (int)( cxArrow * Math.Sin( angSlope + angOffset) );
  610. xDiv = xTo + xTD;
  611. yDiv = yTo + yTD;
  612. g.DrawLine(penBlack,xTo,yTo,xDiv,yDiv);
  613. g.Dispose();
  614. }
  615. /**
  616.   *  拖拽后更新状态和处理的位置。
  617. *  @param MouseEventArgs e 鼠标事件
  618. *  @param FlowStatus objStatus 状态对象
  619. *<br>处理步骤如下:
  620. *<br>确定托拽后的新坐标
  621. *<br>判定新状态是否在面板坐标内,如果不在,将其改变在面板内。
  622. *<br>更新状态的新位置
  623. *<br>更新与状态关联的处理的新位置。
  624. *<br>重画
  625. *  **/
  626. public void updateLocation(MouseEventArgs e,FlowStatus objStatus)
  627. {
  628. objStatus.setLocation(e.X,e.Y);
  629. this.checkStatus(objStatus);//节点是否在画板内。
  630. int PosX=objStatus._x+Convert.ToInt32(objStatus._w/2);
  631. int PosY=objStatus._y+Convert.ToInt32(objStatus._h/2);
  632. double dblStatusId=objStatus.dblStatusId;
  633. foreach (Object item in aryDisposal)
  634. {
  635. FlowDisposal objDispTemp=(FlowDisposal)item;
  636. double dblFromId=objDispTemp.dblPreStatusId;
  637. double dblToId=objDispTemp.dblCurStatusId;
  638. if(dblStatusId==dblFromId)
  639. {
  640. objDispTemp.x1=PosX;
  641. objDispTemp.y1=PosY;
  642. }
  643. if(dblStatusId==dblToId)
  644. {
  645. objDispTemp.x2=PosX;
  646. objDispTemp.y2=PosY;
  647. }
  648. }
  649. }
  650. /**
  651.  * 让状态图形始终处在画板内
  652.  *@param FlowStatus objStatus
  653.  **/
  654. public  void checkStatus(FlowStatus objStatus)
  655. {
  656. int w = this.Width;
  657. int h = this.Height;
  658. int new_x = objStatus._x;
  659. int new_y = objStatus._y;
  660. int statusW=objStatus._w;
  661. int statusH=objStatus._h;
  662. if((objStatus._x+statusW)>w)
  663. {
  664. new_x = (int)w-statusW-6;
  665. }
  666. if(objStatus._x< 0)
  667. {
  668. new_x = 0;
  669. }
  670. if((objStatus._y+statusH)>h)
  671. {
  672. new_y = (int)h-statusH-6;
  673. }
  674. if(objStatus._y < 0)
  675. {
  676. new_y = 0;
  677. }
  678. objStatus._x=new_x;
  679. objStatus._y=new_y;
  680. }
  681. protected override void OnPaint(PaintEventArgs e) 
  682. {
  683. repaint();
  684. base.OnPaint(e);
  685. }
  686. public void repaint()//画图
  687. {
  688. String strType="";
  689. Graphics g = this.CreateGraphics();
  690. //先将图形所有区域用白色填充
  691. Pen WhitePen=new Pen(Color.White);
  692. g.DrawRectangle(WhitePen,0,0,this.Width,this.Height); 
  693. g.FillRectangle(new SolidBrush(Color.White),0,0,this.Width,this.Height);
  694. //填充完毕
  695. foreach (Object item in aryStatus)//画代表状态的矩形    
  696. {
  697. FlowStatus objStatus=(FlowStatus)item;
  698. if(objStatus.blDisplay)//是否已经被删除,如果没有blDisplay==true则画图显示
  699. {
  700. int intType=objStatus.intStatusTypeId;
  701. int x1=objStatus._x;
  702. int y1=objStatus._y;
  703. int w1=objStatus._w;
  704. int h1=objStatus._h;
  705. string strName=objStatus.strStatusName;
  706. Pen penBlack=new Pen(Color.Black,2);
  707. g.DrawRectangle(penBlack,x1,y1,w1,h1); 
  708. g.FillRectangle(new SolidBrush(Color.FromArgb(30,30,30)),x1+6,y1+6,w1,h1);
  709. g.FillRectangle(new SolidBrush(Color.Orange),x1,y1,w1,Convert.ToInt32(h1*0.6));
  710. g.FillRectangle(new SolidBrush(Color.Blue),x1,y1+Convert.ToInt32((h1*0.6)),w1,Convert.ToInt32(h1*0.4));
  711. switch(intType)
  712. {
  713. case 0:
  714. strType="开始";
  715. break;
  716. case 1:
  717. strType="结束";
  718. break;
  719. case 2:
  720. strType="普通";
  721. break;
  722. case 3:
  723. strType="子流";
  724. break;
  725. case 4:
  726. strType="自动";
  727. break;
  728. case 5:
  729. strType="分流";
  730. break;
  731. case 6:
  732. strType="合流";
  733. break;
  734. case 7:
  735. strType="转流程";
  736. break;
  737. }
  738. Font drawFont = new Font("宋体", 9);
  739. StringFormat drawFormat = new StringFormat();
  740. drawFormat.Alignment = StringAlignment.Center;
  741. SolidBrush drawBrush = new SolidBrush(Color.Black);
  742. RectangleF drawRect = new RectangleF( x1, y1, w1, Convert.ToInt32(h1*0.6));
  743. RectangleF drawRect2 = new RectangleF( x1, y1+Convert.ToInt32(h1*0.6), w1, Convert.ToInt32(h1*0.4));
  744. g.DrawString(strType,drawFont, drawBrush, drawRect, drawFormat);
  745. g.DrawString(strName,drawFont, new SolidBrush(Color.White), drawRect2, drawFormat);
  746. }//end if 
  747. }//end for
  748. g.Dispose();//画代表状态的矩形     
  749. this.drawAllDisposal();//画线   
  750. }
  751. public FlowStatus SelectStatus(int mouseX,int mouseY)//通过鼠标点的位置找到包含该点的状态对象
  752. {
  753. FlowStatus objStatus=null;
  754. int statusSize=aryStatus.Count;  
  755. if(statusSize==0) return null;
  756. foreach (Object item in aryStatus)
  757. {
  758. FlowStatus objTemp=(FlowStatus)item;
  759. if(objTemp.contains(mouseX,mouseY))
  760. {
  761. objStatus=objTemp;
  762. return objStatus;
  763. }
  764. }
  765. return objStatus;
  766. }
  767. private void FlowMap_Load(object sender, System.EventArgs e)
  768. {
  769. }
  770. public string objToXml()//将拓扑图生成xml字符串
  771. {
  772. try
  773. {
  774. XmlDocument doc= new XmlDocument();
  775. doc.LoadXml("<root></root>");//根节点
  776. XmlNode root = doc.DocumentElement;
  777. XmlElement elemMap = doc.CreateElement("FlowMap");//拓扑图节点
  778. XmlAttribute mapAttr = doc.CreateAttribute("ID");//拓扑图编号
  779. mapAttr.Value = "1";
  780. elemMap.Attributes.Append(mapAttr);
  781. XmlElement elemStatusList=doc.CreateElement("StatusList");//状态对象列表节点
  782. elemMap.AppendChild(elemStatusList);
  783. foreach(FlowStatus itemStatus in this.aryStatus)
  784. {
  785. if(itemStatus.blDisplay)//状态对象没有被删除
  786. {
  787. XmlElement elemStatus = doc.CreateElement("Status");//状态对象节点
  788. XmlAttribute StatusAttr = doc.CreateAttribute("statusId");//状态对象编号
  789. StatusAttr.Value =Convert.ToString(itemStatus.dblStatusId);
  790. elemStatus.Attributes.Append(StatusAttr);
  791. //状态对象的其余属性用xml节点来表示
  792. XmlElement elemstatusTypeId = doc.CreateElement("statusTypeId");
  793. elemstatusTypeId.InnerText=Convert.ToString(itemStatus.intStatusTypeId);
  794. elemStatus.AppendChild(elemstatusTypeId);
  795. XmlElement elemstatusName = doc.CreateElement("statusName");
  796. elemstatusName.InnerText=itemStatus.strStatusName;
  797. elemStatus.AppendChild(elemstatusName);
  798. XmlElement elemstatusX = doc.CreateElement("statusX");
  799. elemstatusX.InnerText=Convert.ToString(itemStatus._x);
  800. elemStatus.AppendChild(elemstatusX);
  801. XmlElement elemstatusY = doc.CreateElement("statusY");
  802. elemstatusY.InnerText=Convert.ToString(itemStatus._y);
  803. elemStatus.AppendChild(elemstatusY);
  804. XmlElement elemstatusJoinRule = doc.CreateElement("statusJoinRule");
  805. elemstatusJoinRule.InnerText=Convert.ToString(itemStatus.strJoinRule);
  806. elemStatus.AppendChild(elemstatusJoinRule);
  807. XmlElement elemstatusInterfixField = doc.CreateElement("statusInterfixField");
  808. elemstatusInterfixField.InnerText=Convert.ToString(itemStatus.strInterfixField);
  809. elemStatus.AppendChild(elemstatusInterfixField);
  810. XmlElement elemsstatusComExtend = doc.CreateElement("statusComExtend");
  811. elemsstatusComExtend.InnerText=itemStatus.strComExtend;
  812. elemStatus.AppendChild(elemsstatusComExtend);
  813. XmlElement elemstatusChildFlowType = doc.CreateElement("statusChildFlowType");
  814. elemstatusChildFlowType.InnerText=itemStatus.strChildFlowType;
  815. elemStatus.AppendChild(elemstatusChildFlowType);
  816. XmlElement elemstatusChildFlowHint = doc.CreateElement("statusChildFlowHint");
  817. elemstatusChildFlowHint.InnerText=itemStatus.strChildFlowHint;
  818. elemStatus.AppendChild(elemstatusChildFlowHint);
  819. XmlElement elemstatusChildFlow = doc.CreateElement("statusChildFlow");
  820. elemstatusChildFlow.InnerText=itemStatus.strChildFlow;
  821. elemStatus.AppendChild(elemstatusChildFlow);
  822. XmlElement elemstatusChangeFlowName = doc.CreateElement("statusChangeFlowName");
  823. elemstatusChangeFlowName.InnerText=itemStatus.strChangeFlowName;
  824. elemStatus.AppendChild(elemstatusChangeFlowName);
  825. XmlElement elemstatusChangeStatusName = doc.CreateElement("statusChangeStatusName");
  826. elemstatusChangeStatusName.InnerText=itemStatus.strChangeStatusName;
  827. elemStatus.AppendChild(elemstatusChangeStatusName);
  828. XmlElement elemstatusAutoFieldList = doc.CreateElement("statusAutoFieldList");
  829. elemstatusAutoFieldList.InnerText=itemStatus.strAutoFieldList;
  830. elemStatus.AppendChild(elemstatusAutoFieldList);
  831. XmlElement elemstatusAutoRule = doc.CreateElement("statusAutoRule");
  832. elemstatusAutoRule.InnerText=itemStatus.strAutoRule;
  833. elemStatus.AppendChild(elemstatusAutoRule);
  834. XmlElement elemstatusAutoFieldName = doc.CreateElement("statusAutoFieldName");
  835. elemstatusAutoFieldName.InnerText=itemStatus.strAutoFieldName;
  836. elemStatus.AppendChild(elemstatusAutoFieldName);
  837. XmlElement elemstatusJoinRule2= doc.CreateElement("statusJoinRule2");
  838. elemstatusJoinRule2.InnerText=itemStatus.strJoinRule2;
  839. elemStatus.AppendChild(elemstatusJoinRule2);
  840. elemStatusList.AppendChild(elemStatus);//将状态对象加入到状态对象列表中
  841. }
  842. }
  843. XmlElement elemDisposalList=doc.CreateElement("DisposalList");//处理对象列表节点
  844. elemMap.AppendChild(elemDisposalList);
  845. foreach(FlowDisposal itemDisp in this.aryDisposal)
  846. {
  847. if(itemDisp.blDisplay)//没有被删除
  848. {
  849. XmlElement elemDisp= doc.CreateElement("Disposal");//处理对象节点
  850. XmlAttribute DispAttr = doc.CreateAttribute("disposalId");//处理对象编号
  851. DispAttr.Value =Convert.ToString(itemDisp.dblDisposalId);
  852. elemDisp.Attributes.Append(DispAttr);
  853. //处理对象的其余属性用xml节点来表示
  854. XmlElement elemdisposalName = doc.CreateElement("disposalName");
  855. elemdisposalName.InnerText=itemDisp.strDisposalName;
  856. elemDisp.AppendChild(elemdisposalName);
  857. XmlElement elemdisposalHint = doc.CreateElement("disposalHint");
  858. elemdisposalHint.InnerText=itemDisp.strDisposalHint;
  859. elemDisp.AppendChild(elemdisposalHint);
  860. XmlElement elemdisposalTransactStatusId = doc.CreateElement("disposalTransactStatusId");
  861. elemdisposalTransactStatusId.InnerText=Convert.ToString(itemDisp.dblTransactStatusId);
  862. elemDisp.AppendChild(elemdisposalTransactStatusId);
  863. XmlElement elemdisposalGroupLimit = doc.CreateElement("disposalGroupLimit");
  864. elemdisposalGroupLimit.InnerText=Convert.ToString(itemDisp.intGroupLimit);
  865. elemDisp.AppendChild(elemdisposalGroupLimit);
  866. XmlElement elemdisposalCurStatusId = doc.CreateElement("disposalCurStatusId");
  867. elemdisposalCurStatusId.InnerText=Convert.ToString(itemDisp.dblCurStatusId);
  868. elemDisp.AppendChild(elemdisposalCurStatusId);
  869. XmlElement elemdisposalPreStatusId = doc.CreateElement("disposalPreStatusId");
  870. elemdisposalPreStatusId.InnerText=Convert.ToString(itemDisp.dblPreStatusId);
  871. elemDisp.AppendChild(elemdisposalPreStatusId);
  872. XmlElement elemdisposalX = doc.CreateElement("disposalX");
  873. elemdisposalX.InnerText=Convert.ToString(itemDisp.intCurX);
  874. elemDisp.AppendChild(elemdisposalX);
  875. XmlElement elemdisposalY = doc.CreateElement("disposalY");
  876. elemdisposalY.InnerText=Convert.ToString(itemDisp.intCurY);
  877. elemDisp.AppendChild(elemdisposalY);
  878. XmlElement elemX1 = doc.CreateElement("X1");
  879. elemX1.InnerText=Convert.ToString(itemDisp.x1);
  880. elemDisp.AppendChild(elemX1);
  881. XmlElement elemY1 = doc.CreateElement("Y1");
  882. elemY1.InnerText=Convert.ToString(itemDisp.y1);
  883. elemDisp.AppendChild(elemY1);
  884. XmlElement elemX2 = doc.CreateElement("X2");
  885. elemX2.InnerText=Convert.ToString(itemDisp.x2);
  886. elemDisp.AppendChild(elemX2);
  887. XmlElement elemY2 = doc.CreateElement("Y2");
  888. elemY2.InnerText=Convert.ToString(itemDisp.y2);
  889. elemDisp.AppendChild(elemY2);
  890. elemDisposalList.AppendChild(elemDisp);
  891. }
  892. }
  893. root.AppendChild(elemMap);
  894. return doc.OuterXml; 
  895. }
  896. catch(Exception e)
  897. {
  898. string strError="格式错误,转换出错!";
  899. MessageBox.Show(strError); 
  900. return strError;
  901. }
  902. }
  903. public void xmlToObj(string strXml)//将xml字符转换成拓扑图
  904. {
  905. this.aryStatus.Clear();
  906. this.aryDisposal.Clear();
  907. this.Controls.Clear();
  908. try
  909. {
  910. XmlDocument doc= new XmlDocument();
  911. doc.LoadXml(strXml);//根节点
  912. XmlNodeList eMapList=doc.GetElementsByTagName("FlowMap");
  913. XmlNode eMapNode=eMapList[0];//拓扑图对象
  914. double tmpFlowId=Convert.ToDouble(eMapNode.Attributes["ID"].Value);//拓扑图编号
  915. XmlNodeList eStatusList=doc.GetElementsByTagName("Status");
  916. for(int i=0;i<eStatusList.Count;i++)
  917. {
  918. FlowStatus objTemp=new FlowStatus(0,0,this.intStatusW,this.intStautsH);
  919. XmlNode eStatus=eStatusList[i];//状态对象
  920. objTemp.dblStatusId= Convert.ToDouble(eStatus.Attributes["statusId"].Value);//状态编号
  921. if (eStatus.HasChildNodes)
  922. {
  923. for (int j=0; j<eStatus.ChildNodes.Count; j++)
  924. {
  925. if(eStatus.ChildNodes[j].Name.Equals("statusTypeId"))
  926. {
  927. objTemp.intStatusTypeId=Convert.ToInt32(eStatus.ChildNodes[j].InnerText);
  928. }
  929. if(eStatus.ChildNodes[j].Name.Equals("statusName"))
  930. {
  931. objTemp.strStatusName=eStatus.ChildNodes[j].InnerText;
  932. }
  933. if(eStatus.ChildNodes[j].Name.Equals("statusX"))
  934. {
  935. objTemp._x =Convert.ToInt32(eStatus.ChildNodes[j].InnerText);
  936. }
  937. if(eStatus.ChildNodes[j].Name.Equals("statusY"))
  938. {
  939. objTemp._y =Convert.ToInt32(eStatus.ChildNodes[j].InnerText);
  940. }
  941. if(eStatus.ChildNodes[j].Name.Equals("statusJoinRule"))
  942. {
  943. objTemp.strJoinRule =eStatus.ChildNodes[j].InnerText;
  944. }
  945. if(eStatus.ChildNodes[j].Name.Equals("statusInterfixField"))
  946. {
  947. objTemp.strInterfixField =eStatus.ChildNodes[j].InnerText;
  948. }
  949. if(eStatus.ChildNodes[j].Name.Equals("statusComExtend"))
  950. {
  951. objTemp.strComExtend =eStatus.ChildNodes[j].InnerText;
  952. }
  953. if(eStatus.ChildNodes[j].Name.Equals("statusChildFlowType"))
  954. {
  955. objTemp.strChildFlowType =eStatus.ChildNodes[j].InnerText;
  956. }
  957. if(eStatus.ChildNodes[j].Name.Equals("statusChildFlowHint"))
  958. {
  959. objTemp.strChildFlowHint =eStatus.ChildNodes[j].InnerText;
  960. }
  961. if(eStatus.ChildNodes[j].Name.Equals("statusChildFlow"))
  962. {
  963. objTemp.strChildFlow =eStatus.ChildNodes[j].InnerText;
  964. }
  965. if(eStatus.ChildNodes[j].Name.Equals("statusChangeFlowName"))
  966. {
  967. objTemp.strChangeFlowName =eStatus.ChildNodes[j].InnerText;
  968. }
  969. if(eStatus.ChildNodes[j].Name.Equals("statusChangeStatusName"))
  970. {
  971. objTemp.strChangeStatusName =eStatus.ChildNodes[j].InnerText;
  972. }
  973. if(eStatus.ChildNodes[j].Name.Equals("statusAutoFieldList"))
  974. {
  975. objTemp.strAutoFieldList =eStatus.ChildNodes[j].InnerText;
  976. }
  977. if(eStatus.ChildNodes[j].Name.Equals("statusAutoRule"))
  978. {
  979. objTemp.strAutoRule =eStatus.ChildNodes[j].InnerText;
  980. }
  981. if(eStatus.ChildNodes[j].Name.Equals("statusAutoFieldName"))
  982. {
  983. objTemp.strAutoFieldName =eStatus.ChildNodes[j].InnerText;
  984. }
  985. if(eStatus.ChildNodes[j].Name.Equals("statusJoinRule2"))
  986. {
  987. objTemp.strJoinRule2 =eStatus.ChildNodes[j].InnerText;
  988. }
  989. }//end for
  990. }//end if
  991. this.aryStatus.Add(objTemp);
  992. }//end for
  993. XmlNodeList eDispList=doc.GetElementsByTagName("Disposal");
  994. for(int i=0;i<eDispList.Count;i++)
  995. {
  996. FlowDisposal tmpDisp=new FlowDisposal();
  997. XmlNode eDisposal=eDispList[i];//状态对象
  998. tmpDisp.dblDisposalId= Convert.ToDouble(eDisposal.Attributes["disposalId"].Value);//状态编号
  999. if (eDisposal.HasChildNodes)
  1000. {
  1001. for (int j=0; j<eDisposal.ChildNodes.Count; j++)
  1002. {
  1003. if(eDisposal.ChildNodes[j].Name.Equals("disposalName"))
  1004. {
  1005. tmpDisp.strDisposalName =eDisposal.ChildNodes[j].InnerText;
  1006. }
  1007. if(eDisposal.ChildNodes[j].Name.Equals("disposalHint"))
  1008. {
  1009. tmpDisp.strDisposalHint =eDisposal.ChildNodes[j].InnerText;
  1010. }
  1011. if(eDisposal.ChildNodes[j].Name.Equals("disposalTransactStatusId"))
  1012. {
  1013. tmpDisp.dblTransactStatusId=Convert.ToDouble(eDisposal.ChildNodes[j].InnerText);
  1014. }
  1015. if(eDisposal.ChildNodes[j].Name.Equals("disposalGroupLimit"))
  1016. {
  1017. tmpDisp.intGroupLimit=Convert.ToInt32(eDisposal.ChildNodes[j].InnerText);
  1018. }
  1019. if(eDisposal.ChildNodes[j].Name.Equals("disposalCurStatusId"))
  1020. {
  1021. tmpDisp.dblCurStatusId=Convert.ToDouble(eDisposal.ChildNodes[j].InnerText);
  1022. }
  1023. if(eDisposal.ChildNodes[j].Name.Equals("disposalPreStatusId"))
  1024. {
  1025. tmpDisp.dblPreStatusId=Convert.ToDouble(eDisposal.ChildNodes[j].InnerText);
  1026. }
  1027. if(eDisposal.ChildNodes[j].Name.Equals("disposalX"))
  1028. {
  1029. tmpDisp.intCurX=Convert.ToInt32(eDisposal.ChildNodes[j].InnerText);
  1030. }
  1031. if(eDisposal.ChildNodes[j].Name.Equals("disposalY"))
  1032. {
  1033. tmpDisp.intCurY=Convert.ToInt32(eDisposal.ChildNodes[j].InnerText);
  1034. }
  1035. if(eDisposal.ChildNodes[j].Name.Equals("X1"))
  1036. {
  1037. tmpDisp.x1=Convert.ToInt32(eDisposal.ChildNodes[j].InnerText);
  1038. }
  1039. if(eDisposal.ChildNodes[j].Name.Equals("Y1"))
  1040. {
  1041. tmpDisp.y1=Convert.ToInt32(eDisposal.ChildNodes[j].InnerText);
  1042. }
  1043. if(eDisposal.ChildNodes[j].Name.Equals("X2"))
  1044. {
  1045. tmpDisp.x2=Convert.ToInt32(eDisposal.ChildNodes[j].InnerText);
  1046. }
  1047. if(eDisposal.ChildNodes[j].Name.Equals("Y2"))
  1048. {
  1049. tmpDisp.y2=Convert.ToInt32(eDisposal.ChildNodes[j].InnerText);
  1050. }
  1051. }//end for
  1052. }//end if
  1053. tmpDisp.getFormwh(this.Width,this.Height);
  1054. tmpDisp.setLabelProp();
  1055. this.aryDisposal.Add(tmpDisp);
  1056.     }//end for
  1057. this.repaint();
  1058. }//end try
  1059. catch(Exception e)
  1060. {
  1061. string strError="格式错误,转换出错!";
  1062. MessageBox.Show(strError); 
  1063. }
  1064. }
  1065. }
  1066. }