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

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

📁 书上找到的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 毕业设计数字逻辑电子仿真器View.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "毕业设计数字逻辑电子仿真器.h"

#include "毕业设计数字逻辑电子仿真器Doc.h"
#include "毕业设计数字逻辑电子仿真器View.h"
#include "MyDialog.h"
//用于CList CArray

//用于_itoa
#include <stdlib.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
	//{{AFX_MSG_MAP(CMyView)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_ANDGATE, OnAndgate)
	ON_COMMAND(ID_JKDIGITAL, OnJkdigital)
	ON_COMMAND(ID_NANDGATE, OnNandgate)
	ON_COMMAND(ID_NORGATE, OnNorgate)
	ON_COMMAND(ID_NOTGATE, OnNotgate)
	ON_COMMAND(ID_ORGATE, OnOrgate)
	ON_COMMAND(ID_RSDIGITAL, OnRsdigital)
	ON_COMMAND(ID_XORGATE, OnXorgate)
	ON_COMMAND(ID_NONE, OnNone)
	ON_COMMAND(ID_NODEINPUT, OnNodeinput)
	ON_COMMAND(ID_NODEOUTPUT, OnNodeoutput)
	ON_WM_SIZE()
	ON_COMMAND(ID_BEGIN, OnBegin)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction




//定义全局量

//用于鼠标按下时判断当前状态
//如是否画与门 等等
MyStatus Status=NONE;
//用于记录输入结点前的序号
CArray<CPoint,CPoint> numpoint;
//用于记录每一个物件
CList<MyNode*,MyNode*> MyList;
//用于记录每一根连接线,链表中装的元素是数组对象的首址
CList<CArray<CPoint,CPoint>*,CArray<CPoint,CPoint>*> MyPointList;
// IsLink用于判断当前是否处于连接状态
BOOL IsLink=FALSE;
//IsDrawCircle用于记录当前是否画了触点的圆圈
BOOL IsDrawCircle=FALSE;
//用于记录开始连接的物体
MyNode* pNodeStart;
//用于记录终点连接的物体
MyNode* pNodeCurrent;
//用于判断点是否在某个物件中这个函数IsPointInObject,记录当前物件
//pNodeNow是在IsPointInObject()这个函数里面记录的
MyNode* pNodeNow;
//用于记录连接时起始物件触点的中心点坐标
CPoint startpoint;
//用于鼠标画线时产生擦除效果
CPoint lastpoint;
//用于记录连接时终点物件触点的中心点坐标
CPoint currentpoint;
//用全局变量circlepoint记录中心点坐标(相对坐标)
//circlepoint是在IsInInput1() IsInInput2() IsInOutput1()这三个函数中记录的
CPoint circlepoint;
//用于判断IsArea用
CPoint centerpoint;
//用于记录位图宽度和高度
int bmWidth;
int bmHeight;
//用于记录当前触点
//put是在IsInInput1() IsInInput2() IsInOutput1()这三个函数中记录的
Myput put;
//用于记录连接时起始物件的触点状态
Myput startput;
//用于记录连接时终点物件的触点状态
Myput currentput;
//用于保存计算结果字符串数组
CArray<CString,CString&> strs;
//用于计算真值表时循环次数
int x;
//计算输入结点的个数,输出真值表
int n;

CMyView::CMyView()
{
	// TODO: add construction code here

}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing

void CMyView::OnDraw(CDC* pDC)
{
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	//重绘所有输入端序号
	redrawnum();
	//重绘所有连接线
	//首先得到VIEW的大小
	CRect rect;
	GetClientRect(&rect);
	//定义两个点point1,point2分别为VIEW的左上角点和右下角点
	CPoint point1;
	CPoint point2;
	point1.x=0;
	point1.y=0;
	point2.x=rect.right ;
	point2.y=rect.bottom ;
	//重绘所有连接线
	LinkLineRedraw(point1,point2);
	//重绘所有物件
	POSITION pos=MyList.GetHeadPosition ();
	while(pos!=0)
	{
		MyNode* pNode=MyList.GetNext(pos);
		redrawMyObject(pNode);
	}


}

/////////////////////////////////////////////////////////////////////////////
// CMyView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
	CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
	return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers

void CMyView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	switch(Status)
	{//如果此时为非画图状态,判断一下是否当前点在触点上,如果是,则开始连接
	case NONE:
		
		if(IsDrawCircle)//当前点在某个元件未连接的触点上
		{
			//全局变量IsLink表示开始连接状态
			IsLink=TRUE;
			//全局变量pNodeStart记录当前物件
			pNodeStart=pNodeNow;
			//全局变量startpoint记录当前触点中心坐标(注,此时要进行坐标转换
			startpoint.x=pNodeNow->Orgpoint .x +circlepoint.x;
			startpoint.y=pNodeNow->Orgpoint .y +circlepoint.y;
			//全局变量startput记录当前触点类别:Input_1,Input_2,Output_1;
			startput=put;
			//lastpoint用于鼠标移动时擦除线效果
			lastpoint=startpoint;

		}
		break;
	case ANDGATE:
		DrawObject(point,IDB_ANDGATE);
		CreateMyObject(Gate,ANDGate,point);
		break;
	case ORGATE:
		DrawObject(point,IDB_ORGATE);
		CreateMyObject(Gate,ORGate,point);
		break;
	case NOTGATE:
		DrawObject(point,IDB_NOTGATE);
		CreateMyObject(Gate,NOTGate,point);
		break;
	case NORGATE:
		DrawObject(point,IDB_NORGATE);
		CreateMyObject(Gate,NORGate,point);
		break;
	case NANDGATE:
		DrawObject(point,IDB_NANDGATE);
		CreateMyObject(Gate,NANDGate,point);
		break;
	case XORGATE:
		DrawObject(point,IDB_XORGATE);
		CreateMyObject(Gate,XORGate,point);
		break;
	case RSDIGITAL:
		DrawObject(point,IDB_RSDIGITAL);
		break;
	case JKDIGITAL:
		DrawObject(point,IDB_JKDIGITAL);
		break;
	case NODEINPUT:
		DrawObject(point,IDB_NODEINPUT);
		CreateMyObject(Node,Input,point);
		break;
	case NODEOUTPUT:
		DrawObject(point,IDB_NODEOUTPUT);
		CreateMyObject(Node,Output,point);
		break;
	}



	CView::OnLButtonDown(nFlags, point);
}

void CMyView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	if(IsLink)
	{
		//首先擦除从startpoint到point
			CClientDC clientDC(this);
			CClientDC* pDC=&clientDC;
				
			CPen whitepen(PS_SOLID,1,RGB(255,255,255));
			CPen* pOldPen;
			pOldPen=clientDC.SelectObject (&whitepen);
			clientDC.MoveTo (startpoint);
			clientDC.LineTo (point);
			clientDC.SelectObject (pOldPen);
			//重绘所有输入结点前的序号
			redrawnum();
			//重绘连接线
			LinkLineRedraw(startpoint,point);
			//重绘物件
			lineRedraw(startpoint,point);

		if(IsDrawCircle)
		{

			
			//用全局变量pNodeCurrent记录终点连接的物体
			pNodeCurrent=pNodeNow;
			//用全局变量currentput记录终点连接的触点
			currentput=put;
			//用全局变量currentpoint记录终点触点的中心坐标
			currentpoint.x=pNodeNow->Orgpoint .x +circlepoint.x;
			currentpoint.y=pNodeNow->Orgpoint .y +circlepoint.y;

			//IsTwoObjectsCanLink()函数判断两个物件是否能连接
			if(IsTwoObjectsCanLink())
			{
				//先擦除圆圈
				//EraserMyCircle();没有必要,只要鼠标移开时重绘连接线就可
				//开始两个物件的画图连接
				LineLink();
				//开始真正连接:指针连接
				RealLink();
				


			}
	
		}
			//关闭连接状态:
			IsLink=FALSE;

	}

	
		
		







	CView::OnLButtonUp(nFlags, point);
}

void CMyView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	

	//此时必然是非画图状态,所以status==NONE;
	if(Status==NONE)
	{

		//当前点在某个物件上吗? 并且 //当前点在该物件触点上吗?
		if(IsPointInObject(point) && IsPointInPut(point))
		{
			//全局变量pNodeNow是在IsPointInObject()这个函数里面记录的
			//circlepoint和put是在IsInInput1() IsInInput2() IsInOutput1()
			//这三个函数中记录的


			//判断此时触点时否己连接非常重要
			
			if(IsPutLinked())
			{
				//如果此时触点己连接,则退出
				return;
			}
			
			//此时鼠标移进触点

			//当前是连接态吗?
			if(IsLink)
			{
				//连接态画图
				LinkStatusDraw(point);

			}
			//开启画圆圈态
			IsDrawCircle=TRUE;

			//画圆圈

			DrawMyCircle();

		}
		else//此时鼠标移出触点
		{
			//如果此时已画圆圈,则要擦除圆圈
			if(IsDrawCircle==TRUE)
			{
				EraserMyCircle();

				//关闭画圆圈状态
				IsDrawCircle=FALSE;
				//重绘连接线
				moveoutredrawline();
				

				//重绘圆圈所在的那个物件,因为擦除圆圈的时候可能擦除了部分物件
				//-------------------
				redrawMyObject(pNodeNow);

			
				//如果此时是连接状态,连接态画图
			}
			if(IsLink)
			{
					//连接态画图
				LinkStatusDraw(point);

			}
	
		}
	}
	CView::OnMouseMove(nFlags, point);
}


void CMyView::OnAndgate() 
{
	// TODO: Add your command handler code here
	Status=ANDGATE;


	
}

void CMyView::OnJkdigital() 
{
	// TODO: Add your command handler code here
	Status=JKDIGITAL;


	

	

}

void CMyView::OnNandgate() 
{
	// TODO: Add your command handler code here
	Status=NANDGATE;
}

void CMyView::OnNorgate() 
{
	// TODO: Add your command handler code here
	Status=NORGATE;	
}

void CMyView::OnNotgate() 
{
	// TODO: Add your command handler code here
	Status=NOTGATE;	
}

void CMyView::OnOrgate() 
{
	// TODO: Add your command handler code here
	Status=ORGATE;
}

void CMyView::OnRsdigital() 
{
	// TODO: Add your command handler code here
	Status=RSDIGITAL;
}

void CMyView::OnXorgate() 
{
	// TODO: Add your command handler code here
	Status=XORGATE;
}

void CMyView::OnNone() 
{
	// TODO: Add your command handler code here
	Status=NONE;
	
}


void CMyView::OnNodeinput() 
{
	// TODO: Add your command handler code here
	Status=NODEINPUT;
}

void CMyView::OnNodeoutput() 
{
	// TODO: Add your command handler code here
	Status=NODEOUTPUT;
}



void CMyView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	
}

void CMyView::DrawObject(CPoint point, UINT nID)
{
	CBitmap MyBitMap;
	MyBitMap.LoadBitmap (nID);

	CDC dc;
	
	CClientDC ClientDC(this);
	dc.CreateCompatibleDC (&ClientDC);
	
	CBitmap* pOldBitmap;


	BITMAP bmpInfo;

	MyBitMap.GetBitmap (&bmpInfo);

	pOldBitmap=dc.SelectObject (&MyBitMap);
	ClientDC.BitBlt (point.x ,point.y,bmpInfo.bmWidth ,bmpInfo.bmHeight,&dc,0,0,SRCAND);
	dc.SelectObject (pOldBitmap);

	bmWidth=bmpInfo.bmWidth ;

⌨️ 快捷键说明

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