📄 flowmap.cs
字号:
}
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 + -