📄 rstreeview.cpp
字号:
// RSTreeView.cpp : implementation file
//
#include "stdafx.h"
//#include "RS.h"
//#include "RSFeature.h"
//#include "RSWorkUnit.h"
//#include "RSDoc.h"
//#include "RSView.h"
#include "RSTreeView.h"
//#include "LayerPropertyDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define VISIBLE 0
#define EDITABLE 1
#define IMAGE_ROOT 0
#define IMAGE_LAYER_VISIBLE 1
#define IMAGE_LAYER_UNVISIBLE 2
#define IMAGE_LAYER_EDITABLE 7
#define IMAGE_LAYER_UNEDITABLE 8
#define IMAGE_FEATURE_VISIBLE 3
#define IMAGE_FEATURE_UNVISIBLE 4
#define IMAGE_FEATURE_EDITABLE 5
#define IMAGE_FEATURE_UNEDITABLE 6
/////////////////////////////////////////////////////////////////////////////
// CRSTreeView
IMPLEMENT_DYNCREATE(CRSTreeView, CTreeView)
CRSTreeView::CRSTreeView()
{
m_pMainView = NULL;
m_pWorkUnit = NULL;
m_pTreeCtrl = NULL;
m_pImageList = NULL;
m_pStateList = NULL;
m_hHitItem = NULL;
m_pDragImage = NULL;
m_bLDragging = FALSE;
m_hitemDrag = NULL;
m_hitemDrop = NULL;
}
CRSTreeView::~CRSTreeView()
{
}
BEGIN_MESSAGE_MAP(CRSTreeView, CTreeView)
//{{AFX_MSG_MAP(CRSTreeView)
ON_WM_CONTEXTMENU()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_COMMAND(ID_ADD_NEW_LAYER, OnAddNewLayer)
ON_COMMAND(ID_LAYER_PROPERTY, OnLayerProperty)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_WM_LBUTTONDOWN()
ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_RS_NEWLAYER_ADDED, OnNewLayerAdded)
ON_MESSAGE(WM_RS_NEWIMAGELAYER_ADDED, OnNewImageLayerAdded)
ON_MESSAGE(WM_RS_FEATURE_REMOVEDFROM_LAYER, OnFeatureRemovedFromLayer)
ON_MESSAGE(WM_RS_FEATURE_ADDTO_LAYER, OnFeatureAddedToLayer)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRSTreeView drawing
void CRSTreeView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CRSTreeView diagnostics
#ifdef _DEBUG
void CRSTreeView::AssertValid() const
{
CTreeView::AssertValid();
}
void CRSTreeView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRSTreeView message handlers
CRSDoc* CRSTreeView::GetDocument()
{
return (CRSDoc*)m_pMainView->GetDocument();
}
BOOL CRSTreeView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS;
return CTreeView::PreCreateWindow(cs);
}
void CRSTreeView::OnContextMenu(CWnd* pWnd, CPoint point)
{
ScreenToClient(&point);
//根据鼠标所处位置弹出相应菜单
HTREEITEM hItem;
if (IsFeatureNode(point, hItem))
{
m_hHitItem = hItem;
// m_tmpFeatureName = m_pTreeCtrl->GetItemText(hItem);
}
else if (IsLayerNode(point, hItem))
{
m_hHitItem = hItem;
// m_tmpLayerName = m_pTreeCtrl->GetItemText(hItem);
CMenu menu;
VERIFY(menu.LoadMenu(IDR_POP_TREECTRL_LAYER));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
ClientToScreen(&point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
else if (IsRootNode(point))
{
CMenu menu;
VERIFY(menu.LoadMenu(IDR_POP_TREECTRL_LAYER));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
ClientToScreen(&point);
pPopup->EnableMenuItem(ID_LAYER_PROPERTY, MF_GRAYED);
pPopup->EnableMenuItem(ID_DELETE_LAYER, MF_GRAYED);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
//RedrawWindow();
return;
}
//根据指定坐标的得到相应节点的信息
// point--指定的坐标
// hItem--返回的树节点
// type--节点所属的类别(层/编码类)
// 返回--TRUE:找到有关节点 FALSE:未找到有关节点
BOOL CRSTreeView::GetCurItem(HTREEITEM& hItem, TYPE& type, CPoint point)
{
UINT Flags;
hItem = m_pTreeCtrl->HitTest(point, &Flags);
if (hItem == NULL)
return FALSE;
//根据节点图象判断属于何种类型
int nImage, nSelImage;
m_pTreeCtrl->GetItemImage(hItem, nImage, nSelImage);
if (nImage == IMAGE_ROOT)
{
type = ROOT;
return TRUE;
}
else if (nImage == IMAGE_LAYER_EDITABLE || nImage == IMAGE_LAYER_UNEDITABLE)
{
type = LAYER;
return TRUE;
}
else if (nImage == IMAGE_FEATURE_EDITABLE || nImage == IMAGE_FEATURE_UNEDITABLE)
{
type = FEATURE;
return TRUE;
}
return FALSE;
}
//指定坐标的节点是否根节点
BOOL CRSTreeView::IsRootNode(CPoint point)
{
HTREEITEM hItem;
TYPE type;
if (!GetCurItem(hItem, type, point))
return FALSE;
if (type == ROOT)
return TRUE;
return FALSE;
}
//指定坐标的节点是否编码类节点
BOOL CRSTreeView::IsFeatureNode(HTREEITEM hItem, CString& UserID)
{
int nImage, nSelImage;
m_pTreeCtrl->GetItemImage(hItem, nImage, nSelImage);
if (nImage == IMAGE_FEATURE_EDITABLE || nImage == IMAGE_FEATURE_UNEDITABLE)
{
UserID = m_pTreeCtrl->GetItemText(hItem);
return TRUE;
}
return FALSE;
}
//指定坐标的节点是否层节点
BOOL CRSTreeView::IsLayerNode(HTREEITEM hItem, CString& LayerName)
{
int nImage, nSelImage;
m_pTreeCtrl->GetItemImage(hItem, nImage, nSelImage);
if (nImage == IMAGE_LAYER_EDITABLE || nImage == IMAGE_LAYER_UNEDITABLE)
{
LayerName = m_pTreeCtrl->GetItemText(hItem);
return TRUE;
}
return FALSE;
}
//指定节点是否层节点
BOOL CRSTreeView::IsFeatureNode(CPoint point, HTREEITEM& hItem)
{
TYPE type;
if (!GetCurItem(hItem, type, point))
return FALSE;
if (type == FEATURE)
return TRUE;
return FALSE;
}
//指定节点是否编码类节点
BOOL CRSTreeView::IsLayerNode(CPoint point, HTREEITEM& hItem)
{
TYPE type;
if (!GetCurItem(hItem, type, point))
return FALSE;
if (type == LAYER)
return TRUE;
return FALSE;
}
//增加新层
//LayerName--层名
//返回--TRUE:成功 FALSE:失败
BOOL CRSTreeView::AddANewLayer(CString LayerName)
{
LAYERITEM* pTmpLayer;
if (m_pWorkUnit->m_pLayerMap->Lookup(LayerName, pTmpLayer))
return FALSE;
LAYERITEM* pLayer = new LAYERITEM;
CFeatureArray* pFeatureArray = new CFeatureArray;
pLayer->LayerName = LayerName;
pLayer->AttrTableName = _T("");
pLayer->bAttriTable = FALSE;
pLayer->LayerStatus = 0;
pLayer->pFeatureArray = pFeatureArray;
if (!m_pWorkUnit->AddALayer(LayerName, pLayer))
{
delete pLayer;
delete pFeatureArray;
return FALSE;
}
return TRUE;
}
//增加编码类到层
BOOL CRSTreeView::AddAFeatureToLayer(CString UserID, CString LayerName)
{
return TRUE;
}
int CRSTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
m_pTreeCtrl = &GetTreeCtrl();
m_pImageList = new CImageList;
m_pImageList->Create(IDB_WORKUNIT_IMAGELIST, 16, 5, RGB(255, 255,255));
m_pStateList = new CImageList;
m_pStateList->Create(IDB_WORKUNIT_IMAGELIST, 16, 5, RGB(255, 255,255));
return 0;
}
void CRSTreeView::OnDestroy()
{
CTreeView::OnDestroy();
ClearLayerTree();
delete m_pImageList;
delete m_pStateList;
}
void CRSTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
}
//初始化树视图
void CRSTreeView::Initialize(CRSWorkUnit* pWorkUnit)
{
ASSERT( pWorkUnit != NULL );
m_pWorkUnit = pWorkUnit;
m_pTreeCtrl->SetImageList(m_pImageList, TVSIL_NORMAL);
m_pTreeCtrl->SetImageList(m_pStateList, TVSIL_STATE);
HTREEITEM hRoot = m_pTreeCtrl->InsertItem(pWorkUnit->m_pWUInfo->Directory + pWorkUnit->m_pWUInfo->WorkUnitName);
CString Path, WUName;
Path = m_pWorkUnit->m_pWUInfo->Directory;
WUName = m_pWorkUnit->m_pWUInfo->WorkUnitName;
//如果根据工作元状态文件初始化不成功,则用工作元信息直接初始化
if (!InitializeTreeCtrl(Path, WUName))
InitializeTreeCtrl(m_pWorkUnit);
}
void CRSTreeView::OnAddNewLayer()
{
LAYERITEM* pLayer;
CString LayerName;
int i = 1;
while (i < 100)
{
LayerName.Format("图层%d", i++);
if (!m_pWorkUnit->m_pLayerMap->Lookup(LayerName, pLayer))
{
if (!AddANewLayer(LayerName))
{
AfxMessageBox("增加新层失败。");
return;
}
OnNewLayerAdded((WPARAM)(LPCTSTR)LayerName, 0);
break;
}
}
}
//当编码类加入到层是发生
//wParam--编码类ID
//lParam--层名
LRESULT CRSTreeView::OnFeatureAddedToLayer(WPARAM wParam, LPARAM lParam)
{
if (wParam == 0 || lParam == 0)
return 0l;
CString LayerName = (LPCTSTR)lParam;
CString UserID = (LPCTSTR)wParam;
if (LayerName.IsEmpty() || UserID.IsEmpty())
return 0l;
LAYERITEM* pLayer;
if (!m_pWorkUnit->m_pLayerMap->Lookup(LayerName, pLayer))
return 0l;
CRSFeature* pFeature;
if (!m_pWorkUnit->m_pFeatureMap->Lookup(UserID, pFeature))
return 0l;
//找到层所对应的节点
HTREEITEM hLayer = FindLayerItem(LayerName);
//插入新编码类节点
TVINSERTSTRUCT tvis;
tvis.hParent = hLayer;
tvis.hInsertAfter = TVI_FIRST;
tvis.item.pszText = (LPTSTR)((LPCTSTR)UserID);
tvis.item.iImage = IMAGE_FEATURE_EDITABLE;
tvis.item.iSelectedImage = IMAGE_FEATURE_EDITABLE;
tvis.item.stateMask = TVIS_STATEIMAGEMASK;
tvis.item.state = INDEXTOSTATEIMAGEMASK( IMAGE_FEATURE_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);
for (int i = 0 ; i < m_Layers.GetSize() ; i ++)
{
if (!LayerName.CompareNoCase(m_Layers.GetAt(i)->Name))
{
TREEFEATURE* pTreeFeature = new TREEFEATURE;
pTreeFeature->UserID = UserID;
pTreeFeature->Status = RS_VISIBLE | RS_EDITABLE;
m_Layers.GetAt(i)->Features.InsertAt(0, pTreeFeature);
}
}
return 0l;
}
//当编码类从层中移出时
//wParam--编码类ID
//lParam--层名
LRESULT CRSTreeView::OnFeatureRemovedFromLayer(WPARAM wParam, LPARAM lParam)
{
if (wParam == 0 || lParam == 0)
return 0l;
CString LayerName = (LPCTSTR)lParam;
CString UserID = (LPCTSTR)wParam;
if (LayerName.IsEmpty() || UserID.IsEmpty())
return 0l;
LAYERITEM* pLayer;
if (!m_pWorkUnit->m_pLayerMap->Lookup(LayerName, pLayer))
return 0l;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -