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)插件 ...
随机推荐
- 2021 CCPC 威海站 VP记录(题解)
2021 CCPC 威海站 VP记录(题解) 题目顺序为vp时开题顺序: A - Goodbye, Ziyin! 签到,连边数小于等于2的可以作为二叉树根,若有大于4的直接输出0. code: voi ...
- 提高工作效率的神器:基于前端表格实现Chrome Excel扩展插件
Chrome插件,官方名称extensions(扩展程序):为了方便理解,以下都称为插件. 我们开发的插件需要在浏览器里面运行,打开浏览器,通过右上角的三个点(自定义及控制)-更多工具-拓展程序-打开 ...
- 某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批
某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条:如果员工请假天数大于等于3天,小于10天,经理可以审批:如果员工请假天数大于等于10天,小于30天,总经理可以审批 ...
- 11.-ORM-基本操作-创建数据
一.ORM-操作 基本操作包括增删改查,即(CRUD)操作 CRUD是指在做计算处理时增加(create).读取查询(read).更新(update).删除(delete) ORM CRUD 核心 - ...
- ISCTF2022WP
ISCTF2022改名叫套CTF吧(bushi),博主菜鸡一个,套题太多,挑一些题写下wp,勿喷. MISC 可爱的emoji 下载下来是个加密压缩包,根据hint掩码爆破密码 得到密码:KEYI ...
- 微信DAT文件解密(dat转图像)
微信电脑版现在已经是日常工作生活必不可少的工具,有时候删除了聊天记录或者被系统清理软件清理了,但还想查看曾经的微信聊天图片. 这个时候辛辛苦苦找到了文件,却发现无法查看,因为微信电脑版为了保护我们的隐 ...
- [leetcode] 713. Subarray Product Less Than K
题目 Given an array of integers nums and an integer k, return the number of contiguous subarrays where ...
- 4.drf-版本管理
根据RESTful规范,后端API中需要体现出版本,DRF中支持5种版本的设置,常见的三种如下 1. URL的GET中传递参数 在视图类中定义 from rest_framework.versioni ...
- Emgu实现图像分割
C#通过Emgu这个图像处理库,可以很方便的将一幅单通道图像分割为R.G.B三个单通道图像. Image<Bgr, Byte> ImageBGR = null; Image<Bgr, ...
- C#和Open eVision Studio图像库联合编程-读取图像
OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image Files (*.t ...