在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实现网页日常任务清单小功能(数据存储在浏览器)

    任务清单可以极大提高我们的工作效率.哪些事情办了.哪些事情代办.哪些是紧急需要办的事情等等. 在组件化编码实战3的基础上进一步改进.将原先的数据保存的浏览器中.就可以做到关闭网页也不会丢失数据的情况 ...

  2. JavaScript基础&实战(5)js中的数组、forEach遍历、Date对象、Math、String对象

    文章目录 1.工厂方法创建对象 1.1 代码块 1.2.测试结果 2.原型对象 2.1 代码 2.2 测试结果 3.toString 3.1 代码 3.2 测试结果 4.数组 4.1 代码 5.字面量 ...

  3. .NET 6学习笔记(4)——如何在.NET 6的Desktop App中使用Windows Runtime API

    Windows Runtime API是当初某软为了区别Win32 API,力挺UWP而创建的另一套Windows 10专用的API集合.后来因为一些原因,UWP没火.为了不埋没很有价值的Window ...

  4. 6.-Django设计模式及模版层

    一.MVC (java等其他语言) MVC代表Model-view-Contorller(模型-视图-控制器)模式 M模型层主要用于对数据库层的封装 V视图层用于向用户展示结果 C控制器用于处理请求. ...

  5. RabbitMQ安装说明文档(超详细版本)

    RabbitMQ安装说明文档(超详细版本) 1. 安装依赖环境 在线安装依赖环境: yum install build-essential openssl openssl-devel unixODBC ...

  6. Selenium4+Python3系列(五) - 多窗口处理之句柄切换

    写在前面 感觉到很惭愧呀,因为居然在Selenium+Java系列中没有写过多窗口处理及句柄切换的文章,不过也无妨,不管什么语言,其思路是一样的,下面我们来演示,使用python语言来实现窗口句柄的切 ...

  7. day04-JavaScript01

    JavaScript01 官方文档 http://www.w3school.com.cn/js/index.asp 基本说明: JavaScript能改变html内容,能改变html属性,能改变htm ...

  8. 《ASP.NET Core技术内幕与项目实战》精简集-目录

    本系列是杨中科2022年最新作品<ASP.NET Core技术内幕与项目实战>及B站配套视频(强插点赞)的精简集,是一个读书笔记.总结和提炼了主要知识点,遵守代码优先原则,以利于快速复习和 ...

  9. Redis可视化管理工具-RedisDesktopManager

    Windows客户端,访问Redis数据库并执行一些基本操作. 链接:https://pan.baidu.com/s/1OuGqIfbpGwglC-642rECbQ 提取码:m6uo

  10. Python学习之实例2

    一.根据输入的各科成绩统计学生成绩是否达标 1 (背景:输入学生数量,以及各个学生语文.数学.英语.历史四科的成绩,如果总成绩小于 240,则成绩不达标,否则成绩合格) 2 3 #coding=utf ...