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

📄 navigatorview.cpp

📁 基于超图sne开发的一个详细的例子。提供查询
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -