ArcGIS Engine开发之旅03--ArcGIS Engine中的控件

原文 ArcGIS Engine开发之旅03--ArcGIS Engine中的控件

制图控件,
如MapControl、PageLayoutControl,其中MapControl控件主要用于地理数据的显示和分析,PageLayoutControl用于生成一幅成品地图。MapControl封装了Map对象,而PageLayoutControl则封装了PageLayout对象。这两个控件都实现了IMxContents接口,因此不仅可以读取ArcMap创建的地图文档,而且可以将自身的地图内容写到一个新的地图文档中。
三维控件,
如GlobeControl、SceneControl都具有导航功能,允许终端用户操作三维视图,而不必使用控件命令或自定义命令。通过设置Navigate属性,用户就可以操作三维视图,如前后左右移动、放大缩小等。
框架控件,
如TOCControl、ToolbarControl,需要与其他的控件协作使用。例如在TOCControl控件属性页中设置与MapControl关联,单在MapControl中删除一个图层时,该图层也从TOCControl中删除。

1、制图控件介绍

MapControl控件封装了Map对象,并提供了其他的属性、方法和事件,用于管理控件的外观、显示属性和地图属性,管理、添加数据图层,装载地图文档,显示、绘制跟踪图层。MapControl上存在着诸如TrackRectangle、TrackPolygon、TrackLine和TrackCircle等帮助方法,用于追踪或“橡皮圈住(rubber

banding)”显示上的几何图形(Shape)。VisibleRegion属性可用于更改MapControl显示区内的几何图形。MapControl控件实现的主要接口有IMapControlDefault、IMapControl2、IMapControl3、IMapControlEvents2等,如图2-1所示。

1.1 IMapControlDefault接口
IMapControlDefault接口是地图控件缺省接口。当将MapControl控件拖放到容器上时,会自动创建一个axMapControl1的对象,该对象全部继承父类接口的属性和方法。下面的代码演示了如何使用这个接口。

IMapControlDefault mapControlDefault;
MapControl mapControl;
mapControl = axMapControl1.object as IMapControlDefault;

1.2 IMapControl2接口

IMapControl2接口提供了一系列的属性和方法,如设置控件外观,设置Map对象或控件的显示属性,添加和管理数据图层、地图文档,在控件上绘制图形和返回几何对象等,如图2-2所示。

1.3 IMapControl3接口
该接口继承自IMapControl2,并增加了8个属性和一个方法。
CustomProperty:设置自定义控件属性。
DocumentFilename:返回MapControl装入的地图文档的文件名。
DocumentMap:返回MapControl最后装入的地图名称。
KyeIntercept:返回或设置MapControl截取键盘按键信息。
Object:返回MapControl控件。

IMapControl2 mapControl2;
mapControl2 = axMapControl1.Object as IMapControl2;

mapControl2 = axMapControl1.GetOcx() as IMapControl2;
IMapControl3 mapControl3;
mapControl3 = axMapControl1.Object as IMapControl3;
mapControl3 = axMapControl1.GetOcx() as IMapControl3;

ShowMapTips:确定是否显示地图的Map Tips。
TipDelay:设置Map Tips的延迟时间。
TipStyle:设置Map Tips的显示样式。
SuppressResizeDrawing():当控件尺寸发生变化时阻止数据实时重绘。

1.4 IMapControlEvents2接口

IMapControlEvents2定义了MapControl能够处理的全部事件,如图2-3所示。其中,OnBeforeScreenDraw事件是屏幕绘制前触发的事件,OnViewRefreshed是视频刷新触发事件。

 2、页面布局控件

PageLayoutControl控件主要用于页面布局与制图。该控件封装了PageLayout类,提供了布局视图中控制元素的属性和方法,以及其他的事件、属性和方法。
Printer属性提供了处理地图打印的设置。
Page属性提供了处理控件的页面效果。
Element属性则用于管理控件中的地图元素。
PageLayoutControl控件不能添加地图图层或地理数据,必须通过使用MXD文件来加载需要处理的数据。PageLayoutControl控件主要实现IPageLayoutControlDefault、IPageLayoutControl、IPageLayoutControl2、IPageLayoutControlevents等接口,

2.1 IPageLayoutControlDefault接口

IPageLayoutControlDefault是界面调用的默认接口。该接口是纯接口,因此可以在新版本中使用。接口的方法和属性都是相同的最高版本的主界面上的PageLayoutControl,例如IPageLayoutControlDefault相当于IPageLayoutControl2,但在以后的新版本中可能成为IPageLayoutControl3。通过使用IPageLayoutControlDefault接口,可以保证使用的PageLayoutControl是最新版本。

2.2 IPageLayoutControlevents接口

3、框架控件介绍

3.1 图层树控件——TOCControl
   
 TOCControl是用来管理图层的可见性和标签的编辑。TOCControl需要一个“伙伴控件”(buddyControl),或实现了IActiveView接口的对象协同工作。“伙伴控件”可以是MapControl、PageLayoutControl、ReaderControl、SceneControl或GlobeControl。“伙伴控件”可以通过TOCControl属性页设置,或者在驻留TOCControl的容器被显示时用SetBuddyControl方法通过编程设置。TOCControl的每个“伙伴控件”都实现了ITOCBuddy接口。TOCControl用“伙伴控件”来显示其地图、图层和符号体系内容的一个交互树视图,并保持其内容与“伙伴控件”同步。TOCControl通过ITOCBuddy接口来访问其“伙伴控件”。

TOCControl的主要接口有两个,一个是ITOCControl,一个是ITOCControlEvents。ITOCControl接口是任何与TOCControl有关的任务的出发点,如设置控件的外观、设置“伙伴控件”、管理图层的可见性和标签的编辑等。ITOCControlEvents是一个事件接口,它定义了TOCControl能够处理的全部事件,如OnMouseDown、OnMouseMove、OnMouseUp等,这些事件在构建独立应用程序中经常使用,如OnBeginLabelEdit、OnEndLabelEdit分别是TOCControl中的标签开始编辑、结束编辑时触发。

3.2 工具栏控件——ToolbarControl

ToolbarControl包括6个对象及相关接口:ToolbarControl、ToolbarItem、ToolbarMenu、CustomizeDialog、MissingCommand。ToolbarControl要与一个“伙伴控件”协同工作,通过ToolbarControl属性页设置,或者在驻留ToolbarControl的容器被显示时用SetBuddyControl方法通过编程设置。
ToolbarControl的每个“伙伴控件”都实现了IToolbarBuddy接口,这个接口用于设置“伙伴控件”的CurrentTool属性。如通过设置MapControl作为其“伙伴控件”,当用户单击该ToolbarControl上的“拉框放大”工具时,该放大工具就会成为MapControl的
CurrentTool。放大工具的实现过程是:通过ToolbarControl获取其“伙伴控件”,然后在MapControl上提供显示终端用户拉动鼠标所画的框,并改变MapControl的显示范围。
ToolbarControl一般要与一个“伙伴控件”协同工作,并有一个控件命令选择集,以便快速提供功能强大的GIS应用程序。ToolbarControl不仅提供了部分用户界面,而且还提供了部分应用程序框架。ArcGIS

Desktop应用程序,如ArcMap、ArcGlobe和ArcScene等具有强大而灵活的框架,包括诸如工具条、命令、菜单、泊靠窗口和状态条等用户界面组件,这些框架使终端用户可以通过改变位置、添加和删除这些用户界面组件来定制应用程序。
ArcGIS Engine提供了几套使用ArcGIS控件的命令,以便执
行某种特定动作,开发人员可通过创建执行特定任务的定制命令来扩展这套控件命令。所有的命令对象都实现了ICommand接口,ToolbarControl在适当的时候要使用该接口来调用方法和访问属性。在命令对象被驻留到ToolbarControl后,就会立即调用ICommand::OnCreate方法,这个方法将一个句柄(Handle)或钩子(hook)传递给该命令操作的应用程序。命令的实现一般都要经过测试,以查看该钩子(hook)对象是否被支持,如果不支持则该钩子自动失效,如果支持,命令则存储该钩子以便以后使用。ToolbarControl使用钩子(hook)来联系命令对象和“伙伴控件”,并提供了属性、方法和事件用于管理控件的外观,设置伙伴控件,添加、删除命令项,设置当前工具等。ToolbarControl的主要接口有:IToolbarControl、IToolbarControlDefault、IToolbarControlEvents。
(1)IToolbarControl:该接口是任何与ToolbarControl有关的任务的出发点,如设置“伙伴控件”的外观,添加或去除命令、工具、菜单等。
(2)IToolbarControlDefault:该接口是自动暴露的缺省的dispatch接口,该接口的属性和方法与ToolbarControl的最高版本主接口的属性、方法相同。例如目前版本中的IToolbarControlDefault等同于IToolbarControl,但在今后的新版本中,可能会变为IToolbarControl2。在开发中使用IToolbarControlDefault接口,能够保证总是访问到最新版本的ToolbarControl。
(3)IToolbarControlEvents:该接口是一个事件接口,定义了ToolbarControl能够处理的全部事件,如OnDoubleClick、OnItemClick、OnKeyDown等。

在ToolbarControl上可以驻留以下3类命令。
(1)实现了响应单击事件的ICommand接口的单击命令。用户单击事件,会导致ICommand::OnClick方法的调用,并执行某种动作。通过改变ICommand::Checked属性的值,简单命令项的行为就像开关那样。单击命令可以驻留在菜单中的唯一命令类型。
(2)实现了ICommand接口和ITool接口、需要终端用户与“伙伴控件”的显示进行交互的工具。ToolbarControl维护CurrentTool属性。当终端用户单击ToolbarControl上的工具时,该工具就成为CurrentTool。ToolbarControl会设置“伙伴控件”的CurrentTool属性。当某个工具为CurrentTool时,该工具会从“伙伴控件”收到鼠标和键盘事件。
(3)实现ICommand接口和IToolControl接口的工具控件。
这通常是用户界面组件。ToolbarControl驻留了来自IToolControl:hWnd属性窗口句柄提供的一个小窗口,只能向ToolbarControl添加特定工具控件的一个例程。

可以使用3种方法向ToolbarControl添加命令,第1种是指定唯一识别命令的一个UID,第2种是指定一个progID,第3种是给AddToolbarDef方法提供某个现有命令对象的一个例程。下面给出样例代码:
//Add a toolbardef by passing a UID
UID uID = new UIDsClass();
uID.Value = “esriControls.ControlsMapNavigationToolbar”;
axToolbarControl1.AddToolbarDef(uID, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
//Add a toolbar def by passing a ProgID
string progID = “esriControls.ControlsMapNavigationToolbar”;
等属性同步。改变UpdateInterval属性可以更改更axToolbarControl1.AddToolbarDef(progID, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
//Add a toolbardef by passing an IToolbarDef
IToolBarDef toolBarDef = new ControlsMapNavigationToolbarClass();
axToolbarControl1.AddToolbarDef(toolBarDef, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);

ToolbarControl更新命令的使用。默认情况下,ToolbarControl每半秒钟自动更新一次,以确保驻留在ToolbarControl上的每个工具条命令项的外观与底层命令的Enabled、Bitmap、Caption新频率。UpdateInterval为0会停止任何自动发生的更新,可以通过编程调用Update方法以刷新每个工具条命令项的状态。
在应用程序中首次调用Update方法时,ToolbarControl会检查每个工具条命令项的底层命令的ICommand::OnCreate方法是否已经被调用过,如果还没有调用过该方法,该ToolbarCommand将作为钩子被自动传递给ICommand::OnCreate方法。

时间: 2024-12-09 06:19:07

ArcGIS Engine开发之旅03--ArcGIS Engine中的控件的相关文章

ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

原文 ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他类库提供服务的组件.System类库中定义了大量开发者可以实现的接口.AoInitializer对象就是在System类库中定义的,所有的开发者必须使用这个对象来初始化ArcGISEngine和解除ArcGIS Engine的初始化.开发者不能扩展这个类库,但可以通过实现这个类库中包含的接口来扩展A

ArcGIS Engine开发之旅05---空间数据库

原文 ArcGIS Engine开发之旅05---空间数据库 1  Geodatabase概念 Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS之上的统一的.智能的空间数据模型.“统一”是指,Geodatabase之前的多个空间数据模型都不能在一个统一的模型框架下对地理空间要素信息进行统一的描述,而Geodatabase做到了这一点:“智能化”是指,在Geodatabase模型中,对空间要素的描述和表达较之前的空间数据模型更接近我们的现实世界,更能

ArcGIS Engine开发之旅01---产品组成、逻辑体系结构

原文 ArcGIS Engine开发之旅01---产品组成.逻辑体系结构 ArcGIS Engine 由两个产品组成: ? 面向开发人员的软件开发包(ArcGIS Engine Developer kit)? 面向最终用户的运行时(ArcGIS Engine Runtime)ArcGIS Engine 开发工具包是一个基于组件的软件开发产品,可用于构建自定义GIS 和制图应用软件.它并不是一个终端用户产品,而是软件开发人员的工具包,支持四种开发环境(C++, COM, .NET,以及Java),

ArcGIS Engine开发之旅04---ARCGIS接口详细说明

原文 ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1.IField接口(esriGeoDatabase)... 2 2.IFieldEdit接口(esriGeoDatabase)... 2 3.IFields接口(esriGeoDatabase)... 2 4. IRow接口(esriGeoDatabase)... 3 5. ITable接口(esriGeoDatabase)... 3 6. IArea接口(esriGeometry)

ArcGIS Engine开发之旅09--几何对象和空间参考

1.Geometry  Geometry 是 GIS 中使用最为广泛的对象集之一,用户在创建.删除.编辑和进行地理分析的时候,就是处理一个包含几何形体的矢量对象:除了显示要素意外,控件对象选择,要素符号化,标注要素,编辑要素都需要 Geometry 参与.在 ArcGIS Engine 中,几个对象都有严格的定义,比如我们所说的直线,多断线等,于此同时 ArcGIS Engine 提供了而一个几何对象的模型图,如下: 2.Geometry 集合接口 通过前边对于具体的 Geometry 对象的介

ArcGIS Engine开发之旅08--和查询相关的对象和接口

查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询.在介绍查询的时候,让我们先了解下面的对象. 1.Table 对象 Table 是不含有空间信息的一张二维表,它主要实现了 ITable 接口.在这张二维表中,每一行称之为 Row(IRow),ITable 接口 定义了对这张二维表行的插入,更新,查询,以及删除等操作. 独立表(standalone table):就是一个单独的不含空间信息的表也就是只能在 ArcMap 中 Tab

Cocos2d-x 3.x游戏开发之旅

Cocos2d-x 3.x游戏开发之旅 钟迪龙 著   ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x 3.x游戏开发之旅>是<Cocos2d-x游戏开发之旅>的升级版,修改了Cocos2d-x 2.0版进阶到3.0版后的一些内容,新增了对CocoStudio.UI编辑器.Cocos2d-x 3.x新特性以及网络方面的知识点.主要介绍常用的API使用方式:如何通过官方Demo获取更多关于Coc

我的nice长连接(socket)开发之旅

15年的3月份,开启nice长连接(socket)开发之旅. android先接入跟服务端做长连接项目,我与server同学,server同学告诉我,我们整体的协议体用二进制协议+thrift.head用22个字节,body 用thrift.我说可以,然后我们花了一天的时间开始写demo.花了一天的时间调试握手协议和心跳协议调通,感觉是不是可以了.然而第三天iOS的同学接入,使用thrift ios需要引入boost库,boost库比较大(30mb+),编译时间也很长(我试编译了一次15分钟没有

【转】Android 开发之旅:view的几种布局方式及实践

引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理及布局文件可谓有了比较深刻的认识和理解,并且用“Hello World!”程序来实践证明了.在继续深入Android开发之旅之前,有必要解决前两篇中没有介绍的遗留问题:View的几种布局显示方法,以后就不会在针对布局方面做过多的介绍.View的布局显示方式有下面几种:线性布局(Linear Layout).