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

📄 firstmapview.cpp

📁 具有地图的放大、缩小、漫游、属性查询、图层控制等功能。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	m_list.SetCheck(index_seled);

	LONG lstyle;
	lstyle = GetWindowLong(m_list.m_hWnd,GWL_STYLE);
	lstyle |= LVS_AUTOARRANGE;
	SetWindowLong(m_list.m_hWnd,GWL_STYLE,lstyle);
	*/
	
	// 使得m_nIndex-1位置处项目高亮显示并获得焦点
	UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
	m_list.SetItemState(index_seled, flag, flag);


}

void CFirstMapView::OnButtonDown() 
{
	// TODO: Add your command handler code here
	if (this->index_seled == -1)	  //如果没有选择就返回
	{
		MessageBox("请选择一个图层再下移!","提示",MB_ICONINFORMATION);
		return;  
	}
	
	if (index_seled == m_list.GetItemCount()-1)  // 判断所选项是否位于行首
	{
		MessageBox("已经位于最底层!","提示",MB_ICONINFORMATION);
		return;
	}
	this->layers.MoveTo(index_seled,index_seled+1);
	this->Layers.MoveTo(index_seled,index_seled+1);
	m_map.Refresh();
	m_map2.Refresh();
	
	CString str;
	int i = m_list.GetItemCount()-index_seled-1;
	str = PathName[i-1];
	PathName[i-1] = PathName[i];
	PathName[i] =str;

	int j =index-1;
	m_list.DeleteAllItems();
	for(i=0;j>=0;i++)
	{
		lvitem.iItem = i;
		m_list.InsertItem(&lvitem);
		m_list.SetItemState (i,0x2000, LVIS_STATEIMAGEMASK);
		m_list.SetItemText(i,0,PathName[j]);
		j--;
	}
	index_seled++;
	// 使得m_nIndex-1位置处项目高亮显示并获得焦点
	UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
	m_list.SetItemState(index_seled, flag, flag);

}

void CFirstMapView::OnUpTop() 
{
	// TODO: Add your command handler code here
	if (this->index_seled == -1)	  //如果没有选择就返回
	{
		MessageBox("请选择一个图层!","提示",MB_ICONINFORMATION);
		return;  
	}
	
	if (index_seled == 0)  // 判断所选项是否位于行首
	{
		MessageBox("已经位于最上层!","提示",MB_ICONINFORMATION);
		return;
	}
	this->layers.MoveToTop(index_seled);
	this->Layers.MoveToTop(index_seled);
	m_map.Refresh();
	m_map2.Refresh();
	
	int num = m_list.GetItemCount();
	CString str;
	int i = num-index_seled-1;
	str = PathName[i];
	for(int j = i ; j<num-1;j++)
	{
		PathName[j] = PathName[j+1];	
	}
	PathName[num-1] = str;

	j =index-1;
	m_list.DeleteAllItems();
	for(i=0;j>=0;i++)
	{
		lvitem.iItem = i;
		m_list.InsertItem(&lvitem);
		m_list.SetItemState (i,0x2000, LVIS_STATEIMAGEMASK);
		m_list.SetItemText(i,0,PathName[j]);
		j--;
	}
	index_seled=0;
	// 使得m_nIndex-1位置处项目高亮显示并获得焦点
	UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
	m_list.SetItemState(index_seled, flag, flag); 
}

void CFirstMapView::OnDownBottom() 
{
	// TODO: Add your command handler code here
	if (this->index_seled == -1)	  //如果没有选择就返回
	{
		MessageBox("请选择一个图层!","提示",MB_ICONINFORMATION);
		return;  
	}
	
	if (index_seled == m_list.GetItemCount()-1)  // 判断所选项是否位于行首
	{
		MessageBox("已经位于最上层!","提示",MB_ICONINFORMATION);
		return;
	}
	this->layers.MoveToBottom(index_seled);
	this->Layers.MoveToBottom(index_seled);
	m_map.Refresh();
	m_map2.Refresh();
	
	int num = m_list.GetItemCount();
	CString str;
	int i = num-index_seled-1;
	str = PathName[i];
	for(int j = i ; j>0;j--)
	{
		PathName[j] = PathName[j-1];	
	}
	PathName[0] = str;

	j =index-1;
	m_list.DeleteAllItems();
	for(i=0;j>=0;i++)
	{
		lvitem.iItem = i;
		m_list.InsertItem(&lvitem);
		m_list.SetItemState (i,0x2000, LVIS_STATEIMAGEMASK);
		m_list.SetItemText(i,0,PathName[j]);
		j--;
	}
	index_seled=0;
	// 使得m_nIndex-1位置处项目高亮显示并获得焦点
	UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
	m_list.SetItemState(index_seled, flag, flag); 
}

void CFirstMapView::OnScaleWind() 
{
	// TODO: Add your command handler code here
        
	if(dlg.DoModal()==IDOK)
   {
		
		double scale;
		scale = 1.0/dlg.m_scale;
		SetMapScale(m_map, dlg.m_scale);
   }
}

void CFirstMapView::SetMapScale(CMoMap &map, double scale)
{
	CDC* pDC = map.GetDC();
	double MiterPointNum = (1000.0/25.4)*GetDeviceCaps(pDC->m_hDC,LOGPIXELSX); 
	//MiterPointNum为屏幕上一米有多少个象素点
	//GetDeviceCaps(pDC->m_hDC,LOGPIXELSX) 返回屏幕横轴方向上每英寸长度包含的象素个数
//	LPRECT lpRect;   
//	m_map.GetClientRect(lpRect);
//	CRect r(lpRect);
	double widthX = (this->width-178)*scale/MiterPointNum;
	double widthY = this->height*scale/MiterPointNum; 
	CMoRectangle moRect(map.GetExtent());
	CMoPoint pt(moRect.GetCenter());
	CMoRectangle moRectNew;
	if(!moRectNew.CreateDispatch(TEXT("MapObjects2.Rectangle")))
		return;
	moRectNew.SetLeft(pt.GetX()-widthX/2.0);
	moRectNew.SetRight(pt.GetX()+widthX/2.0);
	moRectNew.SetTop(pt.GetY()+widthY/2.0);
	moRectNew.SetBottom(pt.GetY()-widthY/2.0);
	map.SetExtent(moRectNew);
	map.Refresh();
	map.ReleaseDC(pDC);
}

void CFirstMapView::OnQueryPoint() 
{
	// TODO: Add your command handler code here
	if(m_nCurTool == ID_QUERY_POINT)
	{
		m_nCurTool = ID_NOMAL;
		this->m_CurrentOperation = Null_Query ;
	}
}

void CFirstMapView::OnQueryEllipse() 
{
	// TODO: Add your command handler code here
	this->m_CurrentOperation = Query_Ellipse;
}

void CFirstMapView::OnQueryPolygon() 
{
	// TODO: Add your command handler code here
	this->m_CurrentOperation = Query_Polygon;
}

void CFirstMapView::OnQueryRectangle() 
{
	// TODO: Add your command handler code here
	this->m_CurrentOperation = Query_Rectangle;
}



void CFirstMapView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(!m_firstStart)
	{
		CMoLayers m_Layers;
		if(m_Layers.CreateDispatch(TEXT("MapObjects2.MoLayers")))
			return;
		m_Layers = m_map2.GetLayers();
		int layersCount = m_map2.GetLayers().GetCount();

		for(int i=0;i<layersCount;i++)
			m_Layers.Remove(0);
		OnSetNavigationViewMapLayer();
	}
	
	
}

void CFirstMapView::OnMouseDownMap2(short Button, short Shift, long X, long Y) 
{
	// TODO: Add your control notification handler code here
	CMoPoint pt(m_map2.ToMapPoint((float)X,(float)Y));

	m_startPointX = pt.GetX();
	m_startPointY = pt.GetY();

	m_DragRectFlag = FALSE;
	if(m_map.GetExtent().IsPointIn(pt))
	{
		//清除原始范围矩形
		this->m_RefreshOriginalRect = TRUE;
		OnClearOriginalRect();
		m_RefreshOriginalRect = FALSE;

		float xc,yc;
		CMoRectangle rc(m_map.GetExtent());
		CMoPoint pt1,pt2;
		pt1.CreateDispatch(_T("MapObjects2.Point"));
		pt2.CreateDispatch(_T("MapObjects2.Point"));

		this->m_hWnd = (HWND)m_map2.GetHWnd();
		this->m_hDC  = ::GetDC(m_hWnd);
		::SetROP2(m_hDC,R2_NOTXORPEN);

		pt1.SetX(rc.GetLeft());
		pt1.SetY(rc.GetTop());

		m_map2.FromMapPoint(pt1,&xc,&yc);
		m_xMin = (int)xc;
		m_yMin = (int)yc;
		pt2.SetX(rc.GetRight());
		pt2.SetY(rc.GetBottom());
		m_map2.FromMapPoint(pt2,&xc,&yc);
		m_xMax = (int)xc;
		m_yMax = (int)yc;

		::Rectangle(m_hDC,m_xMin,m_yMin,m_xMax,m_yMax);

		m_xPrev = X;
		m_yPrev = Y;

		pt1.ReleaseDispatch();
		pt2.ReleaseDispatch();
		this->m_DragRectFlag = TRUE;
	}
	

}

void CFirstMapView::OnMouseMoveMap2(short Button, short Shift, long X, long Y) 
{
	// TODO: Add your control notification handler code here
	//当左键按下时
	if(Button == 1 && this->m_DragRectFlag)
	{
		int xNext = X;
		int yNext = Y;

		::Rectangle(m_hDC,m_xMin,m_yMin,m_xMax,m_yMax);
		m_xMin = m_xMin + (xNext - m_xPrev);
		m_yMin = m_yMin + (yNext - m_yPrev);
		m_xMax = m_xMax + (xNext - m_xPrev);
		m_yMax = m_yMax + (yNext - m_yPrev);
	
		::Rectangle(m_hDC,m_xMin,m_yMin,m_xMax,m_yMax);
		m_xPrev = xNext;
		m_yPrev = yNext;
	}
}

void CFirstMapView::OnMouseUpMap2(short Button, short Shift, long X, long Y) 
{
	// TODO: Add your control notification handler code here
	if(m_DragRectFlag)
	{
		CMoPoint pt(m_map2.ToMapPoint((float)X,(float)Y)); //定义终点
		
		float xc,yc;
		CMoRectangle rc;
		rc.CreateDispatch("MapObjects2.Rectangle");

	//	BOOL b = ::Rectangle(m_hDC,m_xMin,m_yMin,m_xMax,m_yMax);

		xc = (float)m_xMin;
		yc = (float)m_yMin;
		CMoPoint pt1(m_map2.ToMapPoint(xc,yc));
		rc.SetLeft(m_map.GetExtent().GetLeft()-this->m_startPointX+pt.GetX());
		rc.SetTop(m_map.GetExtent().GetTop()-m_startPointY+pt.GetY());

		xc = (float)m_xMax;
		yc = (float)m_yMax;
		CMoPoint pt2(m_map2.ToMapPoint(xc,yc));
		rc.SetRight(m_map.GetExtent().GetRight()-this->m_startPointX+pt.GetX());
		rc.SetBottom(m_map.GetExtent().GetBottom()-m_startPointY+pt.GetY());

		m_map.SetExtent(rc);
		rc.ReleaseDispatch();

	//	this->OnRefreshNavigationWindow();

		::ReleaseDC(m_hWnd,m_hDC);

	}
}

void CFirstMapView::OnAfterTrackingLayerDrawMap2(long hDC) 
{
	// TODO: Add your control notification handler code here
	CMoSymbol sym;
	if(sym.CreateDispatch("MapObjects2.Symbol"))
		return;
	sym.SetSize(2);
	sym.SetStyle(1);
	sym.SetOutlineColor(0xFF00);

	CMoRectangle rc;
	rc.CreateDispatch("MapObjects2.Rectangle");
	if(!m_RefreshOriginalRect)
	{
		rc = m_map.GetExtent();
		m_map2.DrawShape(rc,sym);
	}
	else
	{
		rc = m_map2.GetExtent();
		m_map2.DrawShape(rc,sym);
	}
	rc.ReleaseDispatch();
	sym.ReleaseDispatch();
}

void CFirstMapView::OnClearOriginalRect()
{
	VARIANT va;
	VariantInit(&va);
	va.vt = VT_NULL;	
	CMoTrackingLayer tLayer(m_map2.GetTrackingLayer());
	tLayer.Refresh(true,va);

}

void CFirstMapView::OnRefreshNavigationWindow()
{
	VARIANT va;
	VariantInit(&va);
	va.vt = VT_NULL;	
	CMoTrackingLayer tLayer(m_map2.GetTrackingLayer());
	tLayer.Refresh(true,va);

	this->m_RefreshOriginalRect = TRUE;
	OnClearOriginalRect();
	m_RefreshOriginalRect = FALSE;

	float xc,yc;
	CMoRectangle rc(m_map.GetExtent());
	CMoPoint pt1,pt2;
	pt1.CreateDispatch(_T("MapObjects2.Point"));
	pt2.CreateDispatch(_T("MapObjects2.Point"));

	this->m_hWnd = (HWND)m_map2.GetHWnd();
	this->m_hDC  = ::GetDC(m_hWnd);
	::SetROP2(m_hDC,R2_NOTXORPEN); 

	pt1.SetX(rc.GetLeft());
	pt1.SetY(rc.GetTop());

	m_map2.FromMapPoint(pt1,&xc,&yc);
	m_xMin = (int)xc;
	m_yMin = (int)yc;
	pt2.SetX(rc.GetRight());
	pt2.SetY(rc.GetBottom());
	m_map2.FromMapPoint(pt2,&xc,&yc);
	m_xMax = (int)xc;
	m_yMax = (int)yc;

	::Rectangle(m_hDC,m_xMin,m_yMin,m_xMax,m_yMax);

	pt1.ReleaseDispatch();
	pt2.ReleaseDispatch();
}

⌨️ 快捷键说明

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