zoukankan      html  css  js  c++  java
  • 一个简单的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));
    	}
    }

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

  • 相关阅读:
    2013工作回望
    在Skyline 控件上面显示Web信息窗体
    Extjs xtype 为lable 设置
    纪念第一篇博客
    前端技术学习经验分享(第二、三天---学习过程)
    前端技术学习经验分享(第一天---布置学习环境)
    JS开发HTML5游戏《悠悠考拉》(三)
    JS开发HTML5游戏《悠悠考拉》(二)
    JS开发HTML5游戏《悠悠考拉》(一)
    产品经理C端转B端,我后悔了
  • 原文地址:https://www.cnblogs.com/madhenry/p/2020649.html
Copyright © 2011-2022 走看看