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

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

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

作者:Snoopy    文章来源:中国3S网站(httpwww.863s.com)    点击数:    更新时间:2006-12-11
摘要:
你可能发现我们的程序加载的地图是在设置MapControl控件属性时指定的,在本节我们将实现如下新功能:

1.从shp文件加载图层数据。

2.实现图层管理的一些功能,如:图层显示/隐藏、图层叠加顺序调整、图层的删除。

 

一、添加从shp文件加载图层数据功能

首先去掉MapContrl属性里面默认打开的地图文档或默认加载的图层,然后在工具栏添加新的按钮,按钮ID和提示文本如下:

ID_ADD_LAYER_FRMSHP     "shp文件加载图层\nshp文件加载图层"

            接下来为类添加该按钮的响应函数,并在函数中添加如下代码(红色部分):

// shp文件加载数据

void CAOExStep1View::OnAddLayerFrmshp()

{

    // 显示选择shp文件的对话框

    const TCHAR * szFilters = _T("shp File (*.shp)|*.shp||");

    CFileDialog         mDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST|

OFN_HIDEREADONLY, szFilters);

    if (mDlg.DoModal() == IDCANCEL) return;

    // 获取文件路径和名称

    CString sztemp = mDlg.GetPathName();

    CString szFileName,szPath;

    szFileName = sztemp.Left(sztemp.ReverseFind('\\')+1);

    szPath = sztemp.Mid(sztemp.ReverseFind('\\')+1);

    // 添加新图层

    m_ipMapControl->AddShapeFile(CComBSTR(szFileName),CComBSTR(szPath));

}

保存修改编译,运行点击加载图层工具栏按钮就可以看到如下画面:

 

二、添加图层管理功能

            首先在工具栏添加新的按钮,按钮ID和提示文本如下:

ID_LAYER_MANAGE                     "图层管理\n图层管理"

然后我们添加一个图层管理的对话框,在里面添加一个Listctrl三个按钮,如下图:

几个控件的ID分别为:

IDC_LIST_LAYER

IDC_BTN_UP

IDC_BTN_DOWN

IDC_BTN_DEL

其中IDC_LIST_LAYER的样式为Report

设置完毕,为该对话框添加类ClayerManageDlg,并且为IDC_LIST_LAYER添加一个控件变量CListCtrl            m_listLayer,再添加几个按钮的响应函数,以及对话框初始化函数(OnInitDialog())。然后再添加如下函数和成员变量:

void RefreshMap();        // 刷新地图

BOOL GetAllLayer();      // 获取所有图层

IMapControl3Ptr m_ipMapControl;          // 地图控件

CImageList  m_ImageList;// LIST图形列表

m_ipMapControl用来保存传递过来的MapControl指针,我们更改一下默认的构造函数,在对话框构造函数里面初始化改变量,代码如下:

 

// LayerManageDlg.h : header file 下面为头文件中函数内容

CLayerManageDlg(IMapControl3Ptr ipMapControl,CWnd* pParent = NULL

// LayerManageDlg.cpp : implementation file 下面为cpp文件中函数内容

CLayerManageDlg::CLayerManageDlg(IMapControl3Ptr ipMapControl,CWnd* pParent /*=NULL*/)

    : CDialog(CLayerManageDlg::IDD, pParent)

{

    m_ipMapControl = ipMapControl;

}

在对话框初始化函数里面我们需要加入如下代码以初始化ListCtrl并获取图层:

// 新建ImageList,然后从ICON里面加载

m_ImageList.Create(16, 16, ILC_COLOR32, 0, 1);

m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_LAYER));

// 设置LIST图像列表,样式,添加Column

m_listLayer.SetImageList(&m_ImageList,LVSIL_SMALL);

m_listLayer.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT);

m_listLayer.InsertColumn(0,"图层名称",LVCFMT_LEFT,200);

GetAllLayer();    // 获取当前地图的图层并添加到LIST

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