原文: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方法。

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

  1. ArcGIS Engine开发之旅10--空间参考及坐标转换

    原文:ArcGIS Engine开发之旅10--空间参考及坐标转换 空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确 ...

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

    原文:ArcGIS Engine开发之旅09--几何对象和空间参考 1.Geometry  Geometry 是 GIS 中使用最为广泛的对象集之一,用户在创建.删除.编辑和进行地理分析的时候,就是处 ...

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

    原文:ArcGIS Engine开发之旅08--和查询相关的对象和接口 查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询.在介绍查询 ...

  4. ArcGIS Engine开发之旅07---文件地理数据库、个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 、打开栅格数据

    原文:ArcGIS Engine开发之旅07---文件地理数据库.个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 .打开栅格数据 对文件地理数据库.个人地理数据库和 ArcSDE 地理 ...

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

    原文:ArcGIS Engine开发之旅05---空间数据库 1  Geodatabase概念 Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS之上的统 ...

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

    原文:ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1.      IField接口(esriGeoDatabase)... 2 2.    ...

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

    原文:ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他 ...

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

    原文:ArcGIS Engine开发之旅01---产品组成.逻辑体系结构 ArcGIS Engine 由两个产品组成:  面向开发人员的软件开发包(ArcGIS Engine Developer k ...

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

    Cocos2d-x 3.x游戏开发之旅 钟迪龙 著   ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...

随机推荐

  1. Win 8 App开发框架解析

    开发前准备: Windows 8 RTM MSDN订阅用户下载地址: https://msdn.microsoft.com/zh-cn/subscriptions/securedownloads/hh ...

  2. web farm 讨论引出

    关于web farm 有成功的实施的文档没 用它还不如 用nginx,简单易用. Nginx for windows的运行效果咋样 windows  iis无敌 玩nginx就不要用win系统,必须l ...

  3. BZOJ 1856 字符串(组合)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1856 题意:有n个1和m个0组成的串,使得任意前k个中1的个数不少于0的个数.有多少种这 ...

  4. new在c#方法中的使用

    new在c#中有三种用法: 1.实例化对象 2.泛型约束 3.用在方法前.new和override的区别在于:override用于重写父类的方法:new用于隐藏方法,它调用的方法来自于申明的类,如果申 ...

  5. MongoBD解决没有自动增长ID 的问题

    Sequence Numbers:序列号传统的数据库中,通常用一个递增的序列来提供主键,在 MongoDB中用 ObjectId 的来代替,我们可以通过如下的函数来获取主键 function coun ...

  6. 使用Spring的注解方式实现AOP

    Spring对AOP的实现提供了很好的支持.下面我们就使用Spring的注解来完成AOP做一个例子. 首先,为了使用Spring的AOP注解功能,必须导入如下几个包.aspectjrt.jar,asp ...

  7. Scala _ [underscore] magic

    I started learning Scala a few days before. Initially i was annoyed by the use of too many symbols i ...

  8. hdu Largest Rectangle in a Histogram

    这道题目是一道动态规划的题目,动态规划的点不在面积上,而在每个矩形可左右扩展的坐标上.找出每个矩形最左边和最右边比它高的矩形的下标,最后求面积即可: #include"stdio.h&quo ...

  9. Sublime之旅

    安装 http://www.sublimetext.com/3          常用操作  window版本 CTRL + P 打开文件搜索 Ctrl+K+B 打开目录树 Ctrl+Shift+[ ...

  10. 利用onekeyup即可实现验证码的点击刷新功能

    显示验证码 首先在Home/Controller下创建一个公共控制器PublicController 1 <php2 namespace Home\Controller;3 4 use Thin ...