📄 毕业设计数字逻辑电子仿真器view.cpp
字号:
bmHeight=bmpInfo.bmHeight ;
}
void CMyView::CreateMyObject(Mytype type, MySubtype Subtype, CPoint point)
{
MyNode* pNode=new MyNode;
pNode->type =type;
pNode->Subtype =Subtype;
pNode->input1 =0;
pNode->input2 =0;
pNode->output1 =0;
pNode->output2 =0;
pNode->Orgpoint =point;
pNode->width =bmWidth;
pNode->height =bmHeight;
pNode->input1value =0;
pNode->input2value =0;
pNode->output1value =0;
pNode->inputs =0;
if(Subtype==Input)
{
//当创建Input时加入点到numpoint数组中
numpoint.Add (CPoint(point.x-15,point.y));
pNode->number =numpoint.GetSize ();
//创建时重绘序号
redrawnum();
}
MyList.AddTail (pNode);
}
void CMyView::redrawMyObject(MyNode* pNode)
{
switch(pNode->Subtype )
{
case ANDGate:
DrawObject(pNode->Orgpoint ,IDB_ANDGATE);
break;
case ORGate:
DrawObject(pNode->Orgpoint,IDB_ORGATE);
break;
case NOTGate:
DrawObject(pNode->Orgpoint,IDB_NOTGATE);
break;
case NORGate:
DrawObject(pNode->Orgpoint,IDB_NORGATE);
break;
case NANDGate:
DrawObject(pNode->Orgpoint,IDB_NANDGATE);
break;
case XORGate:
DrawObject(pNode->Orgpoint,IDB_XORGATE);
break;
case RSDigital:
DrawObject(pNode->Orgpoint,IDB_RSDIGITAL);
break;
case JKDigital:
DrawObject(pNode->Orgpoint,IDB_JKDIGITAL);
break;
case Input:
DrawObject(pNode->Orgpoint,IDB_NODEINPUT);
break;
case Output:
DrawObject(pNode->Orgpoint,IDB_NODEOUTPUT);
break;
}
}
void CMyView::lineRedraw(CPoint startpoint, CPoint point)
{
CRect drawrect(startpoint,point);
drawrect.NormalizeRect ();
CRect rect;
CRect rectInter;
POSITION pos=MyList.GetHeadPosition ();
while(pos!=0)
{
MyNode* pNode=MyList.GetNext(pos);
rect.left =pNode->Orgpoint .x;
rect.top =pNode->Orgpoint .y;
rect.right = pNode->Orgpoint .x+pNode->width ;
rect.bottom = pNode->Orgpoint .y+pNode->height ;
if(rectInter.IntersectRect (&drawrect,&rect))
{
redrawMyObject(pNode);
}
}
}
BOOL CMyView::IsPointInObject(CPoint point)
{
//获得头节点
POSITION pos=MyList.GetHeadPosition ();
//遍历MyList,看当前点是否在某个物件上
while(pos!=0)
{
//用pNode指向当前结点,pos指向下一个结点
MyNode* pNode=MyList.GetNext(pos);
//判断当前点是否在pNode所指结点上
if(pNode->Orgpoint.x<=point.x &&
point.x<=(pNode->Orgpoint.x+pNode->width) &&
pNode->Orgpoint.y<=point.y &&
point.y<=(pNode->Orgpoint.y+pNode->height) )
{
//用全局变量pNodeNow指向当前结点
pNodeNow=pNode;
//找到了一个结点,返回真
return TRUE;
}
}
//遍历结束,若没有在遍历时返回,说明当前点不在任何物件上,返回假
return FALSE;
}
BOOL CMyView::IsPointInPut(CPoint point)
{
//判断当前点是否在全局变量pNodeNow所指的物件的触点上
//有四种情况
//1 对于非门,只有一个输入端,一个输出端
//2 对于其他门,有两个输入端,一个输出端
//3 对于输入结点,此时为了方便计算用一个输出端OUTPUT1来表示
//4 对于输出结点,此时为了方便计算用一个输入端INPUT1来表示
switch(pNodeNow->Subtype)
{
//对于非门,第一种情况
case NOTGate:
//在第一个输入端 或 在第一个输出端吗?
if(IsInInput1(point) || IsInOutput1(point))
{
return TRUE;
}
break;
//对于输入结点
case Input:
//判断是否当前点在第一个输出端
if(IsInOutput1(point))
{
return TRUE;
}
break;
//对于输出结点
case Output:
//判断是否当前点在第一个输入端
if(IsInInput1(point))
{
return TRUE;
}
break;
//对于其他5个门
default:
//判断是否当前点在第一个输入端 或 第二个输入端 或 第一个输出端
if(IsInInput1(point)||IsInInput2(point)||IsInOutput1(point))
{
return TRUE;
}
}//switch
//若上述情况都没有返回真,说明当前点不在触点上,返回假
return FALSE;
}
//用于连接态画线,重绘用
void CMyView::LinkStatusDraw(CPoint point)
{
CClientDC clientDC(this);
CPen whitepen(PS_SOLID,1,RGB(255,255,255));
CPen* pOldPen;
pOldPen=clientDC.SelectObject (&whitepen);
clientDC.MoveTo (startpoint);
clientDC.LineTo (lastpoint);
clientDC.SelectObject (pOldPen);
CPen redpen(PS_DOT ,1,RGB(255,0,0));
pOldPen=clientDC.SelectObject (&redpen);
clientDC.MoveTo (startpoint);
clientDC.LineTo (point);
clientDC.SelectObject (pOldPen);
lastpoint=point;
//重绘所有输入结点前的序号
redrawnum();
//重绘连接线
LinkLineRedraw(startpoint,point);
//重绘物件
lineRedraw(startpoint,point);
}
//画圆圈
void CMyView::DrawMyCircle()
{
//此时全局变量circlepoint记录了要画圆圈的
//而pNodeNow指向了当前的物件
//将物件坐标中的circlepoint转换成VIEW中的坐标
int x,y;
x=pNodeNow->Orgpoint .x +circlepoint.x;
y=pNodeNow->Orgpoint .y +circlepoint.y;
CClientDC dc(this);
//创建一个黑色的画刷
CBrush brush(RGB(0,0,0));
//创建指针pOldBrush用于保存原来的画刷
CBrush* pOldBrush;
//将黑色的画刷选进设备装置DC,并用pOldBrush保存原来的画刷
pOldBrush=dc.SelectObject (&brush);
//画一个圆圈,圆心是(x,y)
//直径是4
dc.Ellipse (x-4,y-4,x+4,y+4);
//将原来的画刷选回
dc.SelectObject (pOldBrush);
}
void CMyView::EraserMyCircle()
{
int x,y;
x=pNodeNow->Orgpoint .x +circlepoint.x;
y=pNodeNow->Orgpoint .y +circlepoint.y;
CClientDC dc(this);
CPen whitepen(PS_SOLID,1,RGB(255,255,255));
CPen* pOldPen;
pOldPen=dc.SelectObject (&whitepen);
dc.Ellipse (x-4,y-4,x+4,y+4);
dc.SelectObject (pOldPen);
}
//判断当前点是否在第一个输入端内
//判断当前点是否在全局变量pNodeNow所指的物件的第一个输入端内
BOOL CMyView::IsInInput1(CPoint point)
{
//首先要获得第一个输入端的中心点
//有6个门,还有一个输出结点
//注:没有输入结点
//此时物件是由pNodeNow所指
//判断物件类型
//用全局变量circlepoint记录中心点坐标
//GetCirclePoint()函数用来返回当前触点的中心点
//此时要告诉GetCirclepoint是下列三个端之一
//Input_1,
//Input_2,
//Output_1
//IsInArea 函数用来判断当前点是否在以circlepoint为中心的一个矩形区域
//如果在IsInArea就返回真,同时IsInInput1也应返回真。
//用全局变量centenpoint记录中心点
centerpoint=GetCirclePoint(Input_1);
if(IsInArea(point))
{
//说明此时就在触点Input_1,用全局变量put记录下来
put=Input_1;
//如果当前点在,则要保存触点中心点
circlepoint=centerpoint;
return TRUE;
}
else
{
//如果移出触点,肯定不要再保存中心点
return FALSE;
}
}
BOOL CMyView::IsInInput2(CPoint point)
{
centerpoint=GetCirclePoint(Input_2);
if(IsInArea(point))
{
//说明此时就在触点Input_1,用全局变量put记录下来
circlepoint=centerpoint;
put=Input_2;
return TRUE;
}
else
{
return FALSE;
}
}
BOOL CMyView::IsInOutput1(CPoint point)
{
centerpoint=GetCirclePoint(Output_1);
if(IsInArea(point))
{
//说明此时就在触点Input_1,用全局变量put记录下来
circlepoint=centerpoint;
put=Output_1;
return TRUE;
}
else
{
return FALSE;
}
}
//GetCirclePoint()函数用来返回当前触点的中心点
CPoint CMyView::GetCirclePoint(Myput put)
{
//此时pNodeNow指向物件
//有三种情况,三个端:
//Input_1
//Input_2
//Output_1
//返回点
CPoint point;
switch(put)
{
case Input_1:
//此时pNodeNow指向物件,分不同情况考虑
//注意此时没有输入结点
//6个门和一个输出结点
switch(pNodeNow->Subtype )
{
case Output:
point.x=3;
point.y=8;
break;
case ANDGate:
point.x=4;
point.y=7;
break;
case ORGate:
point.x=6;
point.y=8;
break;
case NOTGate:
point.x=10;
point.y=19;
break;
case NORGate:
point.x=5;
point.y=8;
break;
case NANDGate:
point.x=6;
point.y=7;
break;
case XORGate:
point.x=7;
point.y=10;
break;
}
break;
//退出Input_1
case Input_2:
//此时没有输入他和输出结点 没有非门 5个门 同Input_1
switch(pNodeNow->Subtype )
{
case ANDGate:
point.x=4;
point.y=22;
break;
case ORGate:
point.x=6;
point.y=23;
break;
case NORGate:
point.x=5;
point.y=23;
break;
case NANDGate:
point.x=6;
point.y=22;
break;
case XORGate:
point.x=7;
point.y=25;
break;
}
break;
//退出Input_2
case Output_1:
//此时没有输出结点 6个门和一个输入结点
switch(pNodeNow->Subtype )
{
case Input:
point.x=13;
point.y=8;
break;
case ANDGate:
point.x=51;
point.y=15;
break;
case ORGate:
point.x=45;
point.y=16;
break;
case NOTGate:
point.x=41;
point.y=19;
break;
case NORGate:
point.x=44;
point.y=16;
break;
case NANDGate:
point.x=53;
point.y=15;
break;
case XORGate:
point.x=54;
point.y=18;
break;
}
//退出Output_1
}//switch(put)
return point;
}
//IsInArea 函数用来判断当前点是否在以circlepoint为中心的一个矩形区域
BOOL CMyView::IsInArea(CPoint point)
{
//此时要做坐标的转换
//中心点是相对一个物件的左上角为(0,0)的偏移量
//如果要转换到VIEW中的坐标,要加上左上角在VIEW中的坐标
//设x,y为VIEW中中心点的坐标,x1,y1为物件中中心点的坐标,则有
//x0,y0为物件左上角在VIEW中的坐标
//x=x1+x0
//y=y1+y0
//由于此时pNodeNow指向了当前物件,物件左上角在VIEW中坐标为
//x0=pNodeNow->Orgpoint.x
//y0=pNodeNow->Orgpoint.y
//x1=circlepoint.x
//y1=circlepoint.y
int x,y;
x=pNodeNow->Orgpoint .x +centerpoint.x;
y=pNodeNow->Orgpoint .y +centerpoint.y;
//如果当前点point在以(x,y)为中心的矩形区域内,则返回真,否则返回假
if( ((x-3)<= point.x) && (point.x<=(x+3)) && ((y-3)<= point.y) && (point.y<= (y+3)) )
{
return TRUE;
}
else
{
return FALSE;
}
}
//判断当前pNodeNow所指物件之触点put是否连接
BOOL CMyView::IsPutLinked()
{
switch(put)
{
case Input_1:
if(pNodeNow->input1 !=0)
return TRUE;
break;
case Input_2:
if(pNodeNow->input2 !=0)
return TRUE;
break;
case Output_1:
if(pNodeNow->output1 !=0)
return TRUE;
}
return FALSE;
}
BOOL CMyView::IsTwoObjectsCanLink()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -