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

📄 queryview.cpp

📁 Embedded vc++下开发的地图查询程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// QueryView.cpp : implementation of the CQueryView class
//

#include "stdafx.h"
#include "Query.h"

#include "QueryDoc.h"
#include "QueryView.h"
#include "MainFrm.h"
#include "DlgQuery.h"
#include "DlgObjectProperty.h"

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

/////////////////////////////////////////////////////////////////////////////
// CQueryView

IMPLEMENT_DYNCREATE(CQueryView, CView)

BEGIN_MESSAGE_MAP(CQueryView, CView)
	//{{AFX_MSG_MAP(CQueryView)
	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_COMMAND(ID_MAP_PAN, OnMapPan)
	ON_COMMAND(ID_MAP_REFRESH, OnMapRefresh)
	ON_COMMAND(ID_MAP_VIEWENTIRE, OnMapViewentire)
	ON_COMMAND(ID_MAP_POINT_SELECT, OnMapPointSelect)
	ON_UPDATE_COMMAND_UI(ID_MAP_PAN, OnUpdateMapPan)
	ON_UPDATE_COMMAND_UI(ID_MAP_ZOOMIN, OnUpdateMapZoomin)
	ON_UPDATE_COMMAND_UI(ID_MAP_ZOOMOUT, OnUpdateMapZoomout)
	ON_UPDATE_COMMAND_UI(ID_MAP_POINT_SELECT, OnUpdateMapPointSelect)
	ON_COMMAND(ID_MEASURE_DISTANCE, OnMeasureDistance)
	ON_COMMAND(ID_MEASURE_AREA, OnMeasureArea)
	ON_UPDATE_COMMAND_UI(ID_MEASURE_DISTANCE, OnUpdateMeasureDistance)
	ON_UPDATE_COMMAND_UI(ID_MEASURE_AREA, OnUpdateMeasureArea)
	ON_COMMAND(ID_QUERY_BY_SQL, OnQueryBySql)
	ON_COMMAND(ID_QUERY_BY_BOUNDS, OnQueryByBounds)
	ON_COMMAND(ID_QUERY_BY_DISTANCE, OnQueryByDistance)
	ON_COMMAND(ID_QUERY_BY_COMPOUND1, OnQueryByCompound1)
	ON_COMMAND(ID_QUERY_BY_COMPOUND2, OnQueryByCompound2)
	ON_COMMAND(ID_OBJECT_PROPERTY, OnObjectProperty)
	ON_COMMAND(ID_RECORD_FIRST, OnRecordFirst)
	ON_COMMAND(ID_RECORD_LAST, OnRecordLast)
	ON_COMMAND(ID_RECORD_NEXT, OnRecordNext)
	ON_COMMAND(ID_RECORD_PREV, OnRecordPrev)
	ON_COMMAND(ID_RECORD_STOP, OnRecordStop)
	ON_UPDATE_COMMAND_UI(ID_QUERY_BY_SQL, OnUpdateQueryBySql)
	ON_UPDATE_COMMAND_UI(ID_QUERY_BY_DISTANCE, OnUpdateQueryByDistance)
	ON_UPDATE_COMMAND_UI(ID_QUERY_BY_BOUNDS, OnUpdateQueryByBounds)
	ON_UPDATE_COMMAND_UI(ID_QUERY_BY_COMPOUND1, OnUpdateQueryByCompound1)
	ON_UPDATE_COMMAND_UI(ID_QUERY_BY_COMPOUND2, OnUpdateQueryByCompound2)
	ON_UPDATE_COMMAND_UI(ID_RECORD_FIRST, OnUpdateRecordFirst)
	ON_UPDATE_COMMAND_UI(ID_RECORD_LAST, OnUpdateRecordLast)
	ON_UPDATE_COMMAND_UI(ID_RECORD_NEXT, OnUpdateRecordNext)
	ON_UPDATE_COMMAND_UI(ID_RECORD_PREV, OnUpdateRecordPrev)
	ON_WM_LBUTTONDBLCLK()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CQueryView construction/destruction

CQueryView::CQueryView()
{//初始化参数
	m_bFileOpened = FALSE;
	m_nUserAction =USER_ACTION_NONE;
	m_pRecordset = NULL;
	m_arrPoint.RemoveAll();
}

CQueryView::~CQueryView()
{
}

BOOL CQueryView::PreCreateWindow(CREATESTRUCT& cs)
{
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CQueryView drawing

void CQueryView::OnDraw(CDC* pDC)
{
	CQueryDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CRect  rcClient;
	GetClientRect( &rcClient );

	if(!m_bFileOpened)
	{
		//显示启动画面,地图还没有显示的时候!
		CDC dc;
		dc.CreateCompatibleDC(pDC);
		
		CBitmap bmp;
		bmp.LoadBitmap( IDB_BITMAP_STARTUP_PAGE );
		CBitmap *pBitmapSaved = dc.SelectObject(&bmp);
		
		pDC->BitBlt(0,0,rcClient.Width(),rcClient.Height(),&dc,0,0,SRCCOPY);
		
		dc.SelectObject(pBitmapSaved);	
		
		dc.DeleteDC();
		bmp.DeleteObject();		
	}
	else
	{
		//显示地图
		m_MapWnd.OnDraw(pDC, rcClient,rcClient);
	}	
}

/////////////////////////////////////////////////////////////////////////////
// CQueryView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CQueryView message handlers

//===================================文件============================
void CQueryView::OnFileOpen() 
{

	CFileDialog dlgFile(true, _T("pmw|pmw|*.*"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("WorkSpace Files (*.pmw)|*.pmw") );

	if( dlgFile.DoModal() == IDOK )
	{
		//如果已经打开工作空间文件,则关闭
		if(theApp.m_WorkSpace.IsOpen())
		{	 	
			theApp.m_WorkSpace.Close();
			m_MapWnd.Close();
			m_bFileOpened = false;
		}	
		//获得图形文件的完整路径及文件名
		CString strFileName = dlgFile.GetPathName();
		//打开工作空间
		if(  theApp.m_WorkSpace.Open( strFileName ) )
		{		
			CSeMaps *pMaps = theApp.m_WorkSpace.GetMaps();
			if( pMaps )
			{
				if ( pMaps->GetMapCount() > 0 ) 
				{
					CSeMapDef MapDef;
					//默认打开第一幅地图
					if( pMaps->GetMapAt( 0, MapDef ) )//通过序号取地图
					{
						if(m_MapWnd.OpenMap(MapDef))
						{
							m_MapWnd.Refresh();//刷新
						}
					}
				}
				//没有默认地图,打开第一个数据源的第一个数据集作为当前地图
				else
				{
					CSeDataSource *pDataSource = theApp.m_WorkSpace.GetDataSourceAt( 0 );
					if( pDataSource && pDataSource->GetDatasetCount() > 0 )
					{
						CSeDataset *pDataset = pDataSource->GetDatasetAt( 0 );
						if( pDataset )
						{
							m_MapWnd.AddLayer( pDataset );//添加图层
							m_MapWnd.Refresh();	//刷新					
						}
					}		
				}
			}
			m_bFileOpened = true;	
		}
	}
}

void CQueryView::OnFileClose() 
{//关闭工作空间
	if ( m_pRecordset )
	{//如果查询的记录集没有释放,就释放掉
		m_pRecordset->GetDataset()->ReleaseRecordset( m_pRecordset );
	}
	theApp.m_WorkSpace.Close(); //关闭工作空间
	m_MapWnd.Close();			//关闭显示管理器
	m_bFileOpened = false;	
	m_MapWnd.Refresh();
}

//==================================地图操作==========================
void CQueryView::OnInitialUpdate() 
{//初始化地图窗口
	m_MapWnd.OnInitialUpdate( &theApp.m_WorkSpace, this );	
	CView::OnInitialUpdate();	
}

void CQueryView::OnMapZoomin() 
{//放大
	m_MapWnd.SetAction(CSeDrawParameters::uaZoomIn);
	//使查询等操作与地图操作不能同时进行
	m_nUserAction = USER_ACTION_NONE;
}

void CQueryView::OnMapZoomout() 
{//缩小
	m_MapWnd.SetAction(CSeDrawParameters::uaZoomOut);
	//使查询等操作与地图操作不能同时进行
	m_nUserAction = USER_ACTION_NONE;
}

void CQueryView::OnMapPan() 
{//平移
	m_MapWnd.SetAction(CSeDrawParameters::uaPan);
	//使查询等操作与地图操作不能同时进行
	m_nUserAction = USER_ACTION_NONE;
}

void CQueryView::OnMapPointSelect() 
{//点选
	m_MapWnd.SetAction( CSeDrawParameters::uaPointModeSelect );		
	//使查询等操作与地图操作不能同时进行
	m_nUserAction = USER_ACTION_NONE;
}

void CQueryView::OnMapViewentire() 
{//整幅显示
	m_MapWnd.ViewEntire();	
}

void CQueryView::OnMapRefresh() 
{//刷新
	m_MapWnd.Refresh();
}

void CQueryView::OnUpdateMapZoomin(CCmdUI* pCmdUI) 
{	//设置菜单和工具条状态
	pCmdUI->SetCheck(m_MapWnd.GetAction()==CSeDrawParameters::uaZoomIn );	
}

void CQueryView::OnUpdateMapZoomout(CCmdUI* pCmdUI) 
{	//设置菜单和工具条状态
	pCmdUI->SetCheck(m_MapWnd.GetAction()==CSeDrawParameters::uaZoomOut );	
}

void CQueryView::OnUpdateMapPan(CCmdUI* pCmdUI) 
{	//设置菜单和工具条状态
	pCmdUI->SetCheck(m_MapWnd.GetAction()==CSeDrawParameters::uaPan );
}

void CQueryView::OnUpdateMapPointSelect(CCmdUI* pCmdUI) 
{//设置菜单和工具条状态
	pCmdUI->SetCheck( m_MapWnd.GetAction()==CSeDrawParameters::uaPointModeSelect );	
}
//=============================量算====================================
void CQueryView::OnMeasureDistance() 
{//量算距离
	if(m_nUserAction == USER_ACTION_MEASURE_DISTANCE)
	{//取消
		m_nUserAction = USER_ACTION_NONE;
	}
	else
	{//设置用户动作为量算距离
		m_nUserAction = USER_ACTION_MEASURE_DISTANCE;
		m_MapWnd.SetAction( CSeDrawParameters::uaNull);	
		m_arrPoint.RemoveAll(); 
		//显示状态栏
		CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
		pFrame->m_wndStatusBar.ShowWindow(SW_SHOW);
		pFrame->RecalcLayout();	
	}
}

void CQueryView::OnMeasureArea() 
{//量算面积
	if(m_nUserAction == USER_ACTION_MEASURE_AREA)
	{	//取消			
		m_nUserAction = USER_ACTION_NONE;
	}
	else
	{//设置用户动作为量算面积
		m_nUserAction = USER_ACTION_MEASURE_AREA;
		m_MapWnd.SetAction(CSeDrawParameters::uaNull);
		m_arrPoint.RemoveAll();
		//显示状态栏
		CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
		pFrame->m_wndStatusBar.ShowWindow(SW_SHOW);
		pFrame->RecalcLayout();	
	}
}

void CQueryView::OnUpdateMeasureDistance(CCmdUI* pCmdUI) 
{
	//设置菜单和工具条状态
	pCmdUI->SetCheck(m_nUserAction==USER_ACTION_MEASURE_DISTANCE);
}

void CQueryView::OnUpdateMeasureArea(CCmdUI* pCmdUI) 
{
	//设置菜单和工具条状态
	pCmdUI->SetCheck(m_nUserAction==USER_ACTION_MEASURE_AREA);	
}
//=============================查询================================
void CQueryView::OnQueryBySql() 
{//SQL查询
	if ( m_nUserAction == USER_ACTION_QUERY_BY_SQL )
	{//取消SQL查询
		m_nUserAction = USER_ACTION_NONE;
	}
	else
	{//设置SQL查询
		m_nUserAction = USER_ACTION_QUERY_BY_SQL;
		m_MapWnd.SetAction( CSeDrawParameters::uaNull );
		//打开查询对话框
		CDlgQuery dlg;
		dlg.m_pMapWnd = &m_MapWnd;
		dlg.m_nQueryMode = m_nUserAction;//设置查询模式
		if ( dlg.DoModal() == IDOK )
		{//得到查询结果
			m_pRecordset = dlg.m_pQueryRecord;
		}	
	}
}

void CQueryView::OnQueryByBounds() 
{//范围查询
	if ( m_nUserAction == USER_ACTION_QUERY_BY_BOUNDS)
	{//取消范围查询
		m_nUserAction = USER_ACTION_NONE;
	}
	else
	{//设置为范围查询,在OnLButtonDown()和OnLButtonDblClk()中具体实现
		m_nUserAction = USER_ACTION_QUERY_BY_BOUNDS;
		m_MapWnd.SetAction( CSeDrawParameters::uaNull );
		m_arrPoint.RemoveAll(); 
	}
}

void CQueryView::OnQueryByDistance() 
{//对象缓冲查询
	
	if ( m_nUserAction == USER_ACTION_QUERY_BY_DISTANCE)
	{//取消对象缓冲查询
		m_nUserAction = USER_ACTION_NONE;
	}
	else
	{//设置为对象缓冲查询,具体的实现过程是在OnLButtonDown()中
		m_nUserAction = USER_ACTION_QUERY_BY_DISTANCE;
		m_MapWnd.SetAction(CSeDrawParameters::uaNull );			
		//将所有图层设置为可选择
		long nLayCount=m_MapWnd.GetLayerCount();
		for (int i=nLayCount-1;i>= 0; i--)
		{
			CSeLayer *pLayer=m_MapWnd.GetLayerAt(i);
			if (pLayer!=NULL)
			{
				pLayer->SetSelectable(TRUE);
			}
		}
	}
}

void CQueryView::OnQueryByCompound1() 
{//矩形区域+SQL复合查询
	if ( m_nUserAction == USER_ACTION_QUERY_BY_BOUNDS_COMPOUND )
	{//取消复合查询
		m_nUserAction = USER_ACTION_NONE;
	}
	else
	{//设置为复合查询,在OnLButtonDown()和OnLButtonDblClk()中具体实现
		m_nUserAction = USER_ACTION_QUERY_BY_BOUNDS_COMPOUND;
		m_MapWnd.SetAction( CSeDrawParameters::uaNull );
		m_arrPoint.RemoveAll();
	}	
}

void CQueryView::OnQueryByCompound2() 
{//对象缓冲+SQL复合查询
	if ( m_nUserAction == USER_ACTION_QUERY_BY_BUFFER_COMPOUND)
	{//取消复合查询
		m_nUserAction = USER_ACTION_NONE;
	}
	else
	{//设置为复合查询,具体的实现过程是在OnLButtonDown()中
		m_nUserAction = USER_ACTION_QUERY_BY_BUFFER_COMPOUND;
		m_MapWnd.SetAction( CSeDrawParameters::uaNull );	
		//将所有图层设置为可选择
		long nLayCount=m_MapWnd.GetLayerCount();
		for (int i=nLayCount-1;i>= 0; i--)
		{
			CSeLayer *pLayer=m_MapWnd.GetLayerAt(i);
			if (pLayer!=NULL)
			{
				pLayer->SetSelectable(TRUE);
			}
		}
	}
}

void CQueryView::OnObjectProperty() 
{//显示对象的属性信息
	if ( m_nUserAction == USER_ACTION_OBJECT_PROPERTY )
	{//取消显示
		m_nUserAction = USER_ACTION_NONE;
		m_MapWnd.SetAction( CSeDrawParameters::uaNull );	
	}
	else
	{//设置为显示,具体的实现过程是在OnLButtonDown()中
		m_nUserAction = USER_ACTION_OBJECT_PROPERTY;
		//设置成点选状态,选择对象时使用
		m_MapWnd.SetAction( CSeDrawParameters::uaPointModeSelect );
	}	
}

void CQueryView::ShowResult()
{//显示查询结果
	if(m_pRecordset!=NULL)

⌨️ 快捷键说明

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