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

📄 snpoiquery.cpp

📁 基于超图sne开发的一个详细的例子。提供查询
💻 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 + -