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

📄 switchboxview.cpp

📁 开关盒布线的一个简单的程序实现
💻 CPP
字号:
// SwitchBoxView.cpp : implementation of the CSwitchBoxView class
//

#include "stdafx.h"
#include "SwitchBox.h"

#include "SwitchBoxDoc.h"
#include "SwitchBoxView.h"


#define OFF 20
#define BEGIN 400
#define END 1300
#define OFF2 40

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

/////////////////////////////////////////////////////////////////////////////
// CSwitchBoxView

IMPLEMENT_DYNCREATE(CSwitchBoxView, CView)

BEGIN_MESSAGE_MAP(CSwitchBoxView, CView)
	//{{AFX_MSG_MAP(CSwitchBoxView)
	ON_WM_TIMER()
	ON_COMMAND(ID_INPUT, OnInput)
	ON_COMMAND(ID_SETTIME, OnSettime)
	ON_COMMAND(ID_BEGIN, OnBegin)
	ON_COMMAND(ID_PAUSE, OnPause)
	ON_COMMAND(ID_END, OnEnd)
	ON_COMMAND(ID_ACCELERATE, OnAccelerate)
	ON_COMMAND(ID_DECELERATE, OnDecelerate)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_BT_BEGIN, OnBegin)
	ON_COMMAND(ID_BT_PAUSE, OnPause)
	ON_COMMAND(ID_BT_END,OnEnd)
	ON_COMMAND(ID_BT_ACCELERATE,OnAccelerate)
	ON_COMMAND(ID_BT_DECELERATE,OnDecelerate)
	ON_COMMAND(ID_BT_INPUT,OnInput)
	ON_COMMAND(ID_BT_TIMESET,OnSettime)
	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()

/////////////////////////////////////////////////////////////////////////////
// CSwitchBoxView construction/destruction

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

}

CSwitchBoxView::~CSwitchBoxView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSwitchBoxView drawing

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

	//加载画图背景
	CDC pc;
 	if(FALSE==pc.CreateCompatibleDC(pDC))
	{
		AfxMessageBox("Can't Create DC");
	}
	pc.SelectObject(&m_Background);
	pDC->BitBlt(0,0,1000,1000,&pc,0,0,SRCCOPY);
	CString str1="xxx	";
	CString str2="xxx	";
	CString str3="xxx   ";
	CString str4="xxx   ";
	CFont font1,font2;
	font1.CreateFont(30,15,0,0,FW_BOLD,FALSE,FALSE,FALSE,
					GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
					DRAFT_QUALITY,FIXED_PITCH|FF_MODERN,"MyFont1");
	font2.CreateFont(40,20,0,0,FW_BOLD,FALSE,FALSE,FALSE,
					DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
					DRAFT_QUALITY,FIXED_PITCH|FF_MODERN,"MyFont2");
	pDC->SetTextColor(RGB(128,0,255));
	pDC->SelectObject(&font1);
	pDC->TextOut(600,80,str1);
	pDC->TextOut(600,140,str2);
	pDC->TextOut(600,200,str3);
	pDC->SetTextColor(RGB(255,0,255));
	pDC->SelectObject(&font2);	
	pDC->TextOut(150,10,str4);

	//变换坐标系,以便用于打印预览
	pDC->SetMapMode(MM_LOMETRIC);

	int i;
	if(m_InputDlg.Judge()==1)
	{
		
		CPen aPen,rPen;
		aPen.CreatePen(PS_SOLID,8,RGB(0,0,0));
		rPen.CreatePen(PS_SOLID,8,RGB(255,0,0));
		pDC->SelectObject(&aPen);
		//画边框
		pDC->MoveTo(BEGIN,-BEGIN);//BEGIN=400   END=1300
		pDC->LineTo(END,-BEGIN);
		pDC->LineTo(END,-END);
		pDC->LineTo(BEGIN,-END);
		pDC->LineTo(BEGIN,-BEGIN);

		//画针脚
		for(i=1;i<m_nUp+1;i++)
		{
		pDC->Ellipse(BEGIN+i*(END-BEGIN)/(m_nUp+1)-OFF,-(BEGIN-OFF),
			BEGIN+i*(END-BEGIN)/(m_nUp+1)+OFF,-(BEGIN+OFF));
		}
		for(i=1;i<m_nDown+1;i++)
		{
		pDC->Ellipse(BEGIN+i*(END-BEGIN)/(m_nDown+1)-OFF,-(END-OFF),
			BEGIN+i*(END-BEGIN)/(m_nDown+1)+OFF,-(END+OFF));
		}
		for(i=1;i<m_nLeft+1;i++)
		{
		pDC->Ellipse(BEGIN-OFF,-(BEGIN+i*(END-BEGIN)/(m_nLeft+1)-OFF),
			BEGIN+OFF,-(BEGIN+i*(END-BEGIN)/(m_nLeft+1)+OFF));
		}
		for(i=1;i<m_nRight+1;i++)
		{
		pDC->Ellipse(END-OFF,-(BEGIN+i*(END-BEGIN)/(m_nRight+1)-OFF),
			END+OFF,-(BEGIN+i*(END-BEGIN)/(m_nRight+1)+OFF));
		}

		//画电路线
		for(i=0;i<m_nNum;i=i+2)
		{
			if(m_Step==i/2+1)
			{
				pDC->SelectObject(&rPen);
				MyDrawLine(pDC,m_Arr[i],m_Arr[i+1]);
			}
			else if(m_Step>i/2+1)
			{
				pDC->SelectObject(&aPen);
				MyDrawLine(pDC,m_Arr[i],m_Arr[i+1]);
			}			
			
		}
	}

}

/////////////////////////////////////////////////////////////////////////////
// CSwitchBoxView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CSwitchBoxView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CSwitchBoxView message handlers

void CSwitchBoxView::MyDrawLine(CDC *pDC, int num_a, int num_b)	//画电路线
{
	if((0<num_a)&&(num_a<m_nUp+1))		//开始点位于上边
	{
		m_point1.x=BEGIN+num_a*(END-BEGIN)/(m_nUp+1);
		m_point1.y=-BEGIN;
		pDC->MoveTo(m_point1.x,m_point1.y);
		pDC->LineTo(m_point1.x,m_point1.y-OFF2);
	}
	else if((m_nUp<num_a)&&(num_a<m_nUp+m_nRight+1))	//开始点位于右边
	{
		m_point1.x=END;
		m_point1.y=-(BEGIN+(num_a-m_nUp)*(END-BEGIN)/(m_nRight+1));
		pDC->MoveTo(m_point1.x,m_point1.y);
		pDC->LineTo(m_point1.x-OFF2,m_point1.y);
	}
	else if((m_nUp+m_nRight<num_a)&&(num_a<m_nUp+m_nRight+m_nDown+1))	//开始点位于下边
	{
		m_point1.x=END-(num_a-m_nUp-m_nRight)*(END-BEGIN)/(m_nDown+1);
		m_point1.y=-END;
		pDC->MoveTo(m_point1.x,m_point1.y);
		pDC->LineTo(m_point1.x,m_point1.y+OFF2);
	}
	else 		//开始点位于左边
	{
		m_point1.x=BEGIN;
		m_point1.y=-(END-(num_a-m_nUp-m_nRight-m_nDown)*(END-BEGIN)/(m_nLeft+1));
		pDC->MoveTo(m_point1.x,m_point1.y);
		pDC->LineTo(m_point1.x+OFF2,m_point1.y);
	}


	if((0<num_b)&&(num_b<m_nUp+1))		//结束点位于上边
	{
		m_point2.x=BEGIN+num_b*(END-BEGIN)/(m_nUp+1);
		m_point2.y=-BEGIN;
		pDC->LineTo(m_point2.x,m_point2.y-OFF2);
		pDC->LineTo(m_point2.x,m_point2.y);
	}
	else if((m_nUp<num_b)&&(num_b<m_nUp+m_nRight+1))	//结束点位于右边
	{
		m_point2.x=END;
		m_point2.y=-(BEGIN+(num_b-m_nUp)*(END-BEGIN)/(m_nRight+1));
		pDC->LineTo(m_point2.x-OFF2,m_point2.y);
		pDC->LineTo(m_point2.x,m_point2.y);
	}
	else if((m_nUp+m_nRight<num_b)&&(num_b<m_nUp+m_nRight+m_nDown+1))	//结束点位于下边
	{
		m_point2.x=END-(num_b-m_nUp-m_nRight)*(END-BEGIN)/(m_nDown+1);
		m_point2.y=-END;
		pDC->LineTo(m_point2.x,m_point2.y+OFF2);
		pDC->LineTo(m_point2.x,m_point2.y);
	}
	else 		//结束点位于左边
	{
		m_point2.x=BEGIN;
		m_point2.y=-(END-(num_b-m_nUp-m_nRight-m_nDown)*(END-BEGIN)/(m_nLeft+1));
		pDC->LineTo(m_point2.x+OFF2,m_point2.y);
		pDC->LineTo(m_point2.x,m_point2.y);	
	}
}

void CSwitchBoxView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	tempStep=0;
	m_TimeSet.m_time=1;
	m_Background.LoadBitmap(IDB_BITMAP2);

	CRect rect;
	//自定义位图按钮"参数设置"
	rect.top=475;
	rect.left=120;
	rect.right=220;
	rect.bottom=515;
	m_btnInput.Create("参数设置",WS_VISIBLE|WS_CHILD,rect,this,ID_BT_INPUT);
	//自定义位图按钮"时间设置"
	rect.top=475;
	rect.left=300;
	rect.right=400;
	rect.bottom=515;
	m_btnTimeSet.Create("时间设置",WS_VISIBLE|WS_CHILD,rect,this,ID_BT_TIMESET);
	//自定义位图按钮"开始布线"
	rect.top=100;
	rect.left=480;
	rect.right=530;
	rect.bottom=150;
	m_btnBegin.Create("",WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,rect,this,ID_BT_BEGIN);
	m_btnBegin.LoadBitmaps(IDB_BEGIN);
	//自定义位图按钮"布线暂停"
	rect.top=175;
	rect.left=480;
	rect.right=530;
	rect.bottom=225;
	m_btnPause.Create("",WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,rect,this,ID_BT_PAUSE);
	m_btnPause.LoadBitmaps(IDB_PAUSE);
	//自定义位图按钮"结束"
	rect.top=250;
	rect.left=480;
	rect.right=530;
	rect.bottom=300;
	m_btnEnd.Create("",WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,rect,this,ID_BT_END);
	m_btnEnd.LoadBitmaps(IDB_END);
	//自定义位图按钮"布线加速"
	rect.top=325;
	rect.left=480;
	rect.right=530;
	rect.bottom=375;
	m_btnAccelerate.Create("",WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,rect,this,ID_BT_ACCELERATE);
	m_btnAccelerate.LoadBitmaps(IDB_ACCELERATE);
	//自定义位图按钮"布线减速"
	rect.top=400;
	rect.left=480;
	rect.right=530;
	rect.bottom=450;
	m_btnDecelerate.Create("",WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,rect,this,ID_BT_DECELERATE);
	m_btnDecelerate.LoadBitmaps(IDB_DECELERATE);

}

void CSwitchBoxView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	m_Step++;	//计时器跳动步数
	Invalidate();//或者InvalidateRect()一类
	if(m_Step>m_nNum/2&&m_Step!=1000)	//计时器跳动步数大于电路连线数时,结束计时
	{
		KillTimer(1);		
		m_tFinish=clock();
		double total_time=(double)(m_tFinish-m_tStart)/CLOCKS_PER_SEC;
		CString str;
		if(m_InputDlg.Judge()==1)
		{
			str.Format("布线成功,\n耗时%lf秒!",total_time);
			AfxMessageBox(str);
		}
//		OnInitialUpdate();

	}
		
	CView::OnTimer(nIDEvent);
}

void CSwitchBoxView::OnInput() 
{
	// TODO: Add your command handler code here
	int i;
	if(IDOK==m_InputDlg.DoModal())
	{
		m_Step=0;
	}
	Invalidate();
	UpdateData(TRUE);
	//将对话框中的参数值传递到VIEW类中相应的参数中去
	m_nUp=m_InputDlg.m_nUp;
	m_nDown=m_InputDlg.m_nDown;
	m_nLeft=m_InputDlg.m_nLeft;
	m_nRight=m_InputDlg.m_nRight;
	m_nNum=m_nUp+m_nDown+m_nLeft+m_nRight;
	switchbox.maxsize=m_nNum;
	switchbox.height=m_nNum;

	for(i=0;i<m_nNum;i++)
		m_Arr[i]=m_InputDlg.m_Arr[i];
	for(;i<100;i++)
		m_Arr[i]=0;	

	m_tStart=-1;
	m_bEnd=TRUE;
	m_bPause=FALSE;
	m_bBegin=FALSE;
}

void CSwitchBoxView::OnSettime() 
{
	// TODO: Add your command handler code here

	m_TimeSet.DoModal();
}

void CSwitchBoxView::OnBegin() //布线开始
{
	// TODO: Add your command handler code here
	if(m_TimeSet.m_time==0.0)//如果没有设置布线时间间隔,则弹出设置时间间隔对话框
	{m_TimeSet.DoModal();
	}
	m_TimeSet.m_time=1;
	SetTimer(1,(double)m_TimeSet.m_time*1000,NULL);
	m_Step=0;
	m_bBegin=TRUE;
	m_bPause=FALSE;
	m_bEnd=FALSE;
	m_tStart=clock();
}

void CSwitchBoxView::OnPause() 
{
	// TODO: Add your command handler code here

	if(m_bEnd==TRUE)	
		return;
	if(m_bPause==FALSE)		//当按下暂停时,关闭计时器
	{
		KillTimer(1);
		m_bPause=TRUE;
	}
	else 				//当恢复布线时,重新打开1号计时器
	{
		SetTimer(1,(double)m_TimeSet.m_time*1000,NULL);		
		m_bPause=FALSE;
	}
}

void CSwitchBoxView::OnEnd() 
{
	// TODO: Add your command handler code here
		KillTimer(1);		
		m_tFinish=clock();
		double total_time=(double)(m_tFinish-m_tStart)/CLOCKS_PER_SEC;
		CString str;
		if(m_InputDlg.Judge()==1)
		{
			str.Format("耗时%lf秒!",total_time);
			AfxMessageBox(str);
		}
		m_bEnd=TRUE;
}

void CSwitchBoxView::OnAccelerate()		//布线加速
{
	// TODO: Add your command handler code here
		if(m_bEnd==TRUE)		//如果结束按钮按下,此加速则无效
		return;
		if(m_bPause==TRUE)
		{
			AfxMessageBox("暂停中,加速无效");
			return;
		}
		KillTimer(1);
		m_TimeSet.m_time=m_TimeSet.m_time/2.0;		//速度变为原来的2倍
		SetTimer(1,(double)m_TimeSet.m_time*1000,NULL);	
	
}

void CSwitchBoxView::OnDecelerate()		//布线减速
{
	// TODO: Add your command handler code here
		if(m_bEnd==TRUE||m_bPause==TRUE)		//如果结束按钮按下,此减速则无效
		return;
		if(m_bPause==TRUE)
		{
			AfxMessageBox("暂停中,减速无效");
			return;
		}
		KillTimer(1);
		m_TimeSet.m_time=m_TimeSet.m_time*2.0;		//速度变为原来的1/2倍
		SetTimer(1,(double)m_TimeSet.m_time*1000,NULL);		
}

⌨️ 快捷键说明

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