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

📄 毕业设计数字逻辑电子仿真器view.cpp

📁 书上找到的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -