dr[j] = pFeature.get_Value(j).ToString(); } }
dt.Rows.Add(dr);
pFeature = pFeatureCursor.NextFeature(); }
GeoMapAttribute frmTable = new GeoMapAttribute(); frmTable.Show();
frmTable.dataGridView1.DataSource = dt; } }
上面的所有代码,还可以进行优化,先应该利用鼠标右键点击目标图层,并弹出列表菜单,其中应该包含打开属性表。当用户用鼠标选择弹出菜单中的打开属性表时,系统才显示所选图层的属性表。这样利用后面的ToolbarControl和有关菜单定制方面的知识。随后再讲。
2.4 ToolbarControl及相关对象
2.4.1 概述
ToolbarControl命名空间包含以下6个对象及相关接口:ToolbarControl、ToolbarItem、ToolbarMenu、CommandPool、CustomizeDialog、MissingCommand。这些对象之间的结构关系,如下图所示。
ToolbarControl ToolbarItem CustomizeDialog ToolbarMenu CommandPool MissingComman
图 ToolbarControl及相关对象之间的关系
ToolbarControl要与一个伙伴控件协同工作。伙伴控件可以是MapControl、
PageLayoutControl、ReaderControl、SceneControl或GlobeControl。伙伴控件可以利用ToolbarControl控件的属性页设置,也可以通过编程设置。该控件的伙伴控件都实现了IToolbarBuddy接口,这个接口用于设置伙伴控件的CurrenTool属性。ToolbarControl不仅提供了部分用户界面,而且还提供了部分应用程序框架。ArcGIS Desktop应用程序,如ArcMap、ArcGlobe和ArcScene等具有强大而灵活的框架,包括诸如工具条、命令、菜单、泊靠窗口和状态条等用户界面组件。这种框架是终端用户可以通过改变位置、添加和删除这些用户界面组件来定制应用程序。
2.4.2 ToolbarControl控件
ToolbarControl使用钩子(hook)来联系命令对象和MapControl或PageLayoutControl控件,并提供属性、方法和事件用于:
?管理控件外观 ?设置伙伴控件 ?添加、删除命令项 ?设置当前工具 ?定制工具
该控件的主要接口包括: ?IToolbarControl ?IToolbarControl2
?IToolbarControlEvents
(1)IToolbarControl
该接口是任何与ToolbarControl有关任务的出发点,如设置控件外观、设置伙伴控件、添加或取出命令、工具、菜单、定制ToolbarControl的内容等。
IToolbarControl接口提供的主要属性包括:Buddy、CommandPool、CurrentTool、Customize、CustomProperty、Enabled、Object、OptionStack、ToolTips、TextAlignment、UpdateInterval等。
IToolbarControl接口提供的主要方法包括:AddItem、AddMenuItem、AddToolbarDef、Find、GetItemRect、HitTest、MoveItem、Remove、RemoveAll、SetBuddyControl、Update等。
(2)IToolbarControl2
该接口在继承IToolbarControl接口的基础上,又添加了一些新的方法和属性。代表目前版本的最新接口。
(3)IToolbarControlEvents
该接口是一个事件接口,它定义了ToolbarControl能够处理的全部事件。如
OnDoubleClick、OnItemClick、OnKeyDown、OnKeyUp、OnMouseDown、OnMouseUp和OnMouseMove等。
(4)ToolbarControl上的命令
在ToolbarControl上可以以下驻留三类命令:
1)实现了相应单击事件的ICommand接口的单击命令(简单命令)。用户单击事件会导致对ICommand:OnClick方法的调用,并执行某种操作。通过改变ICommand:Checked属性的值,简单命令项的行为就像开关那样,单击命令是可以驻留在菜单中的唯一命令类型。
2)实现了ICommand接口和ITool接口、需要终端用户与伙伴控件的显示进行交互的工具。ToolbarControl维护着一个CurrentTool属性,当终端用户单击ToolbarControl上的工具时,该工具就成为CurrentTool,而前一个工具就处于非活动状态。ToolbarControl会设置伙伴控件的CurrentTool属性,当某个工具为CurrentTool时,该工具会从伙伴控件收到鼠标和键盘事件。
3)实现了ICommand接口和IToolControl接口的工具控件。这通常为用户界面组件,象ToolbarControl上的列表框和组合框。ToolbarControl驻留了来自IToolControl:hWnd属性窗口句柄提供的一个小窗口。只能向ToolbarControl添加特定工具控件的一个例程。
有三种方法可以将命令添加到ToolbarControl中。第一种方法是指定唯一识别命令的一个UID对象(使用GUID),使用示例如下:
UID uID = new UIDClass();
uID.Value = \; axToolbarControl1.AddItem(uID, -1, -1, false, 0,
esriCommandStyles.esriCommandStyleIconOnly);
第二种方法指定一个progID,使用示例如下:
string progID = \; axToolbarControl1.AddItem(progID, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
第三种方法是提供某个现有命令对象的一个例程,使用示例如下:
ICommand command = new ControlsMapFullExtentCommandClass(); axToolbarControl1.AddItem(command, -1, -1, false, 0, esriCommandStyles.esriCommandStyleIconOnly);
上述三种方法将都是调用AddItem方法将命令加入ToolbarControl中,该方法参数的具体含义请查阅相应的帮助文档。
(5)更新命令
默认情况下,ToolbarControl每半秒自动更新其自身一次,以确保驻留在ToolbarControl上的每个工具条命令项的外观与其底层命令的Enabled、Bitmap和Caption属性同步。改变UpdateInterval属性可以更改更新的频率。在应用程序首次调用Update方法时,ToolbarControl会检查每个工具条命令项底层命令的ICommand:OnCreate方法来检查是否已经被调用过。若还没有调用过该方法,则ToolbarControl将作为钩子(hook)被自动传递给ICommand:OnCreate方法。
(6)定制
利用鼠标选择窗体上的ToolbarControl空间实例对象,在单击鼠标右键,将弹出该
axToolbarControl实例对象的属性对话框,选择属性对话框面板上的Items页面,利用其中的Add和Remove All命令按钮,就可以定制ToolbarControl控件上的命令、工具、菜单等。
2.4.3 ToolbarItem
ToolbarItem就是驻留在Toolbarcontrol或工具条菜单上的单个Command、Tool、
ToolControl或Menu Item菜单。ToolbarItem接口的属性决定工具条命令项的外观。例如,工具条命令项是否在其左侧有一条垂直线表示是否开始一个命令组(Group)、命令项的样式是否有一个位图、标题或两者都有。
ToolBarItem是一个不可创建的对象,引用不可创建的对象必须通过其它对象获得。ToolbarItem的主要接口是IToolbarItem,该接口下面包含的属性如下图所示。
图 IToolbarItem接口的属性
2.3.4 ToobarMenu组件类
ToolbarControl可以驻留下拉菜单。工具条菜单(ToolbarMenu)表示单击命令项的一个垂直列表。用户必须选择工具条菜单上的一个命令项,或单击工具条菜单之外的地方使其消失。工具条菜单只能驻留命令项(不允许驻留工具或工具控件),工具条菜单本身可以驻留在ToolbarControl上,作为子菜单驻留在另一个工具条菜单上,或者作为右键单击弹出式菜单。
每个Toolbarcontrol和工具条菜单都有一个命令池(CommandPool),用于管理其使用的命令对象集。命令池中的对象可以重复添加,软件开发人员可以通过编程探测命令池中的对象是否已经添加过,在实际GIS软件开发中,相同的命令对象在命令池中只添加一次。
ToolbarMenu的主要接口是IToolbarMenu,该接口包含的主要成员如下图所示。
图 ToolbarMenu接口的主要成员
2.5 ControlCommands
ControlCommands命名空间中提供了大量的命令、工具条及工具、工具控件和菜单。利用ArcGIS Engine进行GIS软件开发,可以直接使用这些对象,使用这些对象包括两种方式,一是通过Toolbarcontrol控件使用,另外一种是不通过Toolbarcontrol控件使用。开发人员在实际软件开发过程中,可以创建自己的自定义命令、工具和菜单来扩展ArcGIS Engine提供的命令集。HookHelper、GlobeHookHelper和SceneHookHelper对象可以简化这种开发。
2.5.1 通过ToolbarControl控件使用ControlCommands
通过Toolbarcontrol控件使用ControlCommands有三条途径:
(1)在程序设计阶段,利用ToolbarControl控件的属性页设置;
(2)在程序代码中,使用AddItem、AddMenuItem或AddToolbarDef方法将要用到的ControlCommands的实例对象添加到ToolbarControl控件中。命令可以使用AddItem或AddSubMenu方法添加到ToolbarMenu上。
(3)最终用户可以通过Customize对话框进行设置。
2.5.2 不通过ToolbarControl控件使用ControlCommands