一个简单的MFC中TreeView使用

今天用MapX写图层管理是,使用TreeView来显示和管理图层,样式模仿ArcGIS的样式,可以通过勾选相应的图层来决定相应的图层是否显示,可是在CTreeCtrl使用上不熟悉,郁闷了好长时间,用从各种地方找了很多资料,有的是对的,有的是部分对的(这个最恶心),有的是全错的。。。不扯了,直接上代码

void CMy2008302590145View::OnLoadlayer()

{

	// TODO: Add your command handler code here

	//	添加图层

	//	方法一:使用MapX自带的默认函数添加图层

	//	m_MapX.GetLayers().LayersDlg();

	//	m_MapX.SetCurrentTool(miPanTool);

	//	方法二:使用自定义对话框添加

	CFileDialog *pFileDlg;

	pFileDlg = new CFileDialog(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT, _T("图层文件 (*.TAB)|*.TAB|All Files (*.*)|*.*||"));

	if (pFileDlg->DoModal() == IDOK)

	{

		CMapXLayers layers = m_MapX.GetLayers();

		POSITION pos = pFileDlg->GetStartPosition();

		TVINSERTSTRUCT tvRoot;

		tvRoot.hParent = NULL;

		tvRoot.hInsertAfter = NULL;

		tvRoot.item.mask = TVIF_TEXT;

		char* layername;

		layername = new char[256];

		layerIndex++;

		sprintf(layername, "图层%d", layerIndex);

		tvRoot.item.pszText = _bstr_t(layername);

		HTREEITEM hTreeRoot = m_MapLayerTreeCtrl.InsertItem(&tvRoot);

		m_MapLayerTreeCtrl.SetCheck(hTreeRoot, TRUE);

		while (pos)

		{

			itemIndex++;

			CString strFilePath = pFileDlg->GetNextPathName(pos);

			HTREEITEM tempItem = m_MapLayerTreeCtrl.InsertItem(TVIF_TEXT, strFilePath, 0, 0, 0, 0, 0, hTreeRoot, NULL);

			m_MapLayerTreeCtrl.SetItemData(tempItem,itemIndex);

			m_MapLayerTreeCtrl.SetCheck(tempItem,TRUE);

			layers.Add(strFilePath, itemIndex);

		}

	}

}

void CMy2008302590145View::OnZoomin()

{

	// TODO: Add your command handler code here

	m_MapX.SetCurrentTool(miZoomInTool);

}

void CMy2008302590145View::OnZoomout()

{

	// TODO: Add your command handler code here

	m_MapX.SetCurrentTool(miZoomOutTool);

}

void CMy2008302590145View::OnPan()

{

	// TODO: Add your command handler code here

	m_MapX.SetCurrentTool(miPanTool);

}

void CMy2008302590145View::OnNMClickTreeLayers(NMHDR *pNMHDR, LRESULT *pResult)

{

	// TODO: Add your control notification handler code here

	*pResult = 0;

	NM_TREEVIEW *pHdr = (NM_TREEVIEW*)pNMHDR;

	*pResult = 0;

	CPoint point;

	UINT uFlag;

	GetCursorPos(&point);

	

	//这个很关键,下午我就是这里错了,导致一直结果很诡异。。。

	m_MapLayerTreeCtrl.ScreenToClient(&point);

	

	HTREEITEM treeItem = m_MapLayerTreeCtrl.HitTest(point, &uFlag);

	if (treeItem && (uFlag & TVHT_ONITEMSTATEICON))

	{

		BOOL bCheck = m_MapLayerTreeCtrl.GetCheck(treeItem);

		if (m_MapLayerTreeCtrl.GetChildItem(treeItem) == NULL)

		{

			int itemIndex = m_MapLayerTreeCtrl.GetItemData(treeItem);

			m_MapX.GetLayers().Item(itemIndex).SetVisible(!bCheck);

		}

		SetItemCheckState(treeItem, !bCheck);

	}

}

void CMy2008302590145View::SetItemCheckState(HTREEITEM treeItem, bool bCheck)

{

	SetChildCheck(treeItem, bCheck);

	SetParentCheck(treeItem, bCheck);

}

void CMy2008302590145View::SetChildCheck(HTREEITEM treeItem, bool bCheck)

{

	HTREEITEM childItem = m_MapLayerTreeCtrl.GetChildItem(treeItem);

	while(childItem)

	{

		m_MapLayerTreeCtrl.SetCheck(childItem,bCheck);

		if (m_MapLayerTreeCtrl.GetChildItem(childItem) == NULL)

		{

			int itemIndex = m_MapLayerTreeCtrl.GetItemData(childItem);

			m_MapX.GetLayers().Item(itemIndex).SetVisible(bCheck);

		}

		SetChildCheck(childItem, bCheck);

		childItem = m_MapLayerTreeCtrl.GetNextItem(childItem, TVGN_NEXT);

	}

}

void CMy2008302590145View::SetParentCheck(HTREEITEM treeItem, bool bCheck)

{

	HTREEITEM parentItem = m_MapLayerTreeCtrl.GetParentItem(treeItem);

	if (parentItem == NULL)

	{

		return;

	}

	if (bCheck)

	{

		m_MapLayerTreeCtrl.SetCheck(parentItem,bCheck);

	}

	else

	{

		HTREEITEM bro = m_MapLayerTreeCtrl.GetNextItem(treeItem, TVGN_NEXT);

		BOOL bFlag = FALSE;

		while(bro)

		{

			if (m_MapLayerTreeCtrl.GetCheck(bro))

			{

				bFlag = TRUE;

				break;

			}

			bro = m_MapLayerTreeCtrl.GetNextItem(bro, TVGN_NEXT);

		}

		if (!bFlag)

		{

			bro = m_MapLayerTreeCtrl.GetNextItem(treeItem, TVGN_PREVIOUS);

			while(bro)

			{

				if (m_MapLayerTreeCtrl.GetCheck(bro))

				{

					bFlag = TRUE;

					break;

				}

				bro = m_MapLayerTreeCtrl.GetNextItem(bro, TVGN_PREVIOUS);

			}

		}

		if (!bFlag)

		{

			m_MapLayerTreeCtrl.SetCheck(parentItem, FALSE);

		}

		SetParentCheck(parentItem, m_MapLayerTreeCtrl.GetCheck(parentItem));

	}

}

代码比较简单,所以就没有写注释

你可能感兴趣的:(treeview)