⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flowmap.cs

📁 c#定义XML
💻 CS
📖 第 1 页 / 共 3 页
字号:
				}
				else
				{
					foreach (Object item in aryStatus)
					{
						FlowStatus objTemp=(FlowStatus)item;
						objTemp.isMove=0;						
					}
					
				}			 
				this.blCtrlDown=true;			 
			}
		}
		//	public void myKeyPressed(Object o, KeyPressEventArgs e)
		//{
		//if(e.KeyChar == (char)13)
		//e.Handled=true;
		//}

		public void myKeyUp(object sender, KeyEventArgs  ex)//键盘中ctrl键被松开
		{
			if(ex.Control==true)
			{
				int intCount=this.aryStatus.Count;
				if(intCount==0)
				{ 
					return;
				}
				else
				{
					foreach (Object item in aryStatus)
					{
						FlowStatus objTemp=(FlowStatus)item;
						objTemp.isMove=1;						
					}					
				}
				
			}
			this.blCtrlDown=false;
			
		}


		/**
		 *   鼠标事件触发时画图的处理
		 * @param MouseEventArgs ex鼠标事件
		 * @param int  intEvent 鼠标事件类型
		 * <br>intEvent等于1.代表鼠标按下.intEvent等于2.代表鼠标移动.intEvent等于3.代表鼠标松开.
		*<br>处理步骤如下:
		*<br>intEvent等于1,鼠标按下时如果鼠标的坐标在某状态内,更新状态的last_x,last_y坐标(用来在以移动后更新状态坐标位置)
		* 该状态可以移动
		*<br>intEvent等于2,如果状态可以移动,更新状态位置
		*<br>intEvent等于3,如果状态可以移动,更新状态位置,设置该状态为不能移动。
		*  **/
		public void drawMouseObjs(MouseEventArgs ex,int intEvent)
		{
					
			int statusSize=aryStatus.Count;  
			if(statusSize==0) return ;
			if(this.blCtrlDown==false)//ctrl键没有按下
			{
				foreach (Object item in aryStatus)
				{
					FlowStatus objStatus=(FlowStatus)item;
					switch(intEvent) 
					{
						case 1://mouseDown()
							if(objStatus.contains(ex.X,ex.Y))
							{
								Graphics g = this.CreateGraphics();
								objStatus.last_x= objStatus._x - ex.X;
								objStatus.last_y = objStatus._y-ex.Y;
								objStatus.isMove=1;
								int x1=objStatus._x;
								int	y1=objStatus._y;
								int	w1=objStatus._w;
								int	h1=objStatus._h;
								Pen penWhite=new Pen(Color.White,2);
								g.DrawRectangle(penWhite,x1,y1,w1,h1);	
								g.FillRectangle(new SolidBrush(Color.White),x1,y1,w1,h1);
								g.FillRectangle(new SolidBrush(Color.White),x1+6,y1+6,w1,h1); 
								g.DrawRectangle(new Pen(Color.Black),x1,y1,w1,h1);	
								g.Dispose();							
								return;
							}
							break;

						case 2://mouseMove()
							if(objStatus.isMove==1)
							{
								Graphics g = this.CreateGraphics();							
								int x1=objStatus._x;
								int	y1=objStatus._y;
								int	w1=objStatus._w;
								int	h1=objStatus._h;
								g.DrawRectangle(new Pen(Color.White),x1,y1,w1,h1); 		
								objStatus.setLocation(ex.X,ex.Y);
								this.checkStatus(objStatus);
								int x2=objStatus._x;
								int	y2=objStatus._y;
								Pen penBlack=new Pen(Color.Black);							
								g.DrawRectangle(penBlack,x2,y2,w1,h1); 							
								g.Dispose();
								return;
							
							}
							break;
						case 3://mouseUp()
							if(objStatus.isMove==1)
							{
								updateLocation(ex,objStatus);
								objStatus.isMove=0;
								repaint();
								return;
							}
							break;
					}//end switch
				}//end for
			}//end if

			else if(this.blCtrlDown==true)//ctrl键按下
			{
				foreach (Object item in aryStatus)
				{
					FlowStatus objStatus=(FlowStatus)item;
					switch(intEvent) 
					{
						case 1://mouseDown()
							if(objStatus.contains(ex.X,ex.Y))
							{
								this.gFrom=objStatus;
							
								return;	
							}
							break;

						case 2://mouseMove()
						
							break;
						case 3://mouseUp()	
							this.blCtrlDown=false;
							if(this.gFrom!=null)
							{
								
								if(objStatus.contains(ex.X,ex.Y)&&objStatus.dblStatusId!=gFrom.dblStatusId)
								{  
																	
									this.gTo=objStatus;
									
									if(gFrom.intStatusTypeId==1)
									{
										MessageBox.Show("结束状态只有流入的处理!");
										gFrom=null;
										gTo=null;	
										return;
											
									}

									if(gTo.intStatusTypeId==0)
									{
										MessageBox.Show("起始状态只有流出的处理!");
										gFrom=null;
										gTo=null;												
										return;
									}

									int intDispCount=this.aryDisposal.Count;
									if(intDispCount!=0)
									{
										foreach (Object item2 in aryDisposal)
											
										{
											FlowDisposal objTemp=(FlowDisposal)item2;
												
											if(objTemp.dblPreStatusId ==gFrom.dblStatusId  && objTemp.dblCurStatusId==gTo.dblStatusId)
											{
												MessageBox.Show("该处理已经存在!");												
												return;
											}
										}
									}
									//如果处理对象列表中有已经被删除的处理对象,
									//将其在新位置重新显示
									for(int i=0;i<this.aryDisposal.Count;i++)
									{ 
										FlowDisposal tempDisp=(FlowDisposal)aryDisposal[i];
										if(tempDisp.blDisplay==false)
										{					  
											int x1=gFrom._x+Convert.ToInt32(gFrom._w/2);
											int y1=gFrom._y+Convert.ToInt32(gFrom._h/2);
											int x2=gTo._x+Convert.ToInt32(gTo._w/2);
											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;
											tempDisp.blDisplay=true;
											int j=i+1;
											tempDisp.dblDisposalId=Convert.ToDouble(j); 
											tempDisp.strDisposalName="处理"+Convert.ToString(j);
											tempDisp.lbDispName.Text="处理"+Convert.ToString(j);
											tempDisp.lbDispName.Location = new System.Drawing.Point(tempDisp.intCurX-Convert.ToInt32(tempDisp.intlblw/2) , tempDisp.intCurY-Convert.ToInt32(tempDisp.intlblh/2) );
											tempDisp.lbDispName.Visible=true;
											tempDisp.aryStatusObjs=this.aryStatus;
											repaint();
											return;
										}
									}
									FlowDisposal objTempDisp=new FlowDisposal(gFrom,gTo);
									objTempDisp.getFormwh(this.Width,this.Height);//让Disposal中的lable得到Form的大小,防止label在移动时移出Form;
									int intTemp=this.aryDisposal.Count+1;
									objTempDisp.dblDisposalId=Convert.ToDouble(intTemp); 									
									objTempDisp.strDisposalName="处理"+Convert.ToString(intTemp); 
									objTempDisp.lbDispName.Text="处理"+Convert.ToString(intTemp); 
									this.aryDisposal.Add(objTempDisp);
									objTempDisp.aryDisp=this.aryDisposal; //将aryDisposal传入Disposal对象.用来在删除时,remove掉Disposal列表里面对应的对象
									objTempDisp.aryStatusObjs=this.aryStatus;//将aryStatus传入到disposal对象,用来设置经办状态;
									repaint();
									return;
								}
								
							}
							
							break;
					}//end switch
				}//end for
			}
		}
		public void drawAllDisposal()//画所有的线
		{
			foreach (Object item in aryDisposal)
			{
				FlowDisposal objDisp=(FlowDisposal)item;
				if(objDisp.blDisplay)
				{
					Graphics g = this.CreateGraphics();	
					Pen penBlack=new Pen(Color.Black);
					g.DrawLine(penBlack,objDisp.x1,objDisp.y1,objDisp.intCurX,objDisp.intCurY); 
					drawArrowLine(objDisp.intCurX,objDisp.intCurY,objDisp.x2,objDisp.y2);
					g.Dispose();
					this.Controls.Add(objDisp.lbDispName);	
				}
			}

		}
		public void drawArrowLine(int xFrom,int yFrom,int xTo,int yTo)//画第2点带箭头的线
		{
			Graphics g = this.CreateGraphics();	
			Pen penBlack=new Pen(Color.Black);
			g.DrawLine( penBlack,xFrom,yFrom,xTo,yTo);					
			int cxArrow = 12 ;
			double angSlope = 0;
			double angOffset = Math.PI/8;
			int xDiv = 0, yDiv = 0;
			int xTD = 0, yTD = 0;
			int xTF = xFrom - xTo;
			int yTF = yFrom - yTo;
			if (xTF == 0)
			{//如果是垂直线没有atan2
				if (yTF>0)
				{
					angSlope = Math.PI/2;//90度
				}
				else
				{
					angSlope = -(Math.PI/2);//负90度
				}
			}
			else
			{
				angSlope = Math.Atan2(yTF,xTF);//正切弧度
			}
			xTD = (int)( cxArrow * Math.Cos( angSlope - angOffset) );
			yTD = (int)( cxArrow * Math.Sin( angSlope - angOffset) );
			xDiv = xTo + xTD;
			yDiv = yTo + yTD;
			g.DrawLine(penBlack,xTo,yTo,xDiv,yDiv);
			xTD = (int)( cxArrow * Math.Cos( angSlope + angOffset) );
			yTD = (int)( cxArrow * Math.Sin( angSlope + angOffset) );
			xDiv = xTo + xTD;
			yDiv = yTo + yTD;
			g.DrawLine(penBlack,xTo,yTo,xDiv,yDiv);
			g.Dispose();

		}
		/**
		  *  拖拽后更新状态和处理的位置。
		*  @param MouseEventArgs e 鼠标事件
		*  @param FlowStatus objStatus 状态对象
		*<br>处理步骤如下:
		*<br>确定托拽后的新坐标
		*<br>判定新状态是否在面板坐标内,如果不在,将其改变在面板内。
		*<br>更新状态的新位置
		*<br>更新与状态关联的处理的新位置。
		*<br>重画
		*  **/

		public void updateLocation(MouseEventArgs e,FlowStatus objStatus)
		{
			
			objStatus.setLocation(e.X,e.Y);	
			this.checkStatus(objStatus);//节点是否在画板内。
			int PosX=objStatus._x+Convert.ToInt32(objStatus._w/2);			
			int PosY=objStatus._y+Convert.ToInt32(objStatus._h/2);
			double dblStatusId=objStatus.dblStatusId;
		
			foreach (Object item in aryDisposal)
			{
				FlowDisposal objDispTemp=(FlowDisposal)item;

				double dblFromId=objDispTemp.dblPreStatusId;
				double dblToId=objDispTemp.dblCurStatusId;

				
				if(dblStatusId==dblFromId)
				{
					objDispTemp.x1=PosX;
					objDispTemp.y1=PosY;
				}
				if(dblStatusId==dblToId)
				{
					objDispTemp.x2=PosX;
					objDispTemp.y2=PosY;					
				}
			}
			
		}

		/**
		 * 让状态图形始终处在画板内
		 *@param FlowStatus objStatus
		 **/
		public  void checkStatus(FlowStatus objStatus)
		{
			
			int w = this.Width;
			int h = this.Height;
			int new_x = objStatus._x;
			int new_y = objStatus._y;
			int statusW=objStatus._w;
			int statusH=objStatus._h;
			

			if((objStatus._x+statusW)>w)
			{
				new_x = (int)w-statusW-6;
			}
			if(objStatus._x< 0)
			{
				new_x = 0;
			}
			if((objStatus._y+statusH)>h)
			{
				new_y = (int)h-statusH-6;
			}
			if(objStatus._y < 0)
			{
				new_y = 0;
			}
			objStatus._x=new_x;
			objStatus._y=new_y;
		}

		protected override void OnPaint(PaintEventArgs e) 
		{
			repaint();
			base.OnPaint(e);
		}
		public void repaint()//画图
		{
			String strType="";
			Graphics g = this.CreateGraphics();
			//先将图形所有区域用白色填充				
			Pen WhitePen=new Pen(Color.White);
			g.DrawRectangle(WhitePen,0,0,this.Width,this.Height); 
			g.FillRectangle(new SolidBrush(Color.White),0,0,this.Width,this.Height);
			//填充完毕
			foreach (Object item in aryStatus)//画代表状态的矩形	   
			{
			
				FlowStatus objStatus=(FlowStatus)item;
				if(objStatus.blDisplay)//是否已经被删除,如果没有blDisplay==true则画图显示
				{
					int intType=objStatus.intStatusTypeId;
					int x1=objStatus._x;
					int	y1=objStatus._y;
					int	w1=objStatus._w;
					int	h1=objStatus._h;
					string strName=objStatus.strStatusName;
					
					Pen penBlack=new Pen(Color.Black,2);		
					g.DrawRectangle(penBlack,x1,y1,w1,h1); 
					g.FillRectangle(new SolidBrush(Color.FromArgb(30,30,30)),x1+6,y1+6,w1,h1);
					g.FillRectangle(new SolidBrush(Color.Orange),x1,y1,w1,Convert.ToInt32(h1*0.6));
					g.FillRectangle(new SolidBrush(Color.Blue),x1,y1+Convert.ToInt32((h1*0.6)),w1,Convert.ToInt32(h1*0.4));

					switch(intType)
					{
						case 0:
							strType="开始";
							break;
						case 1:
							strType="结束";
							break;
						case 2:
							strType="普通";
							break;
						case 3:
							strType="子流";
							break;
						case 4:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -