// 删除图层
void CLayerManageDlg::OnBtnDel()
{
int iCurSel = m_listLayer.GetSelectionMark();
if(iCurSel<0) return;
CString sztemp;
sztemp.Format("要删除图层:“%s”吗?",m_listLayer.GetItemText(iCurSel,0));
if(IDNO == MessageBox(sztemp,"确认",MB_ICONQUESTION+MB_YESNO)) return;
IMapPtr ipMap;
HRESULT hr = m_ipMapControl->get_Map(&ipMap);
if (FAILED(hr)) return ;
// 获取要删除的图层
ILayerPtr ipLayer;
hr = ipMap->get_Layer(iCurSel,&ipLayer);
if(FAILED(hr)) return ;
ipMap->DeleteLayer(ipLayer);
if(FAILED(hr)) return ;
m_listLayer.DeleteItem(iCurSel);
}
保存、编译、运行,先点击工具栏添加图层数据,然后点击图层管理按钮,出现图层管理的对话框,在ListCtrl中选择一行,点击按钮:上移、下移、删除,可以看到相应的效果(见下图):
在图层列表中每行记录前面的复选框是用来控制图层是否可见的,因为在ListCtrl的事件函数里面没有专门处理复选框的点击消息的函数,所以我们从ClistCtrl派生一个新的类专门处理它。
在Classview页右击项目名称在出现的菜单里面选择New Class…,添加一个新类ClistCtrlEx,类型选择MFC Class 基类选择ClistCtrl,如下图:
在生成的新类中添加一个自定义消息,当用户点击复选框时向父窗口发送此消息:
#define WM_CLICK_CHECKBOX WM_USER+100
然后添加一个WM_LBUTTONDOWN事件处理函数,并在其中加入如下代码:
void CListCtrlEx::OnLButtonDown(UINT nFlags, CPoint point)
{
CListCtrl::OnLButtonDown(nFlags, point);
LVHITTESTINFO lvhti;
lvhti.pt = point;
SubItemHitTest(&lvhti);
// 点击复选框时向父窗口发WM_CLICK_CHECKBOX消息
if(!(lvhti.flags&LVHT_ONITEMLABEL)&&(lvhti.flags&LVHT_ONITEMSTATEICON))
{
BOOL bChecked = GetCheck(lvhti.iItem);
GetParent()->PostMessage(WM_CLICK_CHECKBOX,(WPARAM)lvhti.iItem,(LPARAM)bChecked);
}
}
接下来修改图层设置对话框类ClayerManageDlg,在头文件里把成员变量m_listLayer由CListCtrl改为ClistCtrlEx,并添加CListCtrlEx的头文件包含语句,然后添加处理CListCtrlEx自定义消息的处理函数,在头文件里添加如下函数:
afx_msg LRESULT onClickCheckbox(WPARAM wParam,LPARAM lParam);
在cpp文件里添加消息映射和实现函数:
ON_MESSAGE(WM_CLICK_CHECKBOX,onClickCheckbox)
// 响应点击ListCtrl的Checkbox事件
LRESULT CLayerManageDlg::onClickCheckbox(WPARAM wParam,LPARAM lParam)
{
int iItem = (int)wParam;// 点击的Item
BOOL bChecked = (BOOL)lParam;// 当前Checkbox状态
IMapPtr ipMap;
HRESULT hr = m_ipMapControl->get_Map(&ipMap);
if (FAILED(hr)) return
// 根据索引获取图层
ILayerPtr ipLayer;
hr = ipMap->get_Layer(iItem,&ipLayer);
if (FAILED(hr)) return
// 设置图层可见状态
ipLayer->put_Visible(bChecked);
RefreshMap();
return
}
保存修改、编译程序,运行,当打开图层管理点击某个图层前面的复选框时会看到图层隐藏或显示。
三、本章小结
上面我们实现了从shp文件加载图层、图层管理的功能。里面只是简单的实现了这些功能而已,为的是抛砖引玉。你可以根据自己的实际要求,也可以把图层管理做出象ArcMap里面一样,用一棵树来控制图层的显示和顺序的调整。其实只是表现形式不同,用到的AO里面的接口和函数都是一样的。我们在下一节中将实现对地图要素一些操作,如:要素的选择、要素属性的查看、修改、要素删除等功能。