📄 dlgquery.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 + -