📄 switchboxview.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 + -