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

📄 gisview.cpp

📁 一种新的实现鹰眼图的方法
💻 CPP
字号:
// GisView.cpp : implementation of the CGisView class
//

#include "stdafx.h"
#include "Gis.h"

#include "GisDoc.h"
#include "GisView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CGisView

IMPLEMENT_DYNCREATE(CGisView, CView)

BEGIN_MESSAGE_MAP(CGisView, CView)
	//{{AFX_MSG_MAP(CGisView)
	ON_WM_SIZE()
	ON_WM_CREATE()
	ON_COMMAND(ID_LAYER, OnLayer)
	ON_COMMAND(ID_SELECT, OnSelect)
	ON_COMMAND(ID_SPAN, OnSpan)
	ON_COMMAND(ID_ZOOMIN, OnZoomIn)
	ON_COMMAND(ID_ZOOMOUT, OnZoomOut)
	ON_COMMAND(ID_LINE, OnLine)
	ON_COMMAND(ID_LABLE, OnLable)
	ON_COMMAND(ID_PLOYLINE, OnPolyLine)
	ON_COMMAND(ID_AROW, OnArrow)
	ON_COMMAND(ID_TEST, OnTest)
	ON_COMMAND(ID_EYES, OnEyes)
	//}}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()
//mapx 控件消息
BEGIN_EVENTSINK_MAP(CGisView, CView)
//使用工具时的处理
	ON_EVENT(CGisView, ID_MAP, MAPX_DISPID_TOOLUSED,
		OnToolUsed, VTS_I2 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_R8 VTS_BOOL
		VTS_BOOL VTS_PBOOL)
	ON_EVENT(CGisView, ID_MAP, DISPID_MOUSEUP,
		OnMouseUpInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
END_EVENTSINK_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGisView construction/destruction

CGisView::CGisView()
{
	// 建立数据库连接
	HRESULT hr;

	hr = m_rs.CreateInstance("ADODB.Recordset");
	
	if(!SUCCEEDED(hr))
	{
		AfxMessageBox("数据库初始化失败!");
		return;
	}

	//连接数据库
	hr = m_rs->Open("Select * from us_cust", "Provider=Microsoft.Jet.OLEDB.3.51;""Data Source=test.mdb",adOpenStatic, adLockReadOnly, adCmdText);
	
	if(!SUCCEEDED(hr))
	{
		AfxMessageBox("数据库查询失败!");
		return;
	}

	//创建小窗口
//	m_miWindow.m_map = new CMapX;
//	m_miWindow.Create(IDD_MINIWINDOW);
}

CGisView::~CGisView()
{
	m_rs->Close();
}

BOOL CGisView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGisView drawing

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

/////////////////////////////////////////////////////////////////////////////
// CGisView printing

BOOL CGisView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CGisView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CGisView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CGisView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CGisView message handlers

void CGisView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	m_map.MoveWindow(0,0,cx,cy);
}

int CGisView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	if(!m_map.Create(NULL,WS_VISIBLE,CRect(0,0,100,100),this,ID_MAP))
		return -1;
			
	return 0;
}

void CGisView::OnLayer() 
{
	m_map.GetLayers().LayersDlg();
}

void CGisView::OnSelect() 
{
	// TODO: Add your command handler code here
	m_map.SetCurrentTool(miSelectTool);
}

void CGisView::OnSpan() 
{
	// TODO: Add your command handler code here
	m_map.SetCurrentTool(miPanTool);
	
	ChangeEye();
}

void CGisView::OnZoomIn() 
{
	// TODO: Add your command handler code here
	m_map.SetCurrentTool(miZoomInTool);

	ChangeEye();
}

void CGisView::OnZoomOut() 
{
	// TODO: Add your command handler code here
	m_map.SetCurrentTool(miZoomOutTool);

	ChangeEye();
}

void CGisView::OnLine() 
{
	// TODO: Add your command handler code here
	SetInsertionLayer();
	m_map.SetCurrentTool(miAddLineTool);
	
}

void CGisView::OnLable() 
{
	// TODO: Add your command handler code here
	m_map.SetCurrentTool(miLabelTool);
}

void CGisView::OnPolyLine() 
{
	// TODO: Add your command handler code here
	SetInsertionLayer();
	m_map.SetCurrentTool(miAddPolylineTool);
}

void CGisView::OnArrow() 
{
	m_map.SetCurrentTool(miArrowTool);
}

bool CGisView::SetInsertionLayer()
{
	long n;
	CMapXLayer layer;

	n = m_map.GetLayers().GetCount();
	layer = m_map.GetLayers().Item(n);

	m_map.GetLayers().Item(n).SetEditable(true);
	m_map.GetLayers().SetInsertionLayer(layer);
	
	return true;
}

void CGisView::OnTest() 
{
	//将数据显示在地图上

	COptionalVariant optVt;//可选变量??
	CMapXDataset ds;//数据集
	COleVariant rsVt;//数据源指针
	COleVariant BindLayerVt,FieldsVt,QueryInfoVt;
	CMapXFields Fields;
	CMapXBindLayer BindLayer;
	
	//创建对象实例
	if(!Fields.CreateDispatch(Fields.GetClsid())) {
		TRACE0("Failed to Create Fields Object");
		return;
	}

	if(!BindLayer.CreateDispatch(BindLayer.GetClsid())) {
	  TRACE0("Failed to Create BindLayer Object!");
	  return;
	 }

	rsVt.vt = VT_DISPATCH;
	rsVt.pdispVal = m_rs;
	rsVt.pdispVal->AddRef();
	

	try{
		//绑定数据
		BindLayer.SetLayerName("Customers");
		BindLayer.SetLayerType(miBindLayerTypeXY);

		BindLayer.SetRefColumn1("X");
		BindLayer.SetRefColumn2("Y");
  
		BindLayerVt.vt = VT_DISPATCH;
		BindLayerVt.pdispVal = BindLayer;
		BindLayerVt.pdispVal->AddRef();

		Fields.Add(COleVariant("COMPANY"),COleVariant("Company"),COleVariant((long)miAggregationIndividual),COleVariant((long)miTypeString));
		Fields.Add(COleVariant("X"),COleVariant("X"),COleVariant((long)miAggregationAverage),COleVariant((long)miTypeNumeric));
		
		Fields.Add(COleVariant("Y"),COleVariant("Y"),COleVariant((long)miAggregationAverage),COleVariant((long)miTypeNumeric));
		Fields.Add(COleVariant("ORDER_AMT"),COleVariant("Order_Amt"),COleVariant((long)miAggregationSum),COleVariant((long)miTypeNumeric));
		
		FieldsVt.vt = VT_DISPATCH;
		FieldsVt.pdispVal = Fields;
		FieldsVt.pdispVal->AddRef();
		
		ds = m_map.GetDatasets().Add(miDataSetADO,rsVt,COleVariant("company layer"),COleVariant("Company"),COptionalVariant(),BindLayerVt,FieldsVt,COptionalVariant());
		
		//将图标用自定义图表替代
		CMapXLayer layer;//指定添加的层

		layer = m_map.GetLayers().Item("Customers");
		layer.SetOverrideStyle(true);//设定覆盖原来默认的图标

		if(layer.GetStyle().GetSupportsBitmapSymbols())
		{
			layer.GetStyle().SetSymbolType(miSymbolTypeBitmap);
			layer.GetStyle().SetSymbolBitmapSize(12);
			layer.GetStyle().SetSymbolBitmapTransparent(true);
			layer.GetStyle().SetSymbolBitmapName("TOWE2-32.bmp");
		}

		//刷新屏幕
		m_map.Refresh();
	}
	catch (COleDispatchException *e) {
		e->ReportError();
		e->Delete();
	}
	catch (COleException *e) {
		e->ReportError();
		e->Delete();
	}	
}

void CGisView::OnEyes() 
{
	static bool flg = false;
	m_miWindow.m_GeoSet = m_map.GetGeoSet();
	if(!flg)
	{
		m_miWindow.Create(IDD_MINIWINDOW);
		
		flg = true;
	}

	ChangeEye();
	m_miWindow.ShowWindow(SW_SHOW);
}
//刷新小窗口;改变鹰眼的位置
void CGisView::ChangeEye()
{
	CRect rt;

	GetClientRect(&rt);
	float x,y,x1,y1;

	x = rt.left;
	y = rt.top;
	x1 = rt.right;
	y1 = rt.bottom;

	m_map.ConvertCoord(&x,&y,&m_miWindow.m_left,&m_miWindow.m_top,miScreenToMap);
	m_map.ConvertCoord(&x1,&y1,&m_miWindow.m_right,&m_miWindow.m_bottom,miScreenToMap);

	m_miWindow.Invalidate();
	//m_miWindow.DrawEye();
}
//使用工具时
void CGisView::OnToolUsed(short ToolNum, double X1, double Y1, double X2, double Y2, double Distance, BOOL Shift, BOOL Ctrl, BOOL* EnableDefault)
{
	CString str;
	str.Format("Tool=%d, [%f,%f] [%f, %f], dist=%f, %s %s\n",ToolNum, X1,Y1,X2,Y2,Distance,
		(Shift)?"Shift":"",(Ctrl)?"Ctrl":"");
	TRACE(str);

}
//对地图进行单击时
void CGisView::OnMouseUpInMap(short Button, short Shift, float X, float Y)
{
	if(Button = 1)//left button
	{
		long ToolNum;

		ToolNum = m_map.GetCurrentTool();
		if((ToolNum < 1005) && (ToolNum > 1000))//改变视窗范围的工具
		{
			//刷新小视窗
			//m_miWindow.DrawEye();
			ChangeEye();
		}
	}

}

⌨️ 快捷键说明

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