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

📄 rstreeview.cpp

📁 c语言实现的遥感图像处理的一些基本操作
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -