📄 queryview.cpp
字号:
// 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 + -