📄 dijkstra_taview.cpp
字号:
// Dijkstra_TAView.cpp : implementation of the CDijkstra_TAView class
//
#include "stdafx.h"
#include "Dijkstra_TA.h"
#include "Dijkstra_TADoc.h"
#include "Dijkstra_TAView.h"
#include "Citymap.h"
#include "Dialoginput.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifndef N
#define N 15
#endif
#ifndef NoEdge
#define NoEdge 65535
#endif
/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView
IMPLEMENT_DYNCREATE(CDijkstra_TAView, CView)
BEGIN_MESSAGE_MAP(CDijkstra_TAView, CView)
//{{AFX_MSG_MAP(CDijkstra_TAView)
ON_COMMAND(ID_MENU_SHOWMAP, OnMenuShowmap)
ON_COMMAND(ID_MENU_DIJKSTRA, OnMenuDijkstra)
ON_COMMAND(ID_MENU_SHOWRTRAIN, OnMenuShowrtrain)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView construction/destruction
CDijkstra_TAView::CDijkstra_TAView()
: isshowtravel(false)
{
// TODO: add construction code here
isshowmap=false;
isshowtravel=false;
isshowtrainroad=false;
for(int i=0;i<15;i++)
m_travel[i]=-1;
}
CDijkstra_TAView::~CDijkstra_TAView()
{
}
BOOL CDijkstra_TAView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView drawing
void CDijkstra_TAView::OnDraw(CDC* pDC)
{
CDijkstra_TADoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CClientDC dc(this);
CClientDC * pdc=&dc;
if(isshowmap)
{
CBitmap Bcitymap;//创建BITMAP类的实例,并导入资源
Bcitymap.LoadBitmap(IDB_BITMAP1);
CDC mapDC;//显示资源在当前设备上
mapDC.CreateCompatibleDC(pDC);
mapDC.SelectObject(&Bcitymap);
pDC->BitBlt(0,0,750,560,&mapDC,0,0,SRCCOPY);
//////////
///////显示主要城市的地名////////
DrawCityName(pdc);
////////在地图上描绘出主要城市////////
DrawCityPosition(pdc);
}
if(isshowtravel)
{
Showtravel(pdc);
}
if(isshowtrainroad)
{
DrawCityRoad(pdc);
}
}
/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView printing
BOOL CDijkstra_TAView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CDijkstra_TAView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDijkstra_TAView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView diagnostics
#ifdef _DEBUG
void CDijkstra_TAView::AssertValid() const
{
CView::AssertValid();
}
void CDijkstra_TAView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDijkstra_TADoc* CDijkstra_TAView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDijkstra_TADoc)));
return (CDijkstra_TADoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView message handlers
void CDijkstra_TAView::OnMenuShowmap()
{
// TODO: Add your command handler code here
isshowmap=true;
Invalidate(true);
//isshowmap=false;
isshowtravel=false;
isshowtrainroad=false;
}
void CDijkstra_TAView::OnMenuDijkstra()
{
// TODO: Add your command handler code here
isshowtravel=true;
isshowtrainroad=false;
for(int i=0;i<15;i++)
m_travel[i]=-1;
CDialoginput dialog;
dialog.DoModal();
m_startcityindex=ChangeNameToIndex(dialog.m_startcity);
m_goalcityindex=ChangeNameToIndex(dialog.m_goalcity);
//报错检查
if(m_startcityindex==-1||m_goalcityindex==-1){
AfxMessageBox("城市名称拼音输入有错误,请重新输入!",MB_ICONINFORMATION);
isshowtrainroad=false;
return;
}
//输出制定城市的最短路径
m_citymap.ShortPath(m_travel,m_startcityindex,m_goalcityindex);
//m_citymap.ShortPath(m_travel,0,12);
Invalidate(true);
}
void CDijkstra_TAView::DrawCityName(CClientDC *pdc) // 地图左边显示城市列表
{
int i=10;
pdc->TextOut(780,i, "城市名"); // 拼音 ");
pdc->TextOut(780,i=i+18,"北京 "); // beijing");
pdc->TextOut(780,i=i+18,"哈尔滨"); // haerbin");
pdc->TextOut(780,i=i+18,"呼和浩特"); //huhehaote");
pdc->TextOut(780,i=i+18,"乌鲁木齐"); // wulumuqi");
pdc->TextOut(780,i=i+18,"上海"); // shanghai");
pdc->TextOut(780,i=i+18,"郑州"); // zhengzhou");
pdc->TextOut(780,i=i+18,"长沙"); // changsha");
pdc->TextOut(780,i=i+18,"广州"); // guangzhou");
pdc->TextOut(780,i=i+18,"福州"); // fuzhou");
pdc->TextOut(780,i=i+18,"南京"); // nanjing");
pdc->TextOut(780,i=i+18,"西安"); // xian");
pdc->TextOut(780,i=i+18,"兰州"); // lanzhou");
pdc->TextOut(780,i=i+18,"重庆"); // chongqing");
pdc->TextOut(780,i=i+18,"长春");
pdc->TextOut(780,i=i+18,"南昌");
//pdc->TextOut(780,i=i+18,"北京 nanjing");
}
// //在地图上显示最短路径函数
void CDijkstra_TAView::Showtravel(CClientDC * pdc)
{
COLORREF m_Color=RGB(0,0,255);
CPen Pen;
Pen.CreatePen(0,3, m_Color); // 生成笔
pdc->SelectObject(&Pen);
int i=0;
for(i=0;i<N;i++){
if(m_travel[i]!=-1&&m_travel[i+1]!=-1){
pdc->MoveTo(m_citymap.m_ChinaMainCity[m_travel[i]].pointx,m_citymap.m_ChinaMainCity[m_travel[i]].pointy);
pdc->LineTo(m_citymap.m_ChinaMainCity[m_travel[i+1]].pointx,m_citymap.m_ChinaMainCity[m_travel[i+1]].pointy);
}
}
i=0;
pdc->TextOut(10,570,"最近的路径是: ");
m_cityname=ChangeIndexToName(m_travel[i]);
pdc->TextOut(130,570,m_cityname);
int j=145;
for(i=1;i<N;i++)
if(m_travel[i]!=-1){
m_cityname=ChangeIndexToName(m_travel[i]);
j=j+60;
pdc->TextOut(j,570,"<--->");
j=j+45;
pdc->TextOut(j,570,m_cityname);
}
//pdc->TextOut(30,570,"铁路线全长是: ");
}
// 显示城市的位置,采用重新描绘的方式
void CDijkstra_TAView::DrawCityPosition(CClientDC* pdc)
{
COLORREF m_Color=RGB(255,0,0);
CPen Pen;
Pen.CreatePen(0,3, m_Color); // 生成笔
pdc->SelectObject(&Pen);
int i=0;
for(i=0;i<N;i++)//draw the cites position
pdc->Ellipse(m_citymap.m_ChinaMainCity[i].pointx-3,m_citymap.m_ChinaMainCity[i].pointy-3,m_citymap.m_ChinaMainCity[i].pointx+3,m_citymap.m_ChinaMainCity[i].pointy+3);
}
int CDijkstra_TAView::ChangeNameToIndex(CString cityname)
{
//int Compare( LPCTSTR lpsz ) const;
//Return Value
//Zero if the strings are identical,
//< 0 if this CString object is less than lpsz,
//or > 0 if this CString object is greater than lpsz.
int value;
//if(!cityname.Compare("beijing"))value=0;
if(!cityname.Compare("北京"))value=0;
else if(!cityname.Compare("哈尔滨"))value=1;
else if(!cityname.Compare("呼和浩特"))value=2;
else if(!cityname.Compare("乌鲁木齐"))value=3;
else if(!cityname.Compare("上海"))value=4;
else if(!cityname.Compare("郑州"))value=5;
else if(!cityname.Compare("长沙"))value=6;
else if(!cityname.Compare("广州"))value=7;
else if(!cityname.Compare("福州"))value=8;
else if(!cityname.Compare("南京"))value=9;
else if(!cityname.Compare("西安"))value=10;
//else if(!cityname.Compare("lanzhou"))value=11;
else if(!cityname.Compare("兰州"))value=11;
else if(!cityname.Compare("重庆"))value=12;
else if(!cityname.Compare("长春"))value=13;
else if(!cityname.Compare("南昌"))value=14;
//else if(!cityname.Compare(" "))value=;
else value=-1;
return value;
}
CString CDijkstra_TAView::ChangeIndexToName(int index)
{
CString name;
switch(index){
case 0:{name="北京";break;}
case 1:{name="哈尔滨";break;}
case 2:{name="呼和浩特";break;}
case 3:{name="乌鲁木齐";break;}
case 4:{name="上海";break;}
case 5:{name="郑州";break;}
case 6:{name="长沙";break;}
case 7:{name="广州";break;}
case 8:{name="福州";break;}
case 9:{name="南京";break;}
case 10:{name="西安";break;}
case 11:{name="兰州";break;}
case 12:{name="重庆";break;}
case 13:{name="长春";break;}
case 14:{name="南昌";break;}
default:name="未知城市";
}
return name;
}
//////////////////////////
/*
beijing
haerbin
huhehaote
wulumuqi
shanghai
zhengzhou
changsha
guangzhou
fuzhou
nanjing
xian
lanzhou
chongqing
*/
void CDijkstra_TAView::OnMenuShowrtrain()
{
// TODO: Add your command handler code here
isshowtrainroad=true;
isshowtravel=false;
Invalidate(true);
}
void CDijkstra_TAView::DrawCityRoad(CClientDC *pdc)
{
COLORREF m_Color=RGB(255,0,0);
CPen Pen;
Pen.CreatePen(0,3, m_Color); // 生成笔
pdc->SelectObject(&Pen);
for(int i=0;i<N;i++)//draw the road between cities
for(int j=0;j<N;j++)
if(m_citymap.m_road_city[i][j]!=NoEdge){
pdc->MoveTo(m_citymap.m_ChinaMainCity[i].pointx,m_citymap.m_ChinaMainCity[i].pointy);
pdc->LineTo(m_citymap.m_ChinaMainCity[j].pointx,m_citymap.m_ChinaMainCity[j].pointy);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -