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