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

📄 infotooldlg.cpp

📁 mapx嵌入式插件
💻 CPP
字号:
// InfoToolDlg.cpp : implementation file
//

#include "stdafx.h"
#include "resource.h"
#include "InfoToolDlg.h"


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

/////////////////////////////////////////////////////////////////////////////
// CInfoToolDlg dialog


CInfoToolDlg::CInfoToolDlg(CMapXLayers layers, double x, double y, CWnd* pParent /*=NULL*/)
	: CDialog(CInfoToolDlg::IDD, pParent), m_layers(layers), m_x(x), m_y(y)
{
	//{{AFX_DATA_INIT(CInfoToolDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CInfoToolDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CInfoToolDlg)
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CInfoToolDlg, CDialog)
	//{{AFX_MSG_MAP(CInfoToolDlg)
	ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE1, OnBeginlabeleditTree1)
	ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE1, OnEndlabeleditTree1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInfoToolDlg message handlers

BOOL CInfoToolDlg::OnInitDialog() 
{
	CWaitCursor wait;

	CDialog::OnInitDialog();
	
	CTreeCtrl	*m_pTree = (CTreeCtrl	*)GetDlgItem(IDC_TREE1);

	CRect rctSel;
	bool bFoundALayer=false;
	bool bFoundAnObject=false;
	//rctSel.left = m_pt.x;
	//rctSel.right = m_pt.x;
	//rctSel.top = m_pt.y;
	//rctSel.bottom = m_pt.y;


	CMapXPoint pt;		//This point will be the center of our search
	CMapXFeatures fs;	//This will hold all of the features within our search
	CMapXFeature f;		//This will hold the customer feature we are currently looking at
	CMapXLayer l;
	pt.CreateDispatch(pt.GetClsid());	//Creates a dispatch for the point
	pt.Set(m_x, m_y);						//Sets the coordinates into the point

	int n = m_layers.GetCount();

	for (int i=1; i <= n; i++) {
		TRY {
			l = m_layers.Item(i);
			fs = l.SearchAtPoint(pt);
			bFoundALayer=true;
			int nFound = fs.GetCount();
			if(nFound == 0)
				continue; // do nothing if the user didn't click on a customer

			bFoundAnObject=true;
			CString strName = l.GetName();
			HTREEITEM hItemTable = m_pTree->InsertItem(strName, 0, 0);
			m_pTree->SetItemData(hItemTable, (DWORD)0);

			for (int j=1; j <= nFound; j++) {
				f = fs.Item(1);
				strName = f.GetName();
				HTREEITEM hItemObj = m_pTree->InsertItem(strName, 0, 0, hItemTable);
				m_pTree->SetItemData(hItemObj, (DWORD)0);
				// for each dataset, get each rowvalues object and list each value
				for (int k=1; k<=l.GetDatasets().GetCount(); k++) {
					COleVariant varf;
					varf.vt = VT_DISPATCH;
					varf.pdispVal = f.m_lpDispatch;

					varf.pdispVal->AddRef();

					CMapXRowValues rvs = l.GetDatasets().Item(k).GetRowValues(varf);
					int nVals = rvs.GetCount();
					for (int x=1; x<=nVals;x++) {
						CMapXRowValue rv = rvs.Item(x);
						CItemData *pData = new CItemData();
						pData->m_nLayerIndex=i;
						pData->m_nDatasetIndex=k;
						pData->m_nFieldIndex=x;
						pData->m_strKey = f.GetFeatureKey();
						CMapXField fld = rv.GetField();
						pData->m_strLabel = fld.GetName();
						pData->m_strLabel+= _T(": ");
						CString str = pData->m_strLabel;
						COleVariant var(rv.GetValue());

						var.ChangeType(VT_BSTR);
						pData->m_strData = var.bstrVal;

						HTREEITEM hItemField = m_pTree->InsertItem(pData->m_strLabel+pData->m_strData, 0, 0, hItemObj);
						m_pTree->SetItemData(hItemField, (DWORD)pData);
					}

				}
				m_pTree->Expand(hItemObj, TVE_EXPAND);
			}
			m_pTree->Expand(hItemTable, TVE_EXPAND);
		}
		CATCH (COleDispatchException,e) {
			//e->Delete();
			continue;
		}
		AND_CATCH (COleException,e) {
			e->ReportError();
			//e->Delete();
			continue;
		}
		END_CATCH
	}
	

	if (!bFoundALayer) {
		m_pTree->InsertItem(_T("No Selectable Layers Found"), 0, 0);
		CDialog::EndDialog(IDCANCEL); // Tom made me do this
	}
	else if (!bFoundAnObject) {
		m_pTree->InsertItem(_T("No objects found in selectable layers"), 0, 0);
		CDialog::EndDialog(IDCANCEL);	// Tom made me do this
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CInfoToolDlg::OnOK() 
{
	CTreeCtrl	*m_pTree = (CTreeCtrl	*)GetDlgItem(IDC_TREE1);

	if (!UpdateData(TRUE)) {
		return;
	}
	
	m_pTree->DeleteAllItems();

	CDialog::EndDialog(IDOK);
}

void CInfoToolDlg::OnBeginlabeleditTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
	CTreeCtrl	*m_pTree = (CTreeCtrl	*)GetDlgItem(IDC_TREE1);

	*pResult = 0;

	if (!m_pTree) return;
	HTREEITEM ht = m_pTree->GetSelectedItem();
	if (ht == NULL) return;

	CItemData *pData = (CItemData *)m_pTree->GetItemData(ht);
	if (pData == NULL) return;

	pData->m_strOldData = pData->m_strData;

	CEdit *pEdit = m_pTree->GetEditControl();
	if (pEdit) {
		pEdit->SetWindowText(pData->m_strData);
		m_pTree->UpdateWindow();
	}
}

void CInfoToolDlg::OnEndlabeleditTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
	CTreeCtrl	*m_pTree = (CTreeCtrl	*)GetDlgItem(IDC_TREE1);

	*pResult = 0;

	if (!m_pTree) return;
	HTREEITEM ht = m_pTree->GetSelectedItem();
	if (ht == NULL) return;

	CItemData *pData = (CItemData *)m_pTree->GetItemData(ht);
	if (pData == NULL) return;

	// strip off field name
	CString str = pData->m_strLabel;

	CEdit *pEdit = m_pTree->GetEditControl();
	if (pEdit) {
		pEdit->GetWindowText(pData->m_strData);
	}

	if (!DoModify(pData)) {
		AfxMessageBox(_T("Update failed."), MB_OK | MB_ICONHAND);
		pData->m_strData = pData->m_strOldData;
	}

	str += pData->m_strData;
	m_pTree->SetItemText(ht, str);
}

bool CInfoToolDlg::DoModify(CItemData *pData)
{

	TRY {
		CMapXRowValues rvs = m_layers.Item(pData->m_nLayerIndex).GetDatasets().Item(pData->m_nDatasetIndex).GetRowValues(COleVariant(pData->m_strKey));
		CMapXRowValue rv = rvs.Item(pData->m_nFieldIndex);
		CMapXField fld = rv.GetField();

		CMapXRowValues rvsNew;
		rvsNew.CreateDispatch(rvsNew.GetClsid());

		rv.SetValue(COleVariant(pData->m_strData));
		rvsNew.Add(rv);

		m_layers.Item(pData->m_nLayerIndex).UpdateFeature(COleVariant(pData->m_strKey), COptionalVariant(), COleVariantDispatch(rvsNew));

	}
	CATCH (COleDispatchException,e) {
		e->ReportError();
		e->Delete();
		return false;
	}
	AND_CATCH (COleException,e) {
		e->ReportError();
		e->Delete();
		return false;
	}
	END_CATCH
	
	return true;
}

⌨️ 快捷键说明

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