📄 navigatorview.cpp
字号:
// NavigatorView.cpp : implementation of the CNavigatorView class
//
#include "stdafx.h"
#include "Navigator.h"
#include "MainFrm.h"
#include "NavigatorDoc.h"
#include "NavigatorView.h"
#include "Geometry/UGGeoText.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNavigatorView
IMPLEMENT_DYNCREATE(CNavigatorView, CView)
BEGIN_MESSAGE_MAP(CNavigatorView, CView)
//{{AFX_MSG_MAP(CNavigatorView)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
ON_COMMAND(ID_MAP_ZOOMIN, OnMapZoomin)
ON_COMMAND(ID_MAP_ZOOMOUT, OnMapZoomout)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_MAP_PAN, OnMapPan)
ON_COMMAND(ID_MAP_VIEWENTIRE, OnMapViewentire)
ON_COMMAND(ID_POI_QUERY, OnPOIQuery)
ON_COMMAND(ID_QUERY_DEPARTURE, OnSetDeparture)
ON_COMMAND(ID_QUERY_DESTINATION, OnSetDestination)
ON_COMMAND(ID_RA_DO, OnPathplanningDo)
ON_COMMAND(ID_RA_CLEAN, OnPathplanningClean)
ON_COMMAND(ID_NAVI_SIMULATE, OnSimulateNavi)
ON_WM_TIMER()
ON_COMMAND(ID_NAVI_CANCLE, OnCancleNavi)
ON_UPDATE_COMMAND_UI(ID_FILE_OPEN, OnUpdateFileOpen)
ON_UPDATE_COMMAND_UI(ID_FILE_CLOSE, OnUpdateFileClose)
ON_UPDATE_COMMAND_UI(ID_POI_QUERY, OnUpdatePoiQuery)
ON_UPDATE_COMMAND_UI(ID_QUERY_DEPARTURE, OnUpdateQueryDeparture)
ON_UPDATE_COMMAND_UI(ID_QUERY_DESTINATION, OnUpdateQueryDestination)
ON_UPDATE_COMMAND_UI(ID_RA_DO, OnUpdateRaDo)
ON_UPDATE_COMMAND_UI(ID_RA_CLEAN, OnUpdateRaClean)
ON_UPDATE_COMMAND_UI(ID_NAVI_SIMULATE, OnUpdateNaviSimulate)
//}}AFX_MSG_MAP
// Standard printing commands
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
// set draw call back function
MSG g_KeyDownReceiver;
void InvalidateCallBack(UGbool bErase);
void DrawCallBack(UGint nPercent, UGbool &bCancel);
static void __stdcall DrawCallBack(UGint nPercent, UGbool& bCancel, UGuint pData)
{
HWND hwnd = (HWND)pData;
if(hwnd != NULL)
{
DrawCallBack(nPercent, bCancel);
}
}
static void __stdcall InvalidateFunc(UGuint pData)
{
HWND pView = (HWND)pData;
if(pView != NULL)
{
InvalidateCallBack(false);
}
}
void DrawCallBack(UGint nPercent, UGbool &bCancel)
{
if(::PeekMessage(&g_KeyDownReceiver, NULL, WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE))
{
if(g_KeyDownReceiver.wParam == VK_ESCAPE)
{
bCancel = TRUE;
}
}
}
void InvalidateCallBack(UGbool bErase)
{
CMainFrame * pMainFrame = (CMainFrame *)AfxGetMainWnd();
CFrameWnd *pFrameWnd = pMainFrame->GetActiveFrame();
if(pFrameWnd == NULL)
{
return;
}
CNavigatorView *pMapView =(CNavigatorView *)(pFrameWnd->GetActiveView());
if(pMapView == NULL)
{
return;
}
pMapView->Invalidate(bErase);
}
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CNavigatorView construction/destruction
CNavigatorView::CNavigatorView()
{
// TODO: add construction code here
m_nStartID = -1;
m_nEndID = -1;
m_pntGuide.x = 0;
m_pntGuide.y = 0;
m_pMapWnd = NULL;
m_bPOIQuery = FALSE;
m_bPathPlanning = FALSE;
m_bInitGuide = FALSE;
m_bGuiding = FALSE;
m_strRouteInfo = "";
}
CNavigatorView::~CNavigatorView()
{
}
//////////////////////////////////////////////////////////////////////////
BOOL CNavigatorView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CNavigatorView drawing
void CNavigatorView::OnDraw(CDC* pDC)
{
CNavigatorDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if( m_pMapWnd )
{
//////////////////////////////////////////////////////////////////////////
CRect rect;
GetClientRect(rect);
// 定义绘图对象
UGGraphics *pGraphics = UGGraphicsManager::NewGraphics();
if( pGraphics != NULL )
{
UGRect rc( rect.left, rect.top, rect.right, rect.bottom );
UGGraphics::UGGraphicsData data;
data.nType = 0;
data.pNative = pDC;
pGraphics->SetGraphicsData( data );
// 绘制地图
m_pMapWnd->OnDraw( pGraphics, rc, rc, false );
delete pGraphics;
}
// 绘制查询结果目标点获导航点标识
if (m_bPOIQuery||m_bGuiding)
{
UGPoint2D pntDraw(0, 0);
if (m_bPOIQuery == TRUE)
{
// 获取查询结果目标点
pntDraw = m_POIQuery.GetDrawPoint();
}
else if (m_bGuiding == TRUE)
{
pntDraw = m_pntGuide;
}
UGPoint pntTarget(0, 0);
// 地理坐标转换为逻辑坐标
m_pMapWnd->m_Map.GetDrawing()->m_DrawParam.MPToLP(pntDraw, pntTarget);
// 逻辑坐标转换为屏幕坐标
m_pMapWnd->m_Map.GetDrawing()->m_DrawCache.LPtoDP(&pntTarget);
// 在屏幕上绘点
CBrush *pBrush = new CBrush;
pBrush->CreateSolidBrush(RGB(0,0,255));
CBrush *oldbrush = pDC->SelectObject( pBrush );
UGbool bDraw = FALSE;
bDraw = pDC->Ellipse(pntTarget.x-8, pntTarget.y -8, pntTarget.x+8, pntTarget.y+8);
pDC->SelectObject(oldbrush );
pBrush->DeleteObject();
}
if (!m_strRouteInfo.IsEmpty())
{
pDC->DrawText(m_strRouteInfo.c_str(), &rect, DT_CENTER);
}
}
return;
}
/////////////////////////////////////////////////////////////////////////////
// CNavigatorView diagnostics
#ifdef _DEBUG
void CNavigatorView::AssertValid() const
{
CView::AssertValid();
}
void CNavigatorView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CNavigatorDoc* CNavigatorView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CNavigatorDoc)));
return (CNavigatorDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CNavigatorView message handlers
void CNavigatorView::OnFileOpen()
{
// TODO: Add your command handler code here
CString strFilter = TEXT("SuperMap Workspace File(*.sxw;*.suw)|*.sxw;*.suw||");
CFileDialog FileDialog(true, TEXT(".sxw"), NULL, OFN_HIDEREADONLY, strFilter);
if(IDOK == FileDialog.DoModal())
{
// 获取工作空间文件全路径
CString strName = FileDialog.GetPathName();
//////////////////////////////////////////////////////////////////////////
// CString 类型的字符串转换成UGString 类型
TCHAR szName[MAX_PATH];
UGint i = 0;
memset(szName,0,MAX_PATH);
UGint iSize = strName.GetLength();
for ( i=0; i<iSize; i++ )
{
szName[i] = strName.GetAt(i);
}
UGStringW strFileNameW( szName );
UGString strFileName = strFileNameW.ToString();
//////////////////////////////////////////////////////////////////////////
// 打开工作空间
UGbool bOpenWS = OnOpenWS(strFileName);
if (!bOpenWS)
{
return;
}
else
{
// 打开地图
UGbool bOpenMap = OnOpenMap();
if (!bOpenMap)
{
return;
}
else
{
m_pMapWnd->Refresh();
return;
}
}
}
}
UGbool CNavigatorView::OnOpenWS(UGString strWorkspaceName)
{
// 打开工作空间
UGbool bOpen = m_Workspace.Open(strWorkspaceName);
if (bOpen)
{
m_pMapWnd = new UGMapWnd;
if (m_pMapWnd)
{
// 工作空间和地图窗口之间建立关联
m_pMapWnd->AttachWorkspace(&m_Workspace);
// 设置绘图和刷图回调函数
m_pMapWnd->SetDrawCallBackFunc(DrawCallBack, (UGint)this);
m_pMapWnd->SetInvalidateFunc(InvalidateFunc, (UGuint)this);
return TRUE;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
}
UGbool CNavigatorView::OnOpenMap(UGString strMapName)
{
// 获取工作空间中关联的地图数目
UGint iSize = m_Workspace.m_MapStorages.GetCount();
if (!iSize)
{
MessageBox(TEXT("No Map!"), NULL, MB_OK);
return FALSE;
}
if( strMapName == "" )
{
strMapName = m_Workspace.m_MapStorages.GetNameAt(0);
}
UGbool bOpen = FALSE;
if ( m_pMapWnd )
{
bOpen = m_pMapWnd->m_Map.Open( strMapName );
if (bOpen)
{
// 设置地图的投影坐标单位
m_pMapWnd->m_Map.SetPrjCoordSysUnit(AU_DEGREE);
return TRUE;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
}
void CNavigatorView::OnInitialUpdate()
{
CView::OnInitialUpdate();
}
void CNavigatorView::OnCloseWs()
{
if ( m_pMapWnd )
{
delete m_pMapWnd;
m_pMapWnd = NULL;
m_Workspace.Close();
}
}
void CNavigatorView::OnCloseMap()
{
if (m_pMapWnd)
{
m_pMapWnd->OnClose();
}
}
UGDataSource* CNavigatorView::GetDataSource(UGint iIndex)
{
UGString strAlias = "";
UGDataSource* pDataSource = NULL;
UGbool bGetDatasource = m_Workspace.m_DataSources.GetAt(iIndex, strAlias, pDataSource);
if (bGetDatasource)
{
return pDataSource;
}
else
{
return NULL;
}
}
void CNavigatorView::OnFileClose()
{
// TODO: Add your command handler code here
if (m_pMapWnd)
{
m_pMapWnd->OnClose();
m_pMapWnd->Refresh();
}
}
void CNavigatorView::OnMapZoomin()
{
// TODO: Add your command handler code here
if (m_pMapWnd)
{
m_pMapWnd->Zoom(2);
m_pMapWnd->Refresh();
}
}
void CNavigatorView::OnMapZoomout()
{
// TODO: Add your command handler code here
if (m_pMapWnd)
{
m_pMapWnd->Zoom(0.5);
m_pMapWnd->Refresh();
}
}
void CNavigatorView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_pMapWnd)
{
CDC* pDC = GetDC();
// 设置绘图对象
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -