📄 毕业设计数字逻辑电子仿真器view.cpp
字号:
// 毕业设计数字逻辑电子仿真器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 + -