文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>一个简单的MFC中TreeView使用

一个简单的MFC中TreeView使用

时间:2011-04-19  来源:愤怒的青蛙

今天用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));
        }
}

 

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

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载