VB代码:

复制进程序稍作修改变量名和事件逻辑即可使用。

Members

  AllPropertiesMethodsInheritedNon-inherited Description
Display The display the feedback object will use.
MoveTo Move to the new point.
Refresh Call this after a refresh to show feedback again.
Start Begins a move feedback of the given shape.
Stop Stops the feedback and returns the shape.
Symbol The symbol the feedback object will use.

Moving Feedbacks Example

This example shows how to create a tool which allows the user to move various geometry types using the appropriate feedback interfaces. The example requires there to be at least one of the following in the current document's BasicGraphicsLayer: MarkerElement, LineElement, RectangleElement, or PolygonElement. When the mouse button is pressed a search is made for any elements which intersect the mouse location. If any are found, then the first of these is taken. If the element's geometry is a Point, Polyline, Envelope or Polygon, then a Feedback object of that type is created, otherwise nothing is created and the routine will exit. Once the feedback has been created, any subsequent mouse movements cause this feedback to be moved on the screen. Releasing the mouse button will stop the feedback and update the element with the new geometry. The ActiveView is then refreshed.

How to use:

In ArcMap, select Tools | Customize...

Select the Commands tab and scroll down to UIControls in the left pane.

Click NewUIControl...

In the dialog which appears select UIToolControl and then click Create.

Drag the new tool which appears in the right pane onto a toolbar of your choosing.

Right-click over your tool on the toolbar and select View Source.

Copy and paste the code below into the VBA code pane which appears.

Close the VBA Window and return to the ArcMap Window.

Now select your tool from the toolbar and click on a graphic element (Marker, Line, Rectangle, Polygon) and move the mouse until the desired location is reached. Releasing the mouse button to finish.

Private m_pDoc As IMxDocument

Private m_pAV As IActiveView

Private m_pScrD As IScreenDisplay

Private m_pDispFeed As IDisplayFeedback

Private m_pHitElem As IElement

Private m_pGraCont As IGraphicsContainer

Private Function UIToolControl1_Enabled() As Boolean

  'Set the ToolControl to enabled (disabled by default)

  UIToolControl1_Enabled = True

End Function

Private Sub UIToolControl1_MouseDown(ByVal button As Long, ByVal shift As Long, ByVal x As Long, ByVal y As Long)

  Dim pPnt As IPoint

  Dim pGeomElem As IGeometry

  ' Get the current mouse location in Map Units

  Set pPnt = m_pScrD.DisplayTransformation.ToMapPoint(x, y)

  ' Use a function to return the first element at this point (if any)

  Set m_pHitElem = GetHitElement(pPnt)

  ' If an element was returned then check what type of geometry it has (Point, Polyline, Envelope or Polygon)

  If Not m_pHitElem Is Nothing Then

    Set pGeomElem = m_pHitElem.Geometry

    'Point geometry

    If TypeOf pGeomElem Is IPoint Then

      ' Create a MovePointFeedback object and set its display property (to the ActiveView's ScreenDisplay)

      Set m_pDispFeed = New MovePointFeedback

      Set m_pDispFeed.Display = m_pScrD

      ' QI for the IMovePointFeedback interface

      Dim pMvPtFeed As IMovePointFeedback

      Set pMvPtFeed = m_pDispFeed

      'Start the feedback using the input (Point) geometry at the current mouse location

      pMvPtFeed.Start pGeomElem, pPnt

    ' Polyline geometry

    ElseIf TypeOf pGeomElem Is esriCore.IPolyline Then

      ' Create a MoveLineFeedback object and set its display property (to the ActiveView's ScreenDisplay)

      Set m_pDispFeed = New MoveLineFeedback

      Set m_pDispFeed.Display = m_pScrD

      ' QI for the IMoveLineFeedback interface

      Dim pMvLnFeed As IMoveLineFeedback

      Set pMvLnFeed = m_pDispFeed

      'Start the feedback using the input (Polyline) geometry at the current mouse location

      pMvLnFeed.Start pGeomElem, pPnt

    ' Rectangle (Envelope) geometry

    ElseIf TypeOf pGeomElem Is IEnvelope Then

      ' Create a MoveEnvelopeFeedback object and set its display property (to the ActiveView's ScreenDisplay)

      Set m_pDispFeed = New MoveEnvelopeFeedback

      Set m_pDispFeed.Display = m_pScrD

      ' QI for the IMoveEnvelopeFeedback interface

      Dim pMvEnvFeed As IMoveEnvelopeFeedback

      Set pMvEnvFeed = m_pDispFeed

      'Start the feedback using the input (Rectangle) geometry at the current mouse location

      pMvEnvFeed.Start pGeomElem, pPnt

    ' Polygon geometry

    ElseIf TypeOf pGeomElem Is IPolygon Then

      ' Create a MovePolygonFeedback object and set its display property (to the ActiveView's ScreenDisplay)

      Set m_pDispFeed = New MovePolygonFeedback

      Set m_pDispFeed.Display = m_pScrD

      ' QI for the IMovePolygonFeedback interface

      Dim pMvPolyFeed As IMovePolygonFeedback

      Set pMvPolyFeed = m_pDispFeed

      'Start the feedback using the input (Polygon) geometry at the current mouse location

      pMvPolyFeed.Start pGeomElem, pPnt

    End If

  End If

End Sub

Private Sub UIToolControl1_MouseMove(ByVal button As Long, ByVal shift As Long, ByVal x As Long, ByVal y As Long)

  If Not m_pDispFeed Is Nothing Then

    Dim pPnt As IPoint

    ' Get the current mouse location in Map Units and move the feedback

    Set pPnt = m_pScrD.DisplayTransformation.ToMapPoint(x, y)

    m_pDispFeed.MoveTo pPnt

  End If

End Sub

Private Sub UIToolControl1_MouseUp(ByVal button As Long, ByVal shift As Long, ByVal x As Long, ByVal y As Long)

  Dim GeomResult As IGeometry

  Dim pGeomElem As IGeometry

  ' Check that the user is using the feedback

  If Not m_pHitElem Is Nothing Then

    ' Get the geometry type for our element again

    Set pGeomElem = m_pHitElem.Geometry

    ' Check what type of geometry the element has  (again)

    ' Point geometry

    If TypeOf pGeomElem Is IPoint Then

      ' QI for the IMovePointFeedback interface and get the finished geometry

      Dim pMvPtFeed As IMovePointFeedback

      Set pMvPtFeed = m_pDispFeed

      Set GeomResult = pMvPtFeed.Stop

    ElseIf TypeOf pGeomElem Is IPolyline Then

      ' QI for the IMoveLineFeedback interface and get the finished geometry

      Dim pMvLnFeed As IMoveLineFeedback

      Set pMvLnFeed = m_pDispFeed

      Set GeomResult = pMvLnFeed.Stop

    ElseIf TypeOf pGeomElem Is IEnvelope Then

      ' QI for the IMoveEnvelopeFeedback interface and get the finished geometry

      Dim pMvEnvFeed As IMoveEnvelopeFeedback

      Set pMvEnvFeed = m_pDispFeed

      Set GeomResult = pMvEnvFeed.Stop

    ElseIf TypeOf pGeomElem Is IPolygon Then

      ' QI for the IMovePolygonFeedback interface and get the finished geometry

      Dim pMvPolyFeed As IMovePolygonFeedback

      Set pMvPolyFeed = m_pDispFeed

      Set GeomResult = pMvPolyFeed.Stop

    End If

    ' Set the geometry of the element and call update

    m_pHitElem.Geometry = GeomResult

    m_pGraCont.UpdateElement m_pHitElem

    ' Clear out the objects

    Set m_pDispFeed = Nothing

    Set m_pHitElem = Nothing

    ' Refresh the ActiveView

    m_pAV.Refresh

  End If

End Sub

Private Sub UIToolControl1_Refresh(ByVal hDC As Long)

  'Get a reference to the ActiveView and ScreenDisplay

  Set m_pDoc = Application.Document

  Set m_pAV = m_pDoc.ActiveView

  Set m_pScrD = m_pAV.ScreenDisplay

End Sub

Private Sub UIToolControl1_Select()

  'Get a reference to the ActiveView and ScreenDisplay

  Set m_pDoc = Application.Document

  Set m_pAV = m_pDoc.ActiveView

  Set m_pScrD = m_pAV.ScreenDisplay

End Sub

Private Function GetHitElement(pInPt As IPoint) As IElement

' Takes an IPoint and returns the first element that is hit (if any) in the ActiveView's BasicGraphicsLayer

  Dim pEnumElem As IEnumElement

  Dim DblSrchDis As Double

  ' QI for the IGraphicsContainer interface from the IActiveView, allows access to the BasicGraphicsLayer

  Set m_pGraCont = m_pAV

  ' Calculate the Search Distance (in MapUnits) based upon a portion of the ActiveView's width

  DblSrchDis = m_pAV.Extent.Width / 

  ' Return an enumerator for those elements found within the search distance (in mapunits)

  Set pEnumElem = m_pGraCont.LocateElements(pInPt, DblSrchDis)

  ' If the enumerator is not empty then return the FIRST element found

  If Not pEnumElem Is Nothing Then

    Set GetHitElement = pEnumElem.Next

  End If

End Function

arcgis engine 监听element的添加、更新和删除事件(使用IMovePointFeedback)的更多相关文章

  1. arcgis engine 监听element的添加、更新和删除事件(使用IGraphicsContainerEvents)

    IGraphicsContainerEvents Interface 如何监听 element事件? 如,当我们在Mapcontrol上添加.删除.更新了一个Element后,如何捕捉到这个事件?   ...

  2. 如何监听Element组件<el-input>标签的回车事件

    一.现象 表单提交时需要处理输入框的回车事件,一般的原生input标签可以用@keyup.enter="onSubmit"(tips:onSubmit为定义的方法) 二.解决 1. ...

  3. ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新

    ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 来自:http://blog.csdn.net/freewaywalker/article/details/23703863 ...

  4. [转] ArcGIS engine中气泡标注的添加、修改

    小生 原文 ArcGIS engine中气泡标注的添加.修改! 你微微地笑着,不同我说什么话.而我觉得,为了这个,我已等待得久了.                                   ...

  5. Android 另类方法监听软键盘的弹出收起事件

    http://www.cnblogs.com/csonezp/p/5065624.html 最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且 ...

  6. Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存

    一. Canal 简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同 ...

  7. vue watch 监听element upload组件上传成功返回的url列表

    因为 on-success 上传成功返回的是一个异步的结果....如果父组件需要这个结果的话 必须用watch 监听 然后里面建立一个 save()方法 save方法里面再调用接口 传需要的上传之后的 ...

  8. angular指令监听ng-repeat渲染完成后执行自定义事件方法

    今天工作中遇到需要用到ng-repeat遍历渲染完后执行某个操作,angular本身并没有提供监听ng-repeat渲染完成的指令,所以需要自己创建自定义指令. 在ng-repeat模板实例内部会暴露 ...

  9. 监听文本框输入oninput和onpropertychange事件

    前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onkeydow ...

随机推荐

  1. C++智能指针详解

    本文出自http://mxdxm.iteye.com/ 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最 ...

  2. jackson官方快速入门文档

    官方地址: http://jackson.codehaus.org/ http://wiki.fasterxml.com/JacksonInFiveMinutes http://wiki.faster ...

  3. [django]django+post+ajax+highcharts使用方法

    直接代码展示: view.py文件代码 from django.http import JsonResponse #django ajax部分 def ajax_kchart(request): ti ...

  4. UVALive 4670 Dominating Patterns --AC自动机第一题

    题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio& ...

  5. POJ2505 A multiplication game[博弈论]

    A multiplication game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6028   Accepted:  ...

  6. SQL高级查询:嵌套和分页

    1.嵌套子查询 --查询最近一次oop考试没有参加考试的学生 select StudentName from Student where StudentNo not in( select Studen ...

  7. Flash Builder 4.7 注册机完美激活方法

    Flash Builder 4.7 破解注册方法目前较为通用的三种方法: 第一种:三步修改配置文件方法,这种有开发者反应这种方法在升级和创建纯 AS 项目时会存在问题,但我懒的去试这种方法的主要原因是 ...

  8. AutoCAD2006的安装及CASS7.1的配置破解

    -----本文只限于学习交流,商业用途请支持正版! -----转载请注明:http://www.cnblogs.com/mxbs/p/6193190.html 准备: AutoCAD2006.CASS ...

  9. block的哪些事 --- 学习笔记十

    //带有自动变量值的匿名函数 //block 与 C语言函数比只有两点不同,1.没有函数名. 2.带有"^". //类似于方法,如B中的值传给A中,在B中,一. 定义 : 二. 实 ...

  10. BZOJ 1797: [Ahoi2009]Mincut 最小割

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2076  Solved: 885[Submit] ...