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

时间:2020-12-18 03:25:51
原文: 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所示。ArcGIS Engine开发之旅03--ArcGIS Engine中的控件

 

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

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

1.2 IMapControl2接口

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

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

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是视频刷新触发事件。ArcGIS Engine开发之旅03--ArcGIS Engine中的控件

 

 

 2、页面布局控件

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

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

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方法。