一。关于"AO的IPoint接口"和".NET本身的Point类":
我们在AO代码编写中常常会用到IPoint接口,常常的见到的操作有:
Dim pt as IPoint----步骤1
pt=new Point---步骤2
其实这样的操作将“AO中的IPoint接口”(步骤1) 与“。NET本身的Point类”(步骤2)混合起来用了
大家不信的话,可以在AO代码编写中去掉Imports ESRI.ArcGIS.Geometry引用(IPoint接口在这个引用中), 然后大家再尝试Dim pt as IPoint操作,此时Dim pt as IPoint操作是不合法的;然后大家尝试Dim pt as Point和pt=new Point操作,此时这两个操作是合法的.以上说明了.NET中本身就有Point类供用户使用,而IPoint是AO的Geometry引用中的接口,通过仔细观察大家会发现两者的成员变量和方法实际上是一样的,也就是说,两者实质上是等价的,故先"Dim pt as IPoint"然后"pt=new Point"的操作虽然是混合操作,但完全合法的.大家了解就可以了,使用时还是照旧.
最为规范的:
Dim pt As IPoint
pt = New ESRI.ArcGIS.Geometry.Point -----使用AO的IPoint接口
Dim pt As Point
pt = New Point ----使用.NET本身的Point类
二。关于“Point类”和“IPoint接口”的“定义及初始化”(VB.NET):
(1)Dim pt_screen As New ESRI.ArcGIS.Geometry.Point
pt_screen.PutCoords(e.x, e.y)
-----这是用IPoint接口来定义pt_screen,因为接口定义变量时直接进行了NEW(即对变量默认初始化)操作,故紧接着可以可用PutCoords来进行赋值。
(2) 如果换成了Dim pt_screen As IPoint,然后编写pt_screen.PutCoords(e.x,e.y)时,就会报错(“变量pt_screen在赋值前被使用,可能会在运行时导致空应用异常“),这是因为没有经过对pt_screen进行NEW处理。
实质上,NEW处理就好比是对给予变量一个容器,如果没有容器的话,当然无法对容器内的pt_screen.x和pt_screen.y这两个成员变量(以及方法)赋予数值。
这也就好比 : 如果好比你空着双手去商场购物,如果没有购物袋(即没有NEW),你购买的物品就没有地方盛放。
(3)如果要运用IPoint接口,正确操作为:
Dim pt_map as IPoint
pt_map=new Point
pt_map.x=...
pt_map.y=... ----IPoint接口方法1
这种方法较为常见,大家都可以理解,就省略
或者
Dim pt_map As IPoint
pt_map = Me.AxMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y)----IPoint接口方法2
这种方法即对pt_map整个变量直接赋值,相当于用一个容器强行改造了另一个容器。这也就好比你仍然是空着手去商场,但是购物完毕后营业员帮你把所有货物装进袋子,然后将袋子和袋子里的东西一起塞给你,你就可以提着袋子回家了,这样的操作也是合法的。规范的来说,我们应该把以上提到的“购物袋”看作是“容器”。
三。关于参数e
在AO中axMapControl_OnMouseDown,AxMapControl1_OnMouseMove,AxMapControl1_OnMouseUp事件中有参数e,这个参数e是非常实用的,举个简单的例子(VB.NET):
Private Sub AxMapControl1_OnMouseDown(ByVal sender As System.Object, ByVal e As ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent) Handles AxMapControl1.OnMouseDown
Dim pt_map_1 As IPoint
pt_map_1 = Me.AxMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y)
Dim pt_map_2 As New ESRI.ArcGIS.Geometry.Point
pt_map_2.PutCoords(e.mapX, e.mapY)
MsgBox("from ToMapPoint: " + pt_map_1.X.ToString() + " " + pt_map_1.Y.ToString())
MsgBox("from argument e: " + pt_map_2.X.ToString() + " " + pt_map_2.Y.ToString())
End Sub
其中:得到的pt_map_1和pt_map_2是一样的