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

📄 rstreeview.cpp

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