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

📄 mapappview.cpp

📁 用VC++实现矢量地图背景下的实时显示源代码
💻 CPP
字号:
// MapAppView.cpp : implementation of the CMapAppView class
//

#include "stdafx.h"
#include "MapApp.h"

#include "MapAppDoc.h"
#include "MapAppView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMapAppView

IMPLEMENT_DYNCREATE(CMapAppView, CView)

BEGIN_MESSAGE_MAP(CMapAppView, CView)
	//{{AFX_MSG_MAP(CMapAppView)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
//网上数据接收
	ON_MESSAGE (WM_USER_RECEIVE_DATA,OnReceiveData)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMapAppView construction/destruction

CMapAppView::CMapAppView()
{
	// TODO: add construction code here

}

CMapAppView::~CMapAppView()
{
	char str[256];
	if (m_hWindowHwnd) //地图窗口存在
	{
		sprintf(str,"Close Window %lu",m_lWindowid);
		mapinfo.Do(str);
		m_hWindowHwnd = NULL;
		m_lWindowid = 0L;
		mapinfo.Do("Commit Table plane");//保存实时航迹表
	}

}

BOOL CMapAppView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMapAppView drawing

void CMapAppView::OnDraw(CDC* pDC)
{
	CMapAppDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMapAppView diagnostics

#ifdef _DEBUG
void CMapAppView::AssertValid() const
{
	CView::AssertValid();
}

void CMapAppView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMapAppDoc* CMapAppView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMapAppDoc)));
	return (CMapAppDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMapAppView message handlers

void CMapAppView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	char str[256];
	///创建航显底图
    mapinfo.Do("Open Table \"E:\\Province.tab\" ReadOnly Interactive");
    mapinfo.Do("Open Table \"E:\\Capitals.tab\" ReadOnly Interactive");
    mapinfo.Do("Open Table \"E:\\China.tab\" ReadOnly Interactive");
	sprintf(str,"Set Next Document Parent %lu Style 2 ",(long)(UINT)m_hWnd);
	mapinfo.Do(str);//创建地图窗口
/*设置地图窗口的图层,由最上一层开始是中国疆域,各省疆域,省会城市,并标注上省会城市的名字*/
	mapinfo.Do("Map From Capitals, Province, China");
	mapinfo.Do("Set Map Layer 1 Label With Capital_Character_Name Parallel On Auto On Visibility On");

//获取地图窗口的ID号和句柄
	m_lWindowid = atol(mapinfo.Eval("WindowID(0)"));	//窗口ID
	sprintf(str,"WindowInfo(0, %u)", WIN_INFO_WND);	//窗口HWND
	m_hWindowHwnd = (HWND)atol(mapinfo.Eval(str));
//调整地图窗口尺寸,将地图窗口放置在右半屏上
	sprintf(str,
		"Set Window %lu Position (8.3,0) Width 8.4 Height 6.05  ScrollBars Off SysMenuClose Off", m_lWindowid);
	mapinfo.Do(str);
//调整地图窗口视野和中心点
	double m_dView_center_x=113.35;	//地图窗口中心点,经纬度
	double m_dView_center_y=35.04;
	double 	m_dView_zoom = 4000.0;	//地图窗口视野,"km"
	sprintf(str,"Set Map Window %lu Zoom %lf Units \"km\" Center (%lf,%lf) XY Units \"degree\"",  m_lWindowid,m_dView_zoom,m_dView_center_x,m_dView_center_y);
	mapinfo.Do(str);//设置地图窗口中心点窗口视野
//设置地图窗口漫游缩放的右键菜单
	mapinfo.Do("Create Menu \"MapshellShortcut\" ID 17 as \"漫游\" calling 1702,\"缩小\" calling 1706, \"放大\" calling 1705 ,\"(-\"");
//创建实时航迹显示图层
	mapinfo.Do("Create Table plane (ID Integer) File \"E:\\plane.tab\" ");
	mapinfo.Do("Create Map For plane");
	sprintf(str,"Add Map Window %lu Layer plane Animate",m_lWindowid);
	mapinfo.Do(str);			 //实时航迹图层设置为快速刷新

	/////////////////定义mapinfo中所用的变量
	mapinfo.Do("Dim obj1 As Object");	//飞机图标点对象
	mapinfo.Do("Dim Line1 As Object");	//航迹线对象
	global_num = 0;			//接收目标数据计数初始化为0
	
}

void CMapAppView::OnReceiveData(WPARAM m_Wparam, LPARAM m_lparam)
{
//接收数据处理
	
	NETDATA *m_pxy = (NETDATA *)m_lparam;

	global_long_last = global_long;//上一点经度
	global_lat_last = global_lat;

	global_long = m_pxy->x;//经度,当前点
	global_lat= m_pxy->y;//纬度
	ShowMapLine();
}

void CMapAppView::ShowMapLine() 
{
	char str[256];
//画飞机图标
	double m_angle = COPI*atan2((global_lat - global_lat_last),
			(global_long - global_long_last))-90;//目标角度
	sprintf(str,
		"Create Point Into Variable obj1 (%lf,%lf) Symbol (85,255,30,\"MapInfo Transportation\",0,%lf)",	
		global_long, global_lat, m_angle); 	//设置飞机目标显示的样式
	mapinfo.Do(str);	//创建目标图标对象
	if (global_num >0 )
	{/*收到的第一点,在plane表中插入第一条记录,后面的点都是更新第一条记录*/
		sprintf(str, 
			"Update plane Set Obj = obj1 Where RowID = %lu",1);}
	else { 
		sprintf(str,
			"Inset Into plane (ID,Obj) Values (%lu,Line1) ", global_num);
	}
	mapinfo.Do(str);//用obj1对象更新表中的记录
//画各设备的航迹
	sprintf(str,
		"Create Line Into  Variable Line1 (%lf,%lf) (%lf,%lf) Pen MakePen(2,2,255)",
		global_long_last,	global_lat_last	,	global_long,		global_lat);
	mapinfo.Do(str);//创建line1对象
	if (global_num >0 )
	{//第一个点不画航迹
		sprintf(str,"Fetch Last From plane");
		mapinfo.Do(str);
		//插入line1到表中
		sprintf(str,"Insert Into plane (ID,Obj) Values (%lu,Line1)",global_num);
		mapinfo.Do(str);
	}
	global_num ++;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -