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

📄 public_tgisview.cpp

📁 公交查询系统源代码 是武汉的 提供简单的查询和乘车方案 vc++
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		pCtrlView->m_PositingBtn.ModifyStyle(0, WS_VISIBLE, 0);
		// 输出查询结果
		pCtrlView->OutputResult(); 
		// 刷新控件
		pCtrlView->Invalidate(TRUE);
	}
	else if(m_nCurTool == ID_MAP_RECTSEL) // 矩形选择
	{
		CMoRectangle rect;
		rect = m_map.TrackRectangle(); 
		// 执行空间矩形查询
		pMainWnd->m_environment.ExecuteSpatialByRect(rect, 5); 
		m_map.SetExtent(m_map.GetExtent()) ; 		
		CMapControlView* pCtrlView = (CMapControlView*)(pMainWnd->m_wndSplitter2.GetPane(0,0));
		pCtrlView->m_OperaTab.SetCurSel(2);
		pCtrlView->m_MapIndexTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_LayerTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_ResultListBox.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_ContentBtn.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_PositingBtn.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->OutputResult(); 
		pCtrlView->Invalidate(TRUE);
	}
	else if(m_nCurTool == ID_MAP_POLYSEL) // 多边形选择
	{
		CMoPolygon  poly;
		poly = m_map.TrackPolygon();
		// 执行空间多边形查询
		pMainWnd->m_environment.ExecuteSpatialByPolygon(poly, 5); 
		m_map.SetExtent(m_map.GetExtent()) ; 		
		CMapControlView* pCtrlView = (CMapControlView*)(pMainWnd->m_wndSplitter2.GetPane(0,0));
		pCtrlView->m_OperaTab.SetCurSel(2);
		pCtrlView->m_MapIndexTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_LayerTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
		pCtrlView->m_ResultListBox.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_ContentBtn.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->m_PositingBtn.ModifyStyle(0, WS_VISIBLE, 0);
		pCtrlView->OutputResult(); 
		pCtrlView->Invalidate(TRUE);
	}
	else if(m_nCurTool == ID_MAP_INFO) // 信息
	{
		if(m_pInfoDlg == NULL)
		{
			m_pInfoDlg = new CInfoDlg();
			if(m_pInfoDlg)
			{
				BOOL ret = m_pInfoDlg->Create(IDD_DIALOG_INFO, this);
				if(!ret)   // 创建失败
				{
					AfxMessageBox("创建对话框失败!");
					return;
				}

				m_pInfoDlg->Identify(X, Y); 
				m_pInfoDlg->ShowWindow(SW_SHOW);
			}
			else
				AfxMessageBox("创建对话框失败!");
		}
		else
		{
			m_pInfoDlg->Identify(X, Y); 
			m_pInfoDlg->ShowWindow(SW_SHOW);
		}
	}
	else if(m_nCurTool == ID_MAP_NEARESTNAME)//搜索最近地物
	{
		if(pMainWnd->m_environment.m_MapOpr == MO_SEACHBYDIST)
		{
			CMoPoint pt;
			pt = m_map.ToMapPoint((float)X, (float)Y);
			
			m_map.SetMousePointer(moHourglass);

			CMapControlView* pCtrlView = (CMapControlView*)(pMainWnd->m_wndSplitter2.GetPane(0,0));
			long nCount = pMainWnd->m_environment.SearchByDistance (pt.GetX(), pt.GetY(), 
				                                     pMainWnd->m_environment.m_dDistance, 
													 &(pCtrlView->m_ResultListBox));
			pCtrlView->m_OperaTab.SetCurSel(2);
			pCtrlView->m_MapIndexTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
			pCtrlView->m_LayerTreeView.ModifyStyle(WS_VISIBLE, 0, 0);
			pCtrlView->m_ResultListBox.ModifyStyle(0, WS_VISIBLE, 0);
			pCtrlView->m_ContentBtn.ModifyStyle(0, WS_VISIBLE, 0);
			pCtrlView->m_PositingBtn.ModifyStyle(0, WS_VISIBLE, 0);
			pCtrlView->Invalidate(TRUE);
            
			pMainWnd->m_environment.m_MapOpr = MO_NULL;
			m_map.SetMousePointer(moArrow);
		}
	}
	else if(m_nCurTool == ID_MAP_LINEMEASURE)
	{
		CMoLine line;
		line = m_map.TrackLine();
		double dLength = pMainWnd->m_environment.GetLineLength(line); 
		CString str;
		str.Format("您选择的线路长度:%f米。", dLength);
		AfxMessageBox(str);
	}
	else if(m_nCurTool == ID_MAP_AREAMEASURE)
	{
		CMoPolygon  poly;
		poly = m_map.TrackPolygon();
		double dLength,dArea;
		dLength = pMainWnd->m_environment.GetPolygonLength(poly);
		dArea = pMainWnd->m_environment.GetPolygonArea(poly);
		CString str;
		str.Format("您选择的区域周长:%f米,面积:%f平方米。", dLength, dArea);
		AfxMessageBox(str); 
	}	

}

void CPublic_TGISView::OnMouseMoveMap1(short Button, short Shift, long X, long Y) 
{
	// TODO: Add your control notification handler code here
	// 在状态栏中显示当前鼠标位置处的经纬度值
	CMoPoint point;
	point = m_map.ToMapPoint((float)X, (float)Y);
	CString str;
	str.Format("东经=%f, 北纬=%f", point.GetX(), point.GetY());
	CStatusBar* pBar = &((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar;
	int index=pBar->CommandToIndex(ID_ROW_COL);
	pBar->SetPaneText(index,str);

	// 为快速显示地名而设置成员变量的值
	if(m_map.GetMousePointer() == moArrow)
	{
		m_lastX = m_x;
		m_lastY = m_y;
		m_x = X;
		m_y = Y;		
	}
}

void CPublic_TGISView::OnAfterLayerDrawMap1(short index, BOOL canceled, long hDC) 
{
	// TODO: Add your control notification handler code here
	//确保重画一次
	if (index != 0)
		return;
    
	CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
	long dScale = (long)pMainWnd->m_environment.CalcScale(&m_map);	//地图比例尺

	CString str;
	str.Format("比例尺=1:%d", dScale);
	CStatusBar* pBar = &((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar;
	int nIndex=pBar->CommandToIndex(ID_MAP_SCALE);
	// 在状态栏的第3个窗格显示地图显示比例尺
	pBar->SetPaneText(nIndex,str);

	// 绘画选中的地物
	if (dScale < 250000)
	{
		pMainWnd->m_environment.DrawRecordset(&m_map);
		if (pMainWnd->m_environment.m_selectedFeature != NULL)
		{
			pMainWnd->m_environment.DrawSelectedShape(&m_map); 
		}
	}
	// 绘画公交车站
	if (pMainWnd->m_environment.m_buses != NULL && dScale < 200000)
	{
		HPEN tempPen = CreatePen(PS_SOLID, 7, RGB(255, 0, 0));
        SelectObject((HDC)hDC, tempPen);

		// 先统计有效点的个数
		int nCount = 0;
		for (int i=0; i<pMainWnd->m_environment.m_buses->nNum; i ++)
		{
			if (pMainWnd->m_environment.m_buses->pts[i].x < 0 || 
				pMainWnd->m_environment.m_buses->pts[i].y < 0)
				continue;
			else
				nCount ++;
		}
		POINT* pts = new POINT[nCount];
		int nTemp = 0;
		for (i=0; i<pMainWnd->m_environment.m_buses->nNum; i ++)
		{
			if (pMainWnd->m_environment.m_buses->pts[i].x < 0 || 
				pMainWnd->m_environment.m_buses->pts[i].y < 0)
				continue;
            
			MPoint pt = pMainWnd->m_environment.FromMapPoint(&m_map,
				        pMainWnd->m_environment.m_buses->pts[i].x,
						pMainWnd->m_environment.m_buses->pts[i].y);
			pts[nTemp].x = (long) pt.x;
			pts[nTemp].y = (long) pt.y;
//			if(nTemp >= 1)
//			{
//				Polyline((HDC)hDC, pts, nTemp);
//				m_map.CenterAt(pMainWnd->m_environment.m_buses->pts[i].x, 
//					        pMainWnd->m_environment.m_buses->pts[i].y);
//			    Sleep(100);
//			}
			nTemp ++;
			
		}
        
		// 绘制
		
		::Polyline((HDC)hDC, pts, nCount);
		
		delete pts;
		pts = NULL;
	}

	// 绘画公交线路,或最短路经
	if (pMainWnd->m_environment.m_drawLine != NULL && dScale < 200000)
	{
		HPEN tempPen = CreatePen(PS_SOLID, 7, RGB(255, 0, 0));
		SelectObject((HDC)hDC, tempPen);
        
		for (int i = 0; i<pMainWnd->m_environment.m_nSelectedLineNum; i ++)
		{
			POINT* pts = new POINT[pMainWnd->m_environment.m_drawLine[i].nPointNumber];
			for (int j = 0; j<pMainWnd->m_environment.m_drawLine[i].nPointNumber; j ++)
			{
				MPoint pt = pMainWnd->m_environment.FromMapPoint(&m_map, 
 					        pMainWnd->m_environment.m_drawLine[i].pPoint[j].x, 
					        pMainWnd->m_environment.m_drawLine[i].pPoint[j].y);
				pts[j].x = (long)pt.x;
				pts[j].y = (long)pt.y;
			}
			
			::Polyline((HDC)hDC, pts, pMainWnd->m_environment.m_drawLine[i].nPointNumber);
			delete pts;
			pts = NULL;
		}
	}
}

//----------------------------------------------------------------------------------------------
// 点选择
void CPublic_TGISView::OnPointSelect()
{
	if(m_nCurTool == ID_MAP_POINTSEL)
	{
		m_nCurTool = NULL;
		m_map.SetMousePointer(moArrow);
	}
	else
	{
		m_nCurTool = ID_MAP_POINTSEL;
		m_map.SetMousePointer(moArrowQuestion);
	}
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnUpdatePointSel(CCmdUI* pCmdUI)
{
	pCmdUI->SetCheck( m_nCurTool == ID_MAP_POINTSEL);
}
//----------------------------------------------------------------------------------------------
// 矩形选择
void CPublic_TGISView::OnRectSelect()
{
	if(m_nCurTool == ID_MAP_RECTSEL)
	{
		m_nCurTool = NULL;
		m_map.SetMousePointer(moArrow);
	}
	else
	{
		m_nCurTool = ID_MAP_RECTSEL;
		m_map.SetMousePointer(moArrowQuestion);
	}
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnUpdateRectSel(CCmdUI* pCmdUI)
{
	pCmdUI->SetCheck( m_nCurTool == ID_MAP_RECTSEL);
}
//----------------------------------------------------------------------------------------------
// 多边形选择
void CPublic_TGISView::OnPolySelect()
{
	if(m_nCurTool == ID_MAP_POLYSEL)
	{
		m_nCurTool = NULL;
		m_map.SetMousePointer(moArrow);
	}
	else
	{
		m_nCurTool = ID_MAP_POLYSEL;
		m_map.SetMousePointer(moArrowQuestion);
	}
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnUpdatePolySel(CCmdUI* pCmdUI)
{
	pCmdUI->SetCheck( m_nCurTool == ID_MAP_POLYSEL);
}

//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnMapInfo()
{
	if(m_nCurTool == ID_MAP_INFO)
	{
		m_nCurTool = NULL;
		m_map.SetMousePointer(moArrow);
	}
	else
	{
		m_nCurTool = ID_MAP_INFO;
		m_map.SetMousePointer(moIdentify);
	}
}
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnUpdateMapInfo(CCmdUI* pCmdUI)
{
	pCmdUI->SetCheck(m_nCurTool == ID_MAP_INFO);
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
void CPublic_TGISView::OnNameQuery()    //打开目标查询对话框
{
	CNameQuryDlg NameQuryDlg;
	NameQuryDlg.DoModal();
}
//------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// 在下拉列表框中加入“地名类型”数据表中大类名称
// 参数CComboBox* pComboBox表示在该下拉列表框中加入大类名称
BOOL CPublic_TGISView::LoadFilter(CComboBox* pComboBox)
{
	CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();

	CDaoDatabase* tmpDB = new CDaoDatabase;
	try
	{
		tmpDB->Open(pMainWnd->m_environment.m_szDBName);
	}
	catch (CDaoException* e)
	{
		DisplayDaoException(e);
		delete tmpDB;
		e->Delete();
		return FALSE;
	}

	CDaoRecordset rs(tmpDB);
	try
	{
		pComboBox->ResetContent();
		pComboBox->AddString("(全部类型)");

		CString strQuery = "Select [大类] from [地名类型] where 大类 <> '武汉纵览'";
		rs.Open(dbOpenDynaset,strQuery);
		while(!rs.IsEOF())
		{
			COleVariant var;
			var = rs.GetFieldValue("大类");
			pComboBox->AddString(CCrack::strVARIANT(var));

			rs.MoveNext();
		}

		pComboBox->SetCurSel(0);
	}
	catch (CDaoException* e)
	{
		DisplayDaoException(e);
		tmpDB->Close();
		delete tmpDB;
		e->Delete();
		return FALSE;
	}

	if(tmpDB)
	{
		if(tmpDB->IsOpen())
		{
			tmpDB->Close();
		}

		delete tmpDB;
		tmpDB = NULL;
	}
	return TRUE;
}
//----------------------------------------------------------------------------------------------
// 在下拉列表框中加入某大类的所有中类名称
// 参数pComboBox表示在该下拉列表框中加入名称
// 参数szFilter表示大类
BOOL CPublic_TGISView::LoadFilter2(CComboBox* pComboBox, CString szFilter, bool bLayerType)
{
	CString szFilter2 = "";
	if (szFilter != "(全部类型)")
	{
		szFilter2 = "where 大类 = '" + szFilter + "'";
	}

	CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();

	CDaoDatabase* tmpDB = new CDaoDatabase;
	try
	{
		tmpDB->Open(pMainWnd->m_environment.m_szDBName);
	}
	catch (CDaoException* e)
	{
		DisplayDaoException(e);
		delete tmpDB;
		e->Delete();
		return FALSE;
	}

	CDaoRecordset rs(tmpDB);
	try
	{
		pComboBox->ResetContent();
		pComboBox->AddString("(全部子类型)");

		CString strQuery = "Select [中类] from [地名中类型]";
		strQuery += szFilter2;
		rs.Open(dbOpenDynaset,strQuery);
		while(!rs.IsEOF())
		{
			COleVariant var;
			var = rs.GetFieldValue("中类");
			CString str = CCrack::strVARIANT(var);
			if(bLayerType && str == "街道")
				rs.MoveNext();
			else
			{
				pComboBox->AddString(str);
				rs.MoveNext();
			}
		}

		pComboBox->SetCurSel(0);
	}
	catch (CDaoException* e)
	{
		DisplayDaoException(e);
		tmpDB->Close();
		delete tmpDB;
		e->Delete();
		return FALSE;
	}

	if(tmpDB)
	{
		if(tmpDB->IsOpen())
		{
			tmpDB->Close();
		}

		delete tmpDB;
		tmpDB = NULL;
	}
	return TRUE;
}
//---------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
// 查找最近地物
void CPublic_TGISView::OnNearestName()
{
	m_nCurTool = ID_MAP_NEARESTNAME;
	if(m_pNearestDlg == NULL)
	{

⌨️ 快捷键说明

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