http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> ArcGIS >> ArcObjects开发 >> 正文

AO开发笔记(实战篇)-用VC+AO开发独立的应用程序(3)续2

作者:Snoopy    文章来源:中国3S网站(httpwww.863s.com)    点击数:    更新时间:2006-12-11
摘要:

// 删除图层

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_listLayerCListCtrl改为ClistCtrlEx,并添加CListCtrlEx的头文件包含语句,然后添加处理CListCtrlEx自定义消息的处理函数,在头文件里添加如下函数:

            afx_msg LRESULT onClickCheckbox(WPARAM wParam,LPARAM lParam);

cpp文件里添加消息映射和实现函数:

            ON_MESSAGE(WM_CLICK_CHECKBOX,onClickCheckbox)

// 响应点击ListCtrlCheckbox事件

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 0L;

     // 根据索引获取图层

     ILayerPtr ipLayer;

     hr = ipMap->get_Layer(iItem,&ipLayer);

     if (FAILED(hr)) return 0L;

     // 设置图层可见状态

     ipLayer->put_Visible(bChecked);

 

     RefreshMap();

     return 0L;

}

保存修改、编译程序,运行,当打开图层管理点击某个图层前面的复选框时会看到图层隐藏或显示。

三、本章小结

上面我们实现了从shp文件加载图层、图层管理的功能。里面只是简单的实现了这些功能而已,为的是抛砖引玉。你可以根据自己的实际要求,也可以把图层管理做出象ArcMap里面一样,用一棵树来控制图层的显示和顺序的调整。其实只是表现形式不同,用到的AO里面的接口和函数都是一样的。我们在下一节中将实现对地图要素一些操作,如:要素的选择、要素属性的查看、修改、要素删除等功能

Tags:AO开发  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图