在ArcMap中,一些对话框是很复杂的,例如设置点线面样式的对话框,选择空间参考的对话框等,但这些对话框有些在ArcObjects SDK中是可以直接调用的。

1、空间参考选择设置对话框

弹出空间参考对话框的代码如下。

var mySpatialReference = this.UI_SpatialReference_TextBox.Tag as ISpatialReference;
if (mySpatialReference == null)
{
return;
}
var mySpatialReferenceDialog = new SpatialReferenceDialogClass
{
BasicMap = this._Grid.BasicMap
};
mySpatialReference = mySpatialReferenceDialog.DoModalEdit(mySpatialReference, true, false, false, false, false, 0) as ISpatialReference;
if (mySpatialReference != null)
{
this.UI_SpatialReference_TextBox.Text = mySpatialReference.Name;
this.UI_SpatialReference_TextBox.Tag = mySpatialReference;
}

我们看下SpatialReferenceDialogClass类的定义。

BasicMap属性,该属性是可以在弹出对话框中快速选择当前地图图层的空间参考,不设置也可以。

DoModalEdit函数,该函数是主函数,即弹出选择对话框。该函数的定义如下。

public ISpatialReference DoModalEdit (
ISpatialReference inputSpatialReference,
bool hasXY,
bool hasZ,
bool hasM,
bool coordPageReadOnly,
bool domainPageReadOnly,
int hParent);

第一个函数就是我们传入的要编辑的空间参考对象,接下来三个参数是指是否内包含xy、z和m,我一般设置为true,false,false。后面的参数分别设置coord选项卡是否只读,domain选项卡是否只读以及父窗体的标识,一般设置为false,false,0。

除了DoModalEdit函数外,还有DoModalCreate函数,该函数是创建一个新的空间参考,参数和DoModalEdit函数类似。

弹出的对话框如下图所示。

2、Symbol选择设置对话框

样式选择器对话框用来设置点、线和面符号。调用代码如下所示。

ISymbolSelector mySymbolSelector = new SymbolSelectorClass();
mySymbolSelector.AddSymbol(myLineSymbol as ISymbol);
bool myIsOk = mySymbolSelector.SelectSymbol(0);
if (myIsOk)
{
myLineSymbol = mySymbolSelector.GetSymbolAt(0) as ILineSymbol;
}

主要用到的类是SymbolSelectorClass,通过AddSymbol函数,设置要编辑的样式对象,调用SelectSymbol函数,弹出样式选择和设置对话框,并返回是否点击确定按钮,如果点击了确定,可以通过GetSymbolAt函数获取选择或者编辑后的样式对象。

弹出的对话框如下图所示。

点击右侧的Edite Symbol按钮,可以弹出更详细的参设置对话框,如下图所示。

这些对话框和ArcMap中是一样的,使用非常方便。

3、颜色选择对话框

弹出颜色浏览器的代码如下。

IColor myColor = new RgbColor()
{
Red = 255,
Blue = 0,
Green = 0
};
IColorBrowser myColorBrowser = new ColorBrowser()
{
Color = myColor
};
if (myColorBrowser.DoModal(0))
{
myColor = myColorBrowser.Color;
}

弹出的对话框如下图所示。

颜色选择对话框的代码如下。

IColor myColor = new RgbColor()
{
Red = 255,
Blue = 0,
Green = 0
};
IColorSelector myColorSelector = new ColorSelectorClass()
{
Color = myColor
};
if (myColorSelector.DoModal(0))
{
myColor = myColorSelector.Color;
}

弹出的对话框如下图所示。

但一般情况下我们都会调用.Net或者第三方UI自带的颜色选择器,基本不怎么用ArcOObjects SDK的颜色设置对话框。

4、Style选择设置对话框(并没有弹出)

该对话框的主接口为IStyleSelector,我看下该接口的定义。

从帮助中可以看出,实现该接口的有背景选择器,边线选择器,图例元素、指北针、比例尺等。但实际测试的时候这些对话框并不弹出来,但看网上有人说是可以弹出来的,并贴出了图片。难道是因为我的UI是用的WPF的原因?研究了半天没搞明白,就放弃了,使用AxSymbologyControl,自己包装了一个对话框。

5、使用AxSymbologyControl自定义样式选择设置对话框

AxSymbologyControl是一个基于winform的UI,我们可以把这个UI放对话框中,自定义一个样式选择设置对话框。使用AxSymbologyControl有两个关键点,一是设置要显示的符号类型,二是要设置加载的ServerStyle文件。代码如下图所示。

this._AxSymbologyControl = new AxSymbologyControl();
this._AxSymbologyControl.BeginInit();
this.UI_WindowsFormsHost.Child = this._AxSymbologyControl;
this._AxSymbologyControl.EndInit();
this._AxSymbologyControl.StyleClass = pSymbologyStyle;
string myInstall = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path;
string myEsriStyleFile = myInstall + "\\Styles\\ESRI.serverstyle";
if (File.Exists(myEsriStyleFile))
{
this._AxSymbologyControl.LoadStyleFile(myEsriStyleFile);
}

AxSymbologyControl.StyleClass属性的类型为esriSymbologyStyleClass,该枚举的定义如下。

这说明AxSymbologyControl可以加载这么多类型,因为使用IStyleSelector不能弹出选择边框的对话框,那么我们就用在AxSymbologyControl上设置一下边框,也就是esriSymbologyStyleClass。弹出的对话框如下图所示。

这个对话框是我们自己定义的,里面放了AxSymbologyControl,右上角是一个符号预览UI。

6、IPropertyPage

这个接口直接翻译是属性页面的意思,实际上可以TabControl里面的一个选项卡,放到对话框中。通过查看有哪些类继承了该接口,我们可以了解到我们能直接用哪些UI。这些可以在帮助中查看。

我们查看帮助中,发现有一些和FeatureLayer有关的实现类,那么我们是不是可以把这些PropertyPage组合在一起,形成一个对话框呢?代码如下。

ILayer mySelectLayer = this.MapApplication.SelectTocObject as ILayer;
if (mySelectLayer == null)
{
return;
}
ESRI.ArcGIS.Framework.IComPropertySheet myComPropertySheet = new ESRI.ArcGIS.Framework.ComPropertySheet();
myComPropertySheet.Title = mySelectLayer.Name + " - Properties";
ESRI.ArcGIS.esriSystem.UID myUID = new ESRI.ArcGIS.esriSystem.UIDClass();
myComPropertySheet.AddCategoryID(myUID);
myComPropertySheet.AddPage(new ESRI.ArcGIS.CartoUI.GeneralLayerPropPageClass());
if (mySelectLayer is IFeatureLayer)
{
myComPropertySheet.AddPage(new ESRI.ArcGIS.CartoUI.FeatureLayerSourcePropertyPageClass());
myComPropertySheet.AddPage(new ESRI.ArcGIS.CartoUI.LayerFieldsPropertyPageClass());
myComPropertySheet.AddPage(new ESRI.ArcGIS.CartoUI.LayerDrawingPropertyPageClass());
myComPropertySheet.AddPage(new ESRI.ArcGIS.CartoUI.LayerLabelsPropertyPageClass());
myComPropertySheet.AddPage(new ESRI.ArcGIS.CartoUI.LayerDefinitionQueryPropertyPageClass());
}
ESRI.ArcGIS.esriSystem.ISet mySet = new ESRI.ArcGIS.esriSystem.SetClass();
mySet.Add(mySelectLayer);
mySet.Reset();
myComPropertySheet.ActivePage = 2;
bool myIsOK = myComPropertySheet.EditProperties(mySet, 0);
if (myIsOK == false)
{
return;
}
this.MapApplication.TOCControl.Update();
this.MapApplication.ActiveView.Refresh();

ComPropertySheet为我们定义的一个主对话框,通过AddPage函数,添加实现IPropertyPage接口的类。例如我们首先添加了GeneralLayerPropPageClass,判断如果是矢量图层,右增加了图层数据源、图层字段管理、图层渲染、标注以及默认查询等页面,,并默认激活第二个。弹出的对话框如下。

矢量图层的Page定义比较全,栅格数据的就比较少了,没有比较复杂的栅格数据渲染设置。这个问题咨询过Esri中国的技术支持,给的回复是确实没有定义。如果有能直接调用栅格图层渲染设置的面板的朋友,可以留言或私信告诉下,非常感谢。

7、一些小对话框

数字输入对话框,代码如下。

INumberDialog myNumberDialog = new NumberDialogClass();
bool myIsOK = myNumberDialog.DoModal("输入数字", 1.00, 5, 0);
if (myIsOK == true)
{
MessageBox.Show(myNumberDialog.Value.ToString());
}

弹出得对话框如下图所示。

字符串输入对话框,代码如下。

IGetStringDialog myGetStringDialog = new GetStringDialogClass();
bool myIsOK = myGetStringDialog.DoModal("输入字符串", "字符串:", "初始的字符串", 0);
if (myIsOK == true)
{
MessageBox.Show(myGetStringDialog.Value.ToString());
}

弹出得对话框如下图所示。

坐标输入对话框,代码如下。

ICoordinateDialog myCoordinateDialog = new CoordinateDialogClass();
bool myIsOK = myCoordinateDialog.DoModal("输入坐标", 116, 42, 4, 0);
if (myIsOK == true)
{
MessageBox.Show(myCoordinateDialog.X.ToString() + "," + myCoordinateDialog.Y.ToString());
}

弹出的对话框如下图所示。

不过这些对话框使用Winform或者WPF都比较容易实现,所以我们很少直接使用SDK里面定义的这些。

8、其他对话框

ArcObjects SDK中可以直接调用的对话框还有很多,我们可以在帮助中搜索例如Dialog、Window等这样的关键字,查看搜到的结果,根据名称判断是不是对话框,然后写代码测试下,就知道效果以及如何使用了。

ArcObjects SDK开发 一些可直接调用的对话框的更多相关文章

  1. 高拍仪拍照SDK开发(良田影像S300L|S500L)

    高拍仪拍照SDK开发下载地址:点击下载 本SDK适用于:良田影像S300L|S500L 高拍仪如图: SDN开发包安装之后找到安装目录,如图: 大家找到各自需要的版本即可,需要注意的是如果需要上传图片 ...

  2. Vmware Vsphere WebService SDK开发(第一讲)-基本知识学习

    刚开始这方面开发的时候,不知道如何下手,能够查到的资料特别少,而且看到很多网友和我一样也在找这方面的资料.接下来的一段时间我就结合自己所参与的项目,完成关于Vmware Vsphere WebServ ...

  3. Kinect for Windows SDK开发入门(15):进阶指引 下

    Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...

  4. 插件化技术在安卓sdk开发中实际应用

    笔者从 2016 年初就因为公司业务需求转战 android sdk 开发, 应用插件化技术将公司 android sdk 重新翻版.先来说说需求. 由于笔者所在一家创业公司, android sdk ...

  5. IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)[转]

    IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)   目前最流行的跨平台交互是采用http协议通过JSON对象进行互操作.这种方式最简单,也很高效.webservi ...

  6. ubuntu下使用golang、qml与ubuntu sdk开发桌面应用

    ubuntu下使用golang.qml与ubuntu sdk开发桌面应用 (简单示例) 找了很长时间go的gui库,试了gtk,准备试qt的时候发现了这个qml库,试了下很好用. 准备工作 1.Go ...

  7. Android SDK 开发——发布使用踩坑之路

    前言 在 Android 开发过程中,有些功能是通用的,或者是多个业务方都需要使用的. 为了统一功能逻辑及避免重复开发,因此将该功能开发成一个 SDK 是相当有必要的. 背景 刚好最近自己遇到了类似需 ...

  8. iOS SDK开发汇总

    以前也做过静态库的开发,不过都是一些简单的调用,最近在做项目的时候,发现其中还有很多问题,所以建个小项目简单记录遇到的问题以及正确的解决办法. 在项目中遇到的问题如下:xib文件获取不到, story ...

  9. Android SDK开发与使用的那些事儿

    前言 最近由于工作需要,将应用里的部分功能独立了出来,封装成 SDK 提供给合作伙伴使用.由于经验不足,网上也没多少写这方面内容的文章,遇到了不少的坑,决定记录下来. SDK 其实,刚说到要写SDK也 ...

  10. 开发ActiveX控件调用另一个ActiveX系列0——身份证识别仪驱动的问题

    程序员要从0下表开始,这篇是介绍这个系列的背景的,没有兴趣的人可以直接跳过. 为什么要开发ActiveX控件 由于工作需要,我们开发了一个网站,使用了一款身份证识别仪的网页ActiveX(OCX)插件 ...

随机推荐

  1. 前端框架Vue------>第一天学习、Vue学习的路径、Vue官网(1)

    文章目录 1.学习目标 2.前端知识体系 2.1 前端三要素 2.2.MVVM 3.第一个Vue程序 4.Vue实例的生命周期 vue的官方文档:https://cn.vuejs.org/ 1.学习目 ...

  2. 任务清单小功能的实现(任务的增、删、改、查、存储)使用Vue实现

    文章目录 1.实现的效果(视频演示) 2.重点讲解(编辑的实现) 2.1 提示(官网介绍nextTick的用法) 3.编辑功能的核心代码 4.完整的代码 5.以往练习 任务清单案例(纯Vue) 实现的 ...

  3. 齐博x1.1用户登录接口

    用户的登录主要涉及到小程序登录.APP的帐号密码登录.APP的微信开发平台帐号登录.相应的地址是:http://qb.net/index.php/index/wxapp.login/index.htm ...

  4. 你应该知道的数仓安全:都是同名Schema惹的祸

    摘要:我是管理员账号,怎么还没有权限?当小伙伴询问的时候,我第一时间就会想到都是用户同名Schema惹的祸 本文分享自华为云社区<你应该知道的数仓安全--都是同名Schema惹的祸>,作者 ...

  5. 【单片机入门】(三)应用层软件开发的单片机学习之路-----UART串口通讯和c#交互

    引言 在第一章博客中,我们讲了Arduino对Esp32的一个环境配置,以及了解到了常用的一个总线通讯协议,其中有SPI,IIC,UART等,今天我为大家带来UART串口通讯和c#串口进行通讯的一个案 ...

  6. 一、Django介绍

    一.Django介绍 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django.Django 是一个开放源代码的 Web 应用框 ...

  7. GIT入门与Gitee的使用

    一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 工作原理 / 流程: Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remo ...

  8. 第一百零七篇:基本数据类型(undefined,null,boolean类型)

    好家伙, 本篇内容为<JS高级程序设计>第三章学习笔记 1.数据类型 ECMAScript有6种简单数据类型(称为原始类型): Undefined, Null, Boolean, Numb ...

  9. CSP2022-J/S 游记

    Day -2147483648 初赛 J组: 水. 单选没啥好说的,那道联通的傻掉挂了 \(2\). 读程 \(T1\) 手搓,\(T2\) 找规律(判断第一题蒙的,懒得算),\(T3\) 没注意 \ ...

  10. scp工具上传下载

    1.从本地复制到远程 scp local_file remote_username@remote_ip:remote_folder 或者 scp local_file remote_username@ ...