ArcObjects SDK开发 一些可直接调用的对话框
在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开发 一些可直接调用的对话框的更多相关文章
- 高拍仪拍照SDK开发(良田影像S300L|S500L)
高拍仪拍照SDK开发下载地址:点击下载 本SDK适用于:良田影像S300L|S500L 高拍仪如图: SDN开发包安装之后找到安装目录,如图: 大家找到各自需要的版本即可,需要注意的是如果需要上传图片 ...
- Vmware Vsphere WebService SDK开发(第一讲)-基本知识学习
刚开始这方面开发的时候,不知道如何下手,能够查到的资料特别少,而且看到很多网友和我一样也在找这方面的资料.接下来的一段时间我就结合自己所参与的项目,完成关于Vmware Vsphere WebServ ...
- Kinect for Windows SDK开发入门(15):进阶指引 下
Kinect for Windows SDK开发入门(十五):进阶指引 下 上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun K ...
- 插件化技术在安卓sdk开发中实际应用
笔者从 2016 年初就因为公司业务需求转战 android sdk 开发, 应用插件化技术将公司 android sdk 重新翻版.先来说说需求. 由于笔者所在一家创业公司, android sdk ...
- IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)[转]
IOS5开发-http get/post调用mvc4 webapi互操作(图片上传) 目前最流行的跨平台交互是采用http协议通过JSON对象进行互操作.这种方式最简单,也很高效.webservi ...
- ubuntu下使用golang、qml与ubuntu sdk开发桌面应用
ubuntu下使用golang.qml与ubuntu sdk开发桌面应用 (简单示例) 找了很长时间go的gui库,试了gtk,准备试qt的时候发现了这个qml库,试了下很好用. 准备工作 1.Go ...
- Android SDK 开发——发布使用踩坑之路
前言 在 Android 开发过程中,有些功能是通用的,或者是多个业务方都需要使用的. 为了统一功能逻辑及避免重复开发,因此将该功能开发成一个 SDK 是相当有必要的. 背景 刚好最近自己遇到了类似需 ...
- iOS SDK开发汇总
以前也做过静态库的开发,不过都是一些简单的调用,最近在做项目的时候,发现其中还有很多问题,所以建个小项目简单记录遇到的问题以及正确的解决办法. 在项目中遇到的问题如下:xib文件获取不到, story ...
- Android SDK开发与使用的那些事儿
前言 最近由于工作需要,将应用里的部分功能独立了出来,封装成 SDK 提供给合作伙伴使用.由于经验不足,网上也没多少写这方面内容的文章,遇到了不少的坑,决定记录下来. SDK 其实,刚说到要写SDK也 ...
- 开发ActiveX控件调用另一个ActiveX系列0——身份证识别仪驱动的问题
程序员要从0下表开始,这篇是介绍这个系列的背景的,没有兴趣的人可以直接跳过. 为什么要开发ActiveX控件 由于工作需要,我们开发了一个网站,使用了一款身份证识别仪的网页ActiveX(OCX)插件 ...
随机推荐
- 云计算_OpenStack
部署方式-Fuel 注:部署失败且Fuel方式已过时. 部署方式-packstack 注:基于系统版本CentOS 7.9 2009部署 系统基本设置 设置静态IP=192.168.80.60 设置h ...
- 常用排序算法(C语言)
1.冒泡排序 void BubbleSort(int a[],int len) {int tmp; for (int i=0; i<n-1; i++) { int flag = FALSE; f ...
- JAVA语言学习-面向对象(1)
类与对象 类 类是JAVA语言中重要的复合型数据类型().类的实现包括两个部分:成员变量和成员方法("方法"可以看作是C语言中的函数) 类的声明 要使用类,首先得对其声明.声明一个 ...
- 永久解决Ubuntu下adb权限问题
在Linux环境下使用adb链接手机,经常会遇到全下问题,如下: adb: unable to connect for root: insufficient permissions for devic ...
- 部署redis
1. 下载redis 下载地址:https://redis.io/download/ 下载版本:6.2.7 应用包:redis-6.2.7.tar.gz 2. 上传服务器并解压 将redis安装包上传 ...
- zk系列一:zookeeper基础介绍
聊完kafka必不可少的需要再聊一聊zk了,下面开始 一.ZK是什么 ZooKeeper是分布式应用程序的高性能协调服务.它可以实现分布式的选主.统一配置管理,命名,分布式节点同步,分布式锁等分布式常 ...
- 2流高手速成记(之九):基于SpringCloudGateway实现服务网关功能
咱们接上回 上一节我们基于Sentinel实现了微服务体系下的限流和熔断,使得整个微服务架构的安全性和稳定性上升了一个台阶 篇尾我们引出了一个问题,众多的微服务节点,我们如何部署才能满足客户端简洁高效 ...
- 交叉编译:zlib,openSSL,openSSH
1. 编译zlib wget https://www.zlib.net/zlib-1.2.12.tar.gz # 编译命令 export CC=arm-fullhanv3-linux-uclibcgn ...
- ES文件传输助手1.0.0
软件下载地址 1.软件功能 与 ES文件浏览器 的快传功能 直接传输文件 支持接受文件点击预览 可以多台电脑使用该软件,从而实现电脑与电脑局域网互传文件 单个文件夹上传会递归上传该文件夹下所有文件夹与 ...
- 6. PyQt5 中的多线程的使用(上)
专栏地址 ʅ(‾◡◝)ʃ 这一节引入了多线程这个非常重要概念, 在我认为多线程的重要性是紧紧次于信号与槽函数的, 因为在平时经常使用 1. 为什么要用多线程 先看下面这一个示例代码 6.1 from ...