📄 snpoiquery.cpp
字号:
// SNPOIQuery.cpp : implementation file
//
#include "stdafx.h"
#include "Navigator.h"
#include "SNPOIQuery.h"
#include "Base/UGString.h"
#include "NavigatorView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// SNPOIQuery dialog
SNPOIQuery::SNPOIQuery(CWnd* pParent /*=NULL*/)
: CDialog(SNPOIQuery::IDD, pParent)
{
//{{AFX_DATA_INIT(SNPOIQuery)
//}}AFX_DATA_INIT
m_pDatasource = NULL;
m_pMapWnd = NULL;
m_pNdfDataset = NULL;
m_pRes = NULL;
m_iDepth = 0;
m_strKey = "";
m_arPoint.RemoveAll();
m_pntPOI.x = 0;
m_pntPOI.y = 0;
m_queryDef.m_arKey.RemoveAll();
}
void SNPOIQuery::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(SNPOIQuery)
DDX_Control(pDX, IDD_LIST3, m_list);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(SNPOIQuery, CDialog)
//{{AFX_MSG_MAP(SNPOIQuery)
ON_NOTIFY(NM_CLICK, IDD_LIST3, OnClickList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// SNPOIQuery message handlers
void SNPOIQuery::SetDatasource( UGDataSource* pDatasource )
{
if (!pDatasource)
{
return;
}
m_pDatasource = pDatasource;
}
void SNPOIQuery::SetMapWnd( UGMapWnd* pMapWnd )
{
if (!pMapWnd)
{
return;
}
m_pMapWnd = pMapWnd;
}
BOOL SNPOIQuery::Execute(UGint iDepth)
{
UGString strText =("");
if (m_pNdfDataset !=NULL )
{
if (1 == iDepth)
{
// 向下一级检索
m_queryDef.m_arKey.Add(m_strKey);
m_iDepth++;
}
else if (-1 == iDepth )
{
// 回上一级检索
UGint iSize = m_queryDef.m_arKey.GetSize();
m_queryDef.m_arKey.RemoveAt(m_iDepth-1,1);
iSize = m_queryDef.m_arKey.GetSize();
m_iDepth--;
}
else
{
m_iDepth++;
}
if( m_pRes && m_pNdfDataset )
{
// 反复调用的话 不这么处理易导致内存泄露
m_pNdfDataset->ReleaseRecordset( m_pRes );
}
// 执行POI检索
m_pRes = m_pNdfDataset->Query(m_queryDef);
if ( m_pRes )
{
// 获取查询结果记录集数目
UGint nRecordCount=m_pRes->GetRecordCount();
UGString strKey = "";
UGPoint2D pntPOI;
UGint iColum = 0;
UGuchar* pData=NULL;
UGint iSize=0;
//在取记录集的时候一定要注意MoveFirst()
// 定位到记录集起始位置
m_pRes->MoveFirst();
UGStringW strWKey = "";
while ( !m_pRes->IsEOF() )
{
// 记录的第0个字段为POI点的名称
m_pRes->GetFieldValue( 0, strKey );
strWKey.FromString(strKey);
// 显示在列表控件上
m_list.InsertItem( iColum, strWKey.Cstr(), 0 );
if ( m_iDepth == 4)
{
// 点的x坐标
iSize = m_pRes->GetFieldValue(1, pData);
memcpy(&pntPOI.x, pData, iSize);
// 点的y坐标
iSize = m_pRes->GetFieldValue(2, pData);
memcpy(&pntPOI.y, pData, iSize);
m_arPoint.Add(pntPOI);
}
// 移动记录集指针
m_pRes->MoveNext();
iColum++;
}
}
else
{
return FALSE;
}
}
return FALSE;
}
BOOL SNPOIQuery::OnInitDialog()
{
m_iDepth = 0;
m_pntPOI.x = 0;
m_pntPOI.y = 0;
// 根据数据集名称(Index_Category)获取分类查询的数据集指针
m_pNdfDataset = (UGNdfDatasetIndex* )m_pDatasource->GetDataset("Index_Category");
// 定义查询类型
m_queryDef.m_nType = UGQueryDef::QueryType::Category;
m_queryDef.m_arKey.RemoveAll();
CDialog::OnInitDialog();
// 设置列表控件风格
m_list.SetExtendedStyle(LVS_REPORT|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
CRect rcClient;
m_list.GetClientRect(&rcClient);
int nWidth = rcClient.Width();
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0;
lvc.pszText = TEXT("Category Query");
lvc.cx = nWidth;
lvc.fmt = LVCFMT_LEFT;
m_list.InsertColumn(0,&lvc);
// 执行第一级检索
Execute(0);
return TRUE; // return TRUE unless you set the focus to a control
}
UGPoint2D SNPOIQuery::GetDrawPoint()
{
return m_pntPOI;
}
void SNPOIQuery::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
// 获取点击项的名称
POSITION pos = m_list.GetFirstSelectedItemPosition();
int iItem = m_list.GetNextSelectedItem(pos);
if ( iItem == -1 )
{
return ;
}
TCHAR szName[MAX_PATH];
memset(szName, 0, MAX_PATH);
m_list.GetItemText(iItem, 0, szName, MAX_PATH);
// 保存关键字
UGStringW strWKey(szName);
m_strKey = strWKey.ToString();
if ( m_iDepth!= 4 )
{
m_list.DeleteAllItems();
// 向下一级检索
Execute(1);
}
else
{
// 获取检索结果目标点并设置为地图中心点
m_pntPOI = m_arPoint.GetAt( iItem );
m_pMapWnd->SetCenter( m_pntPOI );
m_pMapWnd->SetScale(1/1000);
m_pMapWnd->Refresh();
//关闭窗口
CDialog::OnOK();
DestroyWindow();
}
}
BOOL SNPOIQuery::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
if (m_pRes)
{
m_pNdfDataset->ReleaseRecordset(m_pRes);
}
m_arPoint.RemoveAll();
return CDialog::DestroyWindow();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -