发布时间 : 星期六 文章ArcGIS Engine二次开发 - 基础篇更新完毕开始阅读c1826921192e45361066f5ac
ArcGIS Engine二次开发——基础篇
向其中的OnMouseMove函数添加如下代码:
//判断是否鼠标左键 if (Button != 1) return; //是否漫游状态
if (!m_PanOperation) return; //追踪鼠标
IPoint pPoint = m_focusScreenDisplay.DisplayTransformation.ToMapPoint(X, Y); m_focusScreenDisplay.PanMoveTo(pPoint);
向其中的OnMouseUp函数添加如下代码:
//判断是否鼠标左键 if (Button != 1) return; //是否漫游状态
if (!m_PanOperation) return;
IEnvelope pExtent = m_focusScreenDisplay.PanStop();
//判断移动区域是否为空 if (pExtent != null) {
m_focusScreenDisplay.DisplayTransformation.VisibleBounds = pExtent; m_focusScreenDisplay.Invalidate(null, true, (short)esriScreenCache.esriAllScreenCaches); }
//关闭漫游状态
m_PanOperation = false;
这样就完成了Pan.cs类的制作。在下面的程序中,调用这个类,即可完成“漫游”的功能。
按照之前两个小节讲述的做法,完成其余类的制作,具体方法这里不一一列举出,您可以参考提供的例子程序MyGIS,详细查看其中每一个类的制作方法,代码方面的问题如果有疑问,可以参看帮助系统,具体帮助系统的使用方法在第六章中有详细讲述。
1.7.5 实现属性查询
前面我们已经实现过属性查询,但是我们的程序只能查询固定的bou2_4p图层的NAME字段,在这里我们将对程序进行修改完善,实现图层和字段的可选查询。
首先打开“属性查询”窗体的设计器。添加三个Label控件,两个ComboBox,两个Button和一个TextBox。各控件属性设置如下:
表 5控件参数设置
名称(Name) Text属性 lblLayer 选择图层: 描述 标签 ArcGIS Engine二次开发——基础篇
lblField lblFind cboLayer cboField txtValue btnOk btnCancel
界面效果如下:
字段名称: 查找内容: 查找 取消 标签 标签 MapControl中的图层名称 cboLayer选中图层的所有字段名称 输入的查询对象名称 查询按钮 取消查询按钮
图 25 属性查询窗口布局
进入窗体的代码编辑界面,首先添加三个引用:
using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geodatabase;
然后定义两个成员变量,一个用于存储地图数据,一个用于存储当前选中图层,如下
//地图数据
private AxMapControl mMapControl; //选中图层
private IFeatureLayer mFeatureLayer;
然后修改其构造函数,构造函数中添加一个参数MapControl,用于获取MapControl中的数据,如下所示:
public AttributeQueryForm(AxMapControl mapControl) {
InitializeComponent();
this.mMapControl = mapControl; }
ArcGIS Engine二次开发——基础篇
在窗体的Load事件中添加代码,用于初始化cboLayer,获取MapControl中的图层名称,如下:
//MapControl中没有图层时返回 if (this.mMapControl.LayerCount <= 0) return;
//获取MapControl中的全部图层名称,并加入ComboBox //图层 ILayer pLayer; //图层名称
string strLayerName;
for (int i = 0; i < this.mMapControl.LayerCount; i++) {
pLayer = this.mMapControl.get_Layer(i); strLayerName = pLayer.Name; //图层名称加入cboLayer
this.cboLayer.Items.Add(strLayerName); }
//默认显示第一个选项
this.cboLayer.SelectedIndex = 0;
在CboLayer的SelectedIndexChanged事件中添加代码,当选中图层发生变化时,cboField中的字段名称重新获取,代码如下:
//获取cboLayer中选中的图层
mFeatureLayer = mMapControl.get_Layer(cboLayer.SelectedIndex) as IFeatureLayer; IFeatureClass pFeatureClass = mFeatureLayer.FeatureClass; //字段名称 string strFldName;
for (int i = 0; i < pFeatureClass.Fields.FieldCount;i++ ) {
strFldName = pFeatureClass.Fields.get_Field(i).Name; //图层名称加入cboField
this.cboField.Items.Add(strFldName); }
//默认显示第一个选项
this.cboField.SelectedIndex = 0;
然后按照我们之前所讲的查询属性要素的方法在“查找”按钮的Click事件中添加代码,请你参照前面章节所述方式和示例程序尝试自行完成。这样我们就完成了“属性查询”窗体的设计实现。
1.7.6 实现空间查询
这一小结,我们进一步实现空间查询窗体的设计实现,我们的设想是通过该窗体选择查询的图层和查询的方式,然后将这两个参数传递给主窗体,主窗体实现查询,将查询得到
ArcGIS Engine二次开发——基础篇
的要素的属性显示在DataGridView控件中,下面开始动手吧。
首先打开“属性查询”窗体的设计器。添加两个Label控件,两个ComboBox,两个Button。各控件属性设置如下:
表 6控件参数设置
名称(Name) Text属性 lblLayer lblMode cboLayer cboMode btnOk btnCancel
界面效果如下:
选择图层: 查询方式: 确定 取消 描述 标签 标签 MapControl中的图层名称 空间查询的方式 确定查询按钮 取消查询按钮
图 26空间查询窗口布局
进入窗体的代码编辑界面,首先添加三个引用:
using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Carto;
然后定义两个成员变量,一个用于存储地图数据,一个用于存储当前选中图层,如下
//获取主界面的MapControl对象 private AxMapControl mMapControl; //查询方式
public int mQueryMode; //图层索引
public int mLayerIndex;
然后修改其构造函数,构造函数中添加一个参数MapControl,用于获取MapControl中
的数据,如下所示:
public SpatialQueryForm (AxMapControl mapControl) {