📄 test6view.cpp
字号:
// Test6View.cpp : implementation of the CTest6View class
//
#include "stdafx.h"
#include "Test6.h"
#include "Test6Doc.h"
#include "Test6View.h"
#include "MainFrm.h"
#include "AStarPathFind.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTest6View
IMPLEMENT_DYNCREATE(CTest6View, CScrollView)
BEGIN_MESSAGE_MAP(CTest6View, CScrollView)
//{{AFX_MSG_MAP(CTest6View)
ON_COMMAND(ID_START_POINT, OnStartPoint)
ON_UPDATE_COMMAND_UI(ID_START_POINT, OnUpdateStartPoint)
ON_COMMAND(ID_GO, OnGo)
ON_COMMAND(ID_BLACK, OnBlack)
ON_UPDATE_COMMAND_UI(ID_BLACK, OnUpdateBlack)
ON_COMMAND(ID_END_POINT, OnEndPoint)
ON_UPDATE_COMMAND_UI(ID_END_POINT, OnUpdateEndPoint)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_COMMAND(ID_REFRESH, OnRefresh)
ON_WM_SIZE()
ON_COMMAND(ID_NEW_MAP, OnNewMap)
ON_COMMAND(ID_OPEN_MAP, OnOpenMap)
ON_COMMAND(ID_SAVE_MAP, OnSaveMap)
ON_COMMAND(ID_SAVE_MAP_AS, OnSaveMapAs)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTest6View construction/destruction
CTest6View::CTest6View()
{
// TODO: add construction code here
for (int i=0;i<MAPHEIGHT;i++)
for (int j=0;j<MAPWIDTH;j++)
m_Map[i][j] = 0;
m_ptStart.x = -1; m_ptStart.y = 0;
m_ptEnd.x = -1; m_ptEnd.y = 0;
m_nFlag = 0;
m_pStatusBar= NULL;
m_bIsModified = FALSE;
m_strFileName = "Newmap.map";
}
CTest6View::~CTest6View()
{
}
BOOL CTest6View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTest6View drawing
void CTest6View::OnDraw(CDC* pDC)
{
CTest6Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen *pOldPen, pen1(PS_SOLID, 1, RGB(125,125,125));
pOldPen = pDC->SelectObject(&pen1);
int nScreenWidth = MAPWIDTH*TILEWIDTH;
int nScreenHeight = MAPHEIGHT*TILEHEIGHT;
for (int i=0;i<=nScreenWidth;i+=TILEWIDTH)
{
pDC->MoveTo(i, 0);
pDC->LineTo(i, nScreenHeight);
}
for (int j=0;j<=nScreenHeight;j+=TILEHEIGHT)
{
pDC->MoveTo(0, j);
pDC->LineTo(nScreenWidth, j);
}
CBrush *pOldBrush, brush1(RGB(0,0,0)), brush2(RGB(255,0,0));
pOldBrush = pDC->SelectObject(&brush1);
for (i=0; i<MAPHEIGHT; i++) //画地图
for (j=0; j<MAPWIDTH; j++)
if (m_Map[i][j] == 1)
{
pDC->SelectObject(&brush1); //黑框,障碍物
pDC->Rectangle(j*TILEWIDTH, i*TILEHEIGHT, (j+1)*TILEWIDTH+1, (i+1)*TILEHEIGHT+1);
}
else if (m_Map[i][j] == 2)
{
pDC->SelectObject(&brush2); //红框,路径
pDC->Rectangle(j*TILEWIDTH, i*TILEHEIGHT, (j+1)*TILEWIDTH+1, (i+1)*TILEHEIGHT+1);
}
if (m_ptStart.x >= 0) //画起点
{
CBrush brush(RGB(0,0,255));
pDC->SelectObject(&brush);
pDC->Ellipse(m_ptStart.x*TILEWIDTH, m_ptStart.y*TILEHEIGHT,
(m_ptStart.x+1)*TILEWIDTH, (m_ptStart.y+1)*TILEHEIGHT);
}
if (m_ptEnd.x >= 0) //画终点
{
CBrush brush(RGB(0,128,128));
pDC->SelectObject(&brush);
pDC->Ellipse(m_ptEnd.x*TILEWIDTH, m_ptEnd.y*TILEHEIGHT,
(m_ptEnd.x+1)*TILEWIDTH, (m_ptEnd.y+1)*TILEHEIGHT);
}
pDC->SelectObject(pOldBrush);
}
void CTest6View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: calculate the total size of this view
CSize sizeTotal;
sizeTotal.cx = MAPWIDTH*TILEWIDTH + 1;
sizeTotal.cy = MAPHEIGHT*TILEHEIGHT + 1;
SetScrollSizes(MM_TEXT, sizeTotal, sizeDefault, CSize(TILEWIDTH,TILEHEIGHT));
/* CDC *pDC = GetDC();
pDC->SetWindowExt(sizeTotal);
ReleaseDC(pDC);
*/
m_pStatusBar= &((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar;
}
/////////////////////////////////////////////////////////////////////////////
// CTest6View printing
BOOL CTest6View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTest6View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CTest6View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CTest6View diagnostics
#ifdef _DEBUG
void CTest6View::AssertValid() const
{
CScrollView::AssertValid();
}
void CTest6View::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CTest6Doc* CTest6View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTest6Doc)));
return (CTest6Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTest6View message handlers
void CTest6View::OnBlack()
{
// TODO: Add your command handler code here
m_nFlag = 1;
}
void CTest6View::OnUpdateBlack(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_nFlag==1);
}
void CTest6View::OnStartPoint()
{
// TODO: Add your command handler code here
m_nFlag = 2;
}
void CTest6View::OnUpdateStartPoint(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_nFlag==2);
}
void CTest6View::OnEndPoint()
{
// TODO: Add your command handler code here
m_nFlag = 3;
}
void CTest6View::OnUpdateEndPoint(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_nFlag==3);
}
void CTest6View::OnGo()
{
// TODO: Add your command handler code here
if (m_ptStart.x < 0 || m_ptEnd.x < 0)
{
AfxMessageBox("必须先选择起始点和终点!\n");
return;
}
m_nFlag = 0;
DWORD time=GetTickCount();
int num;
POINT *ptPath;
CAStarPathFind pathfind(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y, 1, 1);
pathfind.SetMapData((int*)m_Map, MAPWIDTH, MAPHEIGHT, 1, 1);
if ((num=pathfind.PathFind(&ptPath)) > 0)
{
CString str;
str.Format("共耗时%d毫秒,需要走%d步", GetTickCount()-time, num);
m_pStatusBar->SetPaneText(1, str);
for (int i=1; i<num-1; i++)
{
m_Map[ptPath[i].y][ptPath[i].x] = 2; //红色,表路径
CDC *pDC = GetDC();
pDC->SetWindowOrg(GetScrollPosition());
CPen *pOldPen, pen1(PS_SOLID, 1, RGB(125,125,125));
pOldPen = pDC->SelectObject(&pen1);
CBrush *pOldBrush, brush0(RGB(255,0,0));
pOldBrush = pDC->SelectObject(&brush0);
pDC->Rectangle(ptPath[i].x*TILEWIDTH, ptPath[i].y*TILEHEIGHT,
(ptPath[i].x+1)*TILEWIDTH+1, (ptPath[i].y+1)*TILEHEIGHT+1);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
}
else
AfxMessageBox("没有找到最佳路径");
}
void CTest6View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int i,j;
point += GetScrollPosition();
CDC *pDC = GetDC();
pDC->SetWindowOrg(GetScrollPosition());
CPen *pOldPen, pen1(PS_SOLID, 1, RGB(125,125,125));
pOldPen = pDC->SelectObject(&pen1);
CBrush *pOldBrush, brush0(RGB(255,255,255)), brush1(RGB(0,0,0)), brush2(RGB(0,0,255)), brush3(RGB(0,128,128));
pOldBrush = pDC->SelectObject(&brush0);
switch(m_nFlag)
{
case 1:
m_bIsModified = TRUE;
i = point.x/TILEWIDTH;
j = point.y/TILEHEIGHT;
if (m_Map[j][i] > 0)
{
m_Map[j][i] = 0;
pDC->Rectangle(i*TILEWIDTH, j*TILEHEIGHT, (i+1)*TILEWIDTH+1, (j+1)*TILEHEIGHT+1);
}
else
{
m_Map[j][i] = 1;
pDC->SelectObject(&brush1);
pDC->Rectangle(i*TILEWIDTH, j*TILEHEIGHT, (i+1)*TILEWIDTH+1, (j+1)*TILEHEIGHT+1);
}
break;
case 2:
m_bIsModified = TRUE;
if (m_ptStart.x >= 0)
{
pDC->Rectangle(m_ptStart.x*TILEWIDTH, m_ptStart.y*TILEHEIGHT,
(m_ptStart.x+1)*TILEWIDTH+1, (m_ptStart.y+1)*TILEHEIGHT+1);
}
m_ptStart.x = point.x/TILEWIDTH;
m_ptStart.y = point.y/TILEHEIGHT;
pDC->SelectObject(&brush2);
pDC->Ellipse(m_ptStart.x*TILEWIDTH, m_ptStart.y*TILEHEIGHT,
(m_ptStart.x+1)*TILEWIDTH, (m_ptStart.y+1)*TILEHEIGHT);
break;
case 3:
m_bIsModified = TRUE;
if (m_ptEnd.x >= 0)
{
pDC->Rectangle(m_ptEnd.x*TILEWIDTH, m_ptEnd.y*TILEHEIGHT,
(m_ptEnd.x+1)*TILEWIDTH+1, (m_ptEnd.y+1)*TILEHEIGHT+1);
}
m_ptEnd.x = point.x/TILEWIDTH;
m_ptEnd.y = point.y/TILEHEIGHT;
pDC->SelectObject(&brush3);
pDC->Ellipse(m_ptEnd.x*TILEWIDTH, m_ptEnd.y*TILEHEIGHT,
(m_ptEnd.x+1)*TILEWIDTH, (m_ptEnd.y+1)*TILEHEIGHT);
break;
}
pDC->SelectObject(pOldPen);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -