• 一个简单的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));
    	}
    }

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

  • 相关阅读:
    React生命周期, 兄弟组件之间通信
    React组件式编程Demo-用户的增删改查
    React之this.refs, 实现数据双向绑定
    CCF CSP 201812-4 数据中心
    CCF CSP 201812-4 数据中心
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    PAT 顶级 1020 Delete At Most Two Characters (35 分)
    Codeforces 1245C Constanze's Machine
    Codeforces 1245C Constanze's Machine
    CCF CSP 201712-4 行车路线
  • 原文地址:https://www.cnblogs.com/madhenry/p/2020649.html
Copyright © 2020-2023  润新知