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

📄 dlgquery.cpp

📁 Embedded vc++下开发的地图查询程序
💻 CPP
字号:
// DlgQuery.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "DlgQuery.h"
#include "MainFrm.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDlgQuery dialog


CDlgQuery::CDlgQuery(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgQuery::IDD, pParent)
{//初始化变量
	//{{AFX_DATA_INIT(CDlgQuery)
	m_dDistance = 10.0;
	m_dMaxX = 0.0;
	m_dMaxY = 0.0;
	m_dMinX = 0.0;
	m_dMinY = 0.0;
	m_strSQL = _T("");
	//}}AFX_DATA_INIT
	m_pQueryRecord = NULL;
	m_nQueryMode = -1;
	m_strLayerName = _T("");
	m_pMapWnd = NULL;
}


void CDlgQuery::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgQuery)
	DDX_Control(pDX, IDC_LIST_LAYERS, m_lstLayers);
	DDX_Control(pDX, IDC_COMBO_OPERATOR, m_cmbOperators);
	DDX_Control(pDX, IDC_COMBO_FIELDS, m_cmbFields);
	DDX_Text(pDX, IDC_EDIT_DUFFER, m_dDistance);
	DDX_Text(pDX, IDC_EDIT_MAXX, m_dMaxX);
	DDX_Text(pDX, IDC_EDIT_MAXY, m_dMaxY);
	DDX_Text(pDX, IDC_EDIT_MINX, m_dMinX);
	DDX_Text(pDX, IDC_EDIT_MINY, m_dMinY);
	DDX_Text(pDX, IDC_EDIT_SQL, m_strSQL);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgQuery, CDialog)
	//{{AFX_MSG_MAP(CDlgQuery)
	ON_NOTIFY(NM_CLICK, IDC_LIST_LAYERS, OnClickListLayers)
	ON_CBN_SELCHANGE(IDC_COMBO_FIELDS, OnSelchangeComboFields)
	ON_CBN_SELCHANGE(IDC_COMBO_OPERATOR, OnSelchangeComboOperator)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgQuery message handlers

BOOL CDlgQuery::OnInitDialog() 
{//初始化对话框
	CDialog::OnInitDialog();
	//将图层名加入到列表框中
	AddLayerName();
	//设置控件状态
	SetDialogStatus();
	//填入操作符
	CString strOperator[10];
	strOperator[0] = _T("=");
	strOperator[1] = _T(">");
	strOperator[2] = _T(">=");
	strOperator[3] = _T("<");
	strOperator[4] = _T("<=");
	strOperator[5] = _T("and");
	strOperator[6] = _T("not");
	strOperator[7] = _T("or");
	strOperator[8] = _T("like");
	strOperator[9] = _T("in");
	for ( int j=0; j<10; j++ )
	{
		m_cmbOperators.InsertString( j, strOperator[j]);
	}
	return TRUE;  
}

void CDlgQuery::AddLayerName()
{//将图层名添加到图层列表框中
	//创建图像列表
	m_ImageList.Create(IDB_BITMAP_DATAVIEW, 16, 0, RGB (255, 0, 0));
	m_lstLayers.SetImageList(&m_ImageList,LVSIL_SMALL);
	m_lstLayers.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_SUBITEMIMAGES);
	//{{创建列表框的列
	CString strInfo[1];
	strInfo[0].LoadString( IDS_LAYER_MANAGER );
	CRect rcClient;
	m_lstLayers.GetClientRect(&rcClient);
	int nWidth = rcClient.Width();
	
	LV_COLUMN lvc;
	lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
	
	lvc.iSubItem = 1;
	lvc.pszText = (unsigned short*)(LPCTSTR)strInfo[0];
	lvc.cx = nWidth;
	lvc.fmt = LVCFMT_LEFT;
	m_lstLayers.InsertColumn( 0, &lvc );
	//}}

	m_lstLayers.DeleteAllItems();
	if ( m_pMapWnd )
	{//当前地图中图层的个数
		long nLayerCount = m_pMapWnd->GetLayerCount();
		for ( int i=0; i<nLayerCount; i++ )
		{//获取图层
			CSeLayer *pLayer = m_pMapWnd->GetLayerAt( i );
			if ( pLayer )
			{
				//获取图像信息
				CSeDataset *pDt = pLayer->GetDataset();				
				int nImage = 0;
				switch (pDt->GetType())
				{
				case CSeDatasetInfo::Point:
					nImage = 2;
					break;
				case CSeDatasetInfo::Line:
					nImage = 3;
					break;
				case CSeDatasetInfo::Region:
					nImage = 5;
					break;
				case CSeDatasetInfo::Text:
					nImage = 6;
					break;
				case CSeDatasetInfo::Network:
					nImage = 4;
					break;
				case CSeDatasetInfo::Compound:
					nImage = 7;
					break;
				}
				//创建列表框的行
				strInfo[0] = pLayer->m_strLayerName;
				LPCTSTR lpszItem = (LPCTSTR)strInfo[0];
				m_lstLayers.InsertItem( i, lpszItem, nImage );				
			}
		}
	}
}

void CDlgQuery::SetDialogStatus()
{//根据查询模式设置对话框中其他控件的状态
	switch( m_nQueryMode ) 
	{
	case 0:		//SQL查询
		{
			( (CWnd* )GetDlgItem( IDC_EDIT_MINX ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MINY ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MAXX ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MAXY ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_BUFFER ) )->EnableWindow( false );
		}
		break;
	case 1:		//对象缓冲查询
		{
			( (CWnd* )GetDlgItem( IDC_COMBO_FIELDS ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_COMBO_OPERATOR ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_SQL ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MINX ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MINY ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MAXX ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MAXY ) )->EnableWindow( false );
		}
		break;
	case 2:		//范围查询
		{	
			( (CWnd* )GetDlgItem( IDC_COMBO_FIELDS ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_COMBO_OPERATOR ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_SQL ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_BUFFER ) )->EnableWindow( false );
		}
		break;
	case 3:		//范围复合查询
		{
			( (CWnd* )GetDlgItem( IDC_EDIT_BUFFER ) )->EnableWindow( false );
		}
		break;
	case 4:		//缓冲复合查询 
		{
			( (CWnd* )GetDlgItem( IDC_EDIT_MINX ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MINY ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MAXX ) )->EnableWindow( false );
			( (CWnd* )GetDlgItem( IDC_EDIT_MAXY ) )->EnableWindow( false );
		}
		break;
	}
}

void CDlgQuery::OnClickListLayers(NMHDR* pNMHDR, LRESULT* pResult) 
{//响应点击图层列表框事件
	UpdateData( TRUE );
	//添加所选图层的字段信息
	m_cmbFields.ResetContent();
	POSITION pos = m_lstLayers.GetFirstSelectedItemPosition();
	int nItem = m_lstLayers.GetNextSelectedItem(pos);
	if (nItem != -1)
	{
		m_strLayerName = m_lstLayers.GetItemText( nItem, 0);
	}
	if ( m_pMapWnd )
	{//获取图层
		CSeLayer *pLayer = m_pMapWnd->GetLayer( m_strLayerName );
		if ( pLayer )
		{
			CSeDatasetVector *pDataset = (CSeDatasetVector *)pLayer->GetDataset();
			if( pDataset )
			{
				CSeFieldInfo FieldInfo;
				long nFieldCount = pDataset->GetFieldCount();
				for ( int i=0; i<nFieldCount; i++ )
				{//获取字段信息
					if ( pDataset->GetFieldInfo( i, FieldInfo ) )
					{//将字段名填入组合框中
						m_cmbFields.InsertString( i, FieldInfo.m_strName );
					}
				}
			}
		}
	}
	UpdateData( FALSE );
	*pResult = 0;
}

void CDlgQuery::OnSelchangeComboFields() 
{//当选择字段名时,SQL查询语句+字段名
	UpdateData( TRUE );
	CString strField;
	//获取选择的字段名
	int nItem = m_cmbFields.GetCurSel();
	m_cmbFields.GetLBText( nItem, strField );
	//SQL查询语句+字段名
	m_strSQL += strField + _T(" ");
	UpdateData( FALSE );	
}

void CDlgQuery::OnSelchangeComboOperator() 
{//当选择操作符时,SQL语句+操作符
	UpdateData( TRUE );
	CString strOperator;
	//获取选择的操作符
	int nItem = m_cmbOperators.GetCurSel();
	m_cmbOperators.GetLBText( nItem, strOperator );
	//SQL语句+操作符
	m_strSQL += strOperator + _T(" ");
	UpdateData( FALSE );	
}

void CDlgQuery::OnOK() 
{//根据查询模式开始查询
	UpdateData( TRUE );
	if ( m_pMapWnd )
	{//获取与图层相对应的数据集
		CSeLayer *pLayer = m_pMapWnd->GetLayer( m_strLayerName );
		if ( pLayer )
		{
			CSeDatasetVector *pDataset = (CSeDatasetVector *)pLayer->GetDataset();
			if( pDataset )
			{
				CSeRect2D rcBound;
				//根据查询模式开始查询
				switch( m_nQueryMode ) 
				{
				case 0://SQL查询
					{
						m_pQueryRecord = pDataset->QueryByGeneral( m_strSQL );
					}
					break;
				case 1://对象缓冲查询
					{	//获取地图中选中的对象
						CSeRecordset *pRecordsetSelection = m_pMapWnd->GetSelection()->ToRecordset( false );
						CSeGeometry *pGeometry = NULL;
						if( pRecordsetSelection )
						{
							if( pRecordsetSelection->MoveFirst() )
							{
								while( ! pRecordsetSelection->IsEOF() )
								{
									if( pRecordsetSelection->GetGeometry( pGeometry ) )
									{
										if( pGeometry )
										{
											break;
										}
									}
									pRecordsetSelection->MoveNext();
								}
							}
							//释放选择集转换成的记录集
							pRecordsetSelection->GetDataset()->ReleaseRecordset( pRecordsetSelection );
						}
						//如果有选中的对象,则开始对象缓冲查询
						if( pGeometry )
						{
							m_pQueryRecord = pDataset->QueryByDistance( pGeometry, m_dDistance );
							//删除对象
							delete pGeometry;
							pGeometry = NULL;
						}
					}
					break;
					case 2://矩形区域查询
					{
						//获取bound,CSeOperator::RoundLong是四舍五入方法
						rcBound.bottom	= CSeOperator::RoundLong( m_dMinY );
						rcBound.top		= CSeOperator::RoundLong( m_dMaxY );
						rcBound.left	= CSeOperator::RoundLong( m_dMinX );
						rcBound.right	= CSeOperator::RoundLong( m_dMaxX );
						//开始区域查询
						m_pQueryRecord = pDataset->QueryByBound( rcBound );
					}
					break;
					case 3://范围+SQL复合查询
					{
						//获取bound,CSeOperator::RoundLong是四舍五入方法
						rcBound.bottom	= CSeOperator::RoundLong( m_dMinY );
						rcBound.top		= CSeOperator::RoundLong( m_dMaxY );
						rcBound.left	= CSeOperator::RoundLong( m_dMinX );
						rcBound.right	= CSeOperator::RoundLong( m_dMaxX );
						//获取SQL语句
						CString strFilter( m_strSQL );
						strFilter.TrimLeft();
						strFilter.TrimRight();
						if( strFilter.GetLength() > 0 )
						{//开始复合查询
							m_pQueryRecord = pDataset->QueryByCompound( rcBound, strFilter );					
						}
					}
					break;
				case 4://对象缓冲+SQL复合查询
					{
						//获取选中的对象
						CSeRecordset *pRecordsetSelection = m_pMapWnd->GetSelection()->ToRecordset( false );
						CSeGeometry *pGeometry = NULL;
						if( pRecordsetSelection )
						{
							if( pRecordsetSelection->MoveFirst() )
							{
								while( ! pRecordsetSelection->IsEOF() )
								{
									if( pRecordsetSelection->GetGeometry( pGeometry ) )
									{
										if( pGeometry )
										{
											break;
										}
									}
									pRecordsetSelection->MoveNext();
								}
							}
							//释放选择集转换的记录集
							pRecordsetSelection->GetDataset()->ReleaseRecordset( pRecordsetSelection );
						}
						//如果有选中的对象,则开始
						if( pGeometry )
						{
							//获取SQL语句
							CString strFilter( m_strSQL );
							strFilter.TrimLeft();
							strFilter.TrimRight();
							if( strFilter.GetLength() > 0 )
							{//开始复合查询
								m_pQueryRecord = pDataset->QueryByCompound(  pGeometry, m_dDistance, strFilter );
							}	
							//删除对象
							delete pGeometry;
							pGeometry = NULL;
						}
					}
					break;
				}
				//如果查询的结果不为空
				if ( m_pQueryRecord )
				{
					long nCount = m_pQueryRecord->GetCount();
					if ( nCount > 0 )//查询到对象...
					{
						//弹出查询到的记录个数消息框
						CString strMsg;
						strMsg.Format( _T("共查询出%d个记录,请用工具条按钮查看"), nCount);
						::AfxMessageBox( strMsg, MB_OK );
						//清空选择集
						m_pMapWnd->GetSelection()->ReleaseAll();
						m_pMapWnd->GetSelection()->m_pDataset = pDataset;
						//将所查询到的对象都加入到选择集中突出显示
						if( m_pQueryRecord->MoveFirst() )
						{
							long nID = 0;
							while( !m_pQueryRecord->IsEOF() )
							{
								nID = m_pQueryRecord->GetID();//获取对象ID
								if( nID >= 0 )
								{//将对象ID加入到选择集中
									m_pMapWnd->GetSelection()->Add( nID );
								}
								m_pQueryRecord->MoveNext();
							}
						}
						//显示查看记录工具条
						CMainFrame *pFrame=(CMainFrame*)AfxGetMainWnd();			 
						pFrame->m_wndRecordBar.ShowWindow(SW_SHOW);
						pFrame->RecalcLayout();		
					}
					else//没有查询到对象,弹出提示消息框...
					{
						CString strMsg;
						strMsg = _T ("没有查到符合条件的记录,请重新查询!");
						::AfxMessageBox( strMsg, MB_OK ); 
					}
				}
			}
		}
	}
	CDialog::OnOK();
}

void CDlgQuery::OnCancel() 
{//取消查询
	CDialog::OnCancel();
}


⌨️ 快捷键说明

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