今天用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));
}
}
代码比较简单,所以就没有写注释