📄 rstreeview.cpp
字号:
CRSFeature* pFeature;
if (!m_pWorkUnit->m_pFeatureMap->Lookup(UserID, pFeature))
return 0l;
//找到相应层的相应编码类
HTREEITEM hFeature = FindFeatureItemInLayer(UserID, LayerName);
if (hFeature != NULL)
m_pTreeCtrl->DeleteItem(hFeature);
for (int i = 0 ; i < m_Layers.GetSize() ; i ++)
{
if (!LayerName.CompareNoCase(m_Layers.GetAt(i)->Name))
{
for (int j = 0 ; j < m_Layers.GetAt(i)->Features.GetSize() ; j ++)
{
if (!UserID.CompareNoCase(m_Layers.GetAt(i)->Features.GetAt(j)->UserID))
{
delete m_Layers.GetAt(i)->Features.GetAt(j);
m_Layers.GetAt(i)->Features.RemoveAt(j);
break;
}
}
break;
}
}
return 0l;
}
//当新的影像层加入时
//wParam--层名
//lParam--影像定位文件名
LRESULT CRSTreeView::OnNewImageLayerAdded(WPARAM wParam, LPARAM lParam)
{
if (wParam == 0 )//|| lParam == 0)
return 0l;
CString LayerName = (LPCTSTR)wParam;
if (LayerName.IsEmpty())
return 0l;
CString OrientFile = (LPCTSTR)lParam;
if (OrientFile.IsEmpty())
return 0l;
//插入到树视图
TVINSERTSTRUCT tvis;
tvis.hParent = m_pTreeCtrl->GetRootItem();
tvis.hInsertAfter = TVI_LAST;
tvis.item.pszText = (LPTSTR)((LPCTSTR)LayerName);
tvis.item.iImage = IMAGE_LAYER_EDITABLE;
tvis.item.iSelectedImage = IMAGE_LAYER_EDITABLE;
tvis.item.stateMask = TVIS_STATEIMAGEMASK;
tvis.item.state = INDEXTOSTATEIMAGEMASK( IMAGE_LAYER_VISIBLE);
tvis.item.mask = TVIF_IMAGE | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_STATE;
HTREEITEM hItem = m_pTreeCtrl->InsertItem(&tvis);
m_pTreeCtrl->SetItemState(hItem, TVIS_SELECTED, TVIF_STATE);
m_pTreeCtrl->Expand(m_pTreeCtrl->GetRootItem(), TVE_EXPAND);
RedrawWindow();
//填充层数据结构
TREELAYER* pTreeLayer = new TREELAYER;
pTreeLayer->Name = LayerName;
pTreeLayer->Status = RS_VISIBLE | RS_EDITABLE;
pTreeLayer->DataSource = IMAGE;
pTreeLayer->ImageOrientFile = OrientFile;
m_Layers.Add(pTreeLayer);
return 0l;
}
//当新的层加入时
//wParam--层名
LRESULT CRSTreeView::OnNewLayerAdded(WPARAM wParam, LPARAM lParam)
{
if (wParam == 0)
return 0l;
CString LayerName = (LPCTSTR)wParam;
if (LayerName.IsEmpty())
return 0l;
//插入到树视图
TVINSERTSTRUCT tvis;
tvis.hParent = m_pTreeCtrl->GetRootItem();
tvis.hInsertAfter = TVI_FIRST;
tvis.item.pszText = (LPTSTR)((LPCTSTR)LayerName);
tvis.item.iImage = IMAGE_LAYER_EDITABLE;
tvis.item.iSelectedImage = IMAGE_LAYER_EDITABLE;
tvis.item.stateMask = TVIS_STATEIMAGEMASK;
tvis.item.state = INDEXTOSTATEIMAGEMASK( IMAGE_LAYER_VISIBLE);
tvis.item.mask = TVIF_IMAGE | TVIF_TEXT | TVIF_SELECTEDIMAGE | TVIF_STATE;
HTREEITEM hItem = m_pTreeCtrl->InsertItem(&tvis);
m_pTreeCtrl->SetItemState(hItem, TVIS_SELECTED, TVIF_STATE);
m_pTreeCtrl->Expand(m_pTreeCtrl->GetRootItem(), TVE_EXPAND);
RedrawWindow();
//填充层数据结构
TREELAYER* pTreeLayer = new TREELAYER;
pTreeLayer->Name = LayerName;
pTreeLayer->Status = RS_VISIBLE | RS_EDITABLE;
pTreeLayer->DataSource = GEOMETRY;
pTreeLayer->ImageOrientFile = _T("");
m_Layers.InsertAt(0, pTreeLayer);
return 0l;
}
//得到某一层节点的层信息
//hItem--指定节点句柄
//返回--相应的节点数据指针,如果没有则返回NULL
TREELAYER* CRSTreeView::GetLayerItem(HTREEITEM hItem)
{
CString name;
if (!IsLayerNode(hItem, name))
return NULL;
//轮循每个层数据
for (int i = 0 ; i < m_Layers.GetSize() ; i ++)
{
if (!name.CompareNoCase(m_Layers.GetAt(i)->Name))
return m_Layers.GetAt(i);
}
return NULL;
}
//得到某一编码类节点的编码类信息
//hItem--指定节点句柄
//返回--相应的节点数据指针,如果没有则返回NULL
TREEFEATURE* CRSTreeView::GetFeatureItem(HTREEITEM hItem)
{
CString name;
if (!IsFeatureNode(hItem, name))
return NULL;
//首先判断其父节点是否层节点
CString tmp;
HTREEITEM hParent = m_pTreeCtrl->GetParentItem(hItem);
if (!IsLayerNode(hParent, tmp))
return NULL;
//然后得到层信息
TREELAYER* pLayer = GetLayerItem(hParent);
if (pLayer == NULL)
return NULL;
if (pLayer->DataSource != GEOMETRY)
return NULL;
//轮循该层每个编码类数据
for (int i = 0 ; i < pLayer->Features.GetSize() ; i ++)
{
if (!name.CompareNoCase(pLayer->Features.GetAt(i)->UserID))
return pLayer->Features.GetAt(i);
}
return NULL;
}
//根据层名找到对应节点
//LayerName--层名
//返回--对应的节点句柄,不存在则返回空
HTREEITEM CRSTreeView::FindLayerItem(CString LayerName)
{
HTREEITEM hItem = NULL;
//轮循每个层节点
HTREEITEM hRoot = m_pTreeCtrl->GetRootItem();
if (m_pTreeCtrl->ItemHasChildren(hRoot))
{
hItem = m_pTreeCtrl->GetChildItem(hRoot);
while (hItem != NULL)
{
if (!m_pTreeCtrl->GetItemText(hItem).Compare(LayerName))
return hItem;
hItem = m_pTreeCtrl->GetNextSiblingItem(hItem);
}
}
return NULL;
}
//根据编码类名和层名找到某一层对应的编码类节点
//UserID--编码类ID
//LayerName--层名
//返回--对应的编码类节点句柄,不存在则返回NULL
HTREEITEM CRSTreeView::FindFeatureItemInLayer(CString UserID, CString LayerName)
{
//首先找到层节点
HTREEITEM hItem = NULL;
HTREEITEM hLayer = FindLayerItem(LayerName);
if (hLayer == NULL)
return NULL;
//然后轮循层节点
if (m_pTreeCtrl->ItemHasChildren(hLayer))
{
hItem = m_pTreeCtrl->GetChildItem(hLayer);
while (hItem != NULL)
{
if (!m_pTreeCtrl->GetItemText(hItem).Compare(UserID))
return hItem;
hItem = m_pTreeCtrl->GetNextSiblingItem(hItem);
}
}
return NULL;
}
//层属性
void CRSTreeView::OnLayerProperty()
{
CLayerPropertyDlg dlg;
dlg.m_pTreeView = this;
dlg.m_pWorkUnit = m_pWorkUnit;
dlg.m_LayerName = m_pTreeCtrl->GetItemText(m_hHitItem); //m_tmpLayerName;
dlg.DoModal();
}
//当当前编码类和层改变时,改变主工具条编码类组合框的相应内容
void CRSTreeView::ChangeSelect(int type, CString value)
{
if (value.IsEmpty())
return;
HTREEITEM hItem = NULL;
if (type == 0)
{
//当前层改变时
hItem = FindLayerItem(value);
m_pMainView->SendMessage(WM_RS_CURRENT_LAYER_CHANGED, (WPARAM)(LPCTSTR(value)), 0);
}
else if (type == 1)
{
//当前编码类改变时
HTREEITEM tmp;
for (int i = 0 ; i < m_Layers.GetSize() ; i ++)
{
tmp = NULL;
tmp = FindLayerItem(m_Layers.GetAt(i)->Name);
if (tmp != NULL)
if ((hItem = FindFeatureItemInLayer(value, m_Layers.GetAt(i)->Name)) != NULL)
{
m_pMainView->SendMessage(WM_RS_CURRENT_FEATURE_CHANGED, (WPARAM)(LPCTSTR(value)), 0);
break;
}
}
}
if (hItem != NULL)
m_pTreeCtrl->SelectItem(hItem);
}
void CRSTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItemOld = pNMTreeView->itemOld.hItem;
HTREEITEM hItemNew = pNMTreeView->itemNew.hItem;
//当前编码类和层改变时,都向主视图发送消息
CString UserID, LayerName;
if (IsFeatureNode(hItemNew, UserID))
{
m_pMainView->SendMessage(WM_RS_CURRENT_FEATURE_CHANGED, (WPARAM)(LPCTSTR(UserID)), 0);
}
else if (IsLayerNode(hItemNew, LayerName))
{
m_pMainView->SendMessage(WM_RS_CURRENT_LAYER_CHANGED, (WPARAM)(LPCTSTR(LayerName)), 0);
}
*pResult = 0;
}
void CRSTreeView::OnLButtonDown(UINT nFlags, CPoint point)
{
//根据鼠标所在地点,改变层或者编码类的显示和编辑状态
UINT Flags;
HTREEITEM hItem = m_pTreeCtrl->HitTest(point, &Flags);
if(hItem != NULL && (Flags & TVHT_ONITEMSTATEICON))
{
//改变显示状态
UINT nImage = (m_pTreeCtrl->GetItemState(hItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) >> 12;
if (nImage == IMAGE_LAYER_VISIBLE || nImage == IMAGE_LAYER_UNVISIBLE)
{
if (nImage == IMAGE_LAYER_VISIBLE)
EnableLayer(hItem, VISIBLE, FALSE);
else
EnableLayer(hItem, VISIBLE, TRUE);
}
else if (nImage == IMAGE_FEATURE_VISIBLE || nImage == IMAGE_FEATURE_UNVISIBLE)
{
if (nImage == IMAGE_FEATURE_VISIBLE)
EnableFeature(hItem, VISIBLE, FALSE);
else
EnableFeature(hItem, VISIBLE, TRUE);
}
((CRSView*)m_pMainView)->Update();
}
else if(hItem != NULL && (Flags & TVHT_ONITEMICON))
{
//改变编辑状态
int nImage, nSelectedImage;
m_pTreeCtrl->GetItemImage(hItem, nImage, nSelectedImage);
if (nImage == IMAGE_LAYER_EDITABLE || nImage == IMAGE_LAYER_UNEDITABLE)
{
if (nImage == IMAGE_LAYER_EDITABLE)
EnableLayer(hItem, EDITABLE, FALSE);
else
EnableLayer(hItem, EDITABLE, TRUE);
}
else if (nImage == IMAGE_FEATURE_EDITABLE || nImage == IMAGE_FEATURE_UNEDITABLE)
{
if (nImage == IMAGE_FEATURE_EDITABLE)
EnableFeature(hItem, EDITABLE, FALSE);
else
EnableFeature(hItem, EDITABLE, TRUE);
}
((CRSView*)m_pMainView)->Update();
}
//否则则改变当前编码类或层
else if(hItem != NULL && (Flags & TVHT_ONITEMLABEL))
{
CString value;
if (IsLayerNode(hItem, value))
ChangeSelect(0, value);
else if (IsFeatureNode(hItem, value))
ChangeSelect(1, value);
}
CTreeView::OnLButtonDown(nFlags, point);
}
//转换指定编码类节点的状态
//hItem--许改变状态的节点
//nFlag--所需改变得属性(VISIBLE:显示属性 EDITABLE:编辑属性)
//bTrue--相应属性ENABLE 或者DISABLE
void CRSTreeView::EnableFeature(HTREEITEM hItem, UINT nFlag, BOOL bTrue)
{
switch (nFlag)
{
case VISIBLE :
{
//改变节点图象
if (bTrue)
m_pTreeCtrl->SetItemState(hItem, INDEXTOSTATEIMAGEMASK(IMAGE_FEATURE_VISIBLE), TVIS_STATEIMAGEMASK);
else
m_pTreeCtrl->SetItemState(hItem, INDEXTOSTATEIMAGEMASK(IMAGE_FEATURE_UNVISIBLE), TVIS_STATEIMAGEMASK);
CString UserID = m_pTreeCtrl->GetItemText(hItem);
TREEFEATURE* pFeature = GetFeatureItem(hItem);
if (pFeature != NULL)
{
if (bTrue)
pFeature->Status = (pFeature->Status & ~RS_VISIBLE_FLAG) | RS_VISIBLE;
else
pFeature->Status = (pFeature->Status & ~RS_VISIBLE_FLAG) | RS_UNVISIBLE;
}
//发送编码类可见消息
m_pMainView->SendMessage(WM_RS_FEATURE_VISIBLE, (WPARAM)(LPCTSTR(UserID)), bTrue);
}
break;
case EDITABLE :
{
//改变节点图象
if (bTrue)
m_pTreeCtrl->SetItemImage(hItem, IMAGE_FEATURE_EDITABLE, IMAGE_FEATURE_EDITABLE);
else
m_pTreeCtrl->SetItemImage(hItem, IMAGE_FEATURE_UNEDITABLE, IMAGE_FEATURE_UNEDITABLE);
CString UserID = m_pTreeCtrl->GetItemText(hItem);
TREEFEATURE* pFeature = GetFeatureItem(hItem);
if (pFeature != NULL)
{
if (bTrue)
pFeature->Status = (pFeature->Status & ~RS_EDITABLE_FLAG) | RS_EDITABLE;
else
pFeature->Status = (pFeature->Status & ~RS_VISIBLE_FLAG) | RS_EDITABLE;
}
//发送层可见消息
m_pMainView->SendMessage(WM_RS_FEATURE_EDITABLE, (WPARAM)(LPCTSTR(UserID)), bTrue);
}
break;
}
}
//转换指定层节点的状态
//hItem--许改变状态的节点
//nFlag--所需改变得属性(VISIBLE:显示属性 EDITABLE:编辑属性)
//bTrue--相应属性ENABLE 或者DISABLE
void CRSTreeView::EnableLayer(HTREEITEM hItem, UINT nFlag, BOOL bTrue)
{
switch (nFlag)
{
case VISIBLE :
{
//改变节点图象
if (bTrue)
m_pTreeCtrl->SetItemState(hItem, INDEXTOSTATEIMAGEMASK(IMAGE_LAYER_VISIBLE), TVIS_STATEIMAGEMASK);
else
m_pTreeCtrl->SetItemState(hItem, INDEXTOSTATEIMAGEMASK(IMAGE_LAYER_UNVISIBLE), TVIS_STATEIMAGEMASK);
TREELAYER* pLayer = GetLayerItem(hItem);
if (pLayer != NULL)
{
if (bTrue)
pLayer->Status = (pLayer->Status & ~RS_VISIBLE_FLAG) | RS_VISIBLE;
else
pLayer->Status = (pLayer->Status & ~RS_VISIBLE_FLAG) | RS_UNVISIBLE;
}
}
break;
case EDITABLE :
{
//改变节点图象
if (bTrue)
m_pTreeCtrl->SetItemImage(hItem, IMAGE_LAYER_EDITABLE, IMAGE_LAYER_EDITABLE);
else
m_pTreeCtrl->SetItemImage(hItem, IMAGE_LAYER_UNEDITABLE, IMAGE_LAYER_UNEDITABLE);
TREELAYER* pLayer = GetLayerItem(hItem);
if (pLayer != NULL)
{
if (bTrue)
pLayer->Status = (pLayer->Status & ~RS_EDITABLE_FLAG) | RS_EDITABLE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -