About the Simple dynamic display application Sample
[C#]
MyDynamicLayer.cs
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Timers; using ESRI.ArcGIS.ADF; using ESRI.ArcGIS.ADF.Connection.Local; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.SystemUI; namespace MyDynamicDisplayApp { public sealed class MyDynamicLayer : BaseDynamicLayer { public bool m_bOnce = true; private IDynamicGlyph m_myGlyph = null; private IDynamicSymbolProperties2 m_dynamicSymbolProps = null; private IPoint m_point = null; private double m_stepX = 0; private double m_stepY = 0; private Timer m_updateTimer = null; public MyDynamicLayer() : base() { base.m_sName = "My Dynamic layer"; m_updateTimer = new Timer(15); m_updateTimer.Enabled = false; m_updateTimer.Elapsed += new ElapsedEventHandler(OnTimerElapsed); } public override void DrawDynamicLayer(esriDynamicDrawPhase DynamicDrawPhase, IDisplay Display, IDynamicDisplay DynamicDisplay) { if (DynamicDrawPhase != esriDynamicDrawPhase.esriDDPImmediate) return; if (!m_bValid || !m_visible) return; IEnvelope visibleExtent = Display.DisplayTransformation.FittedBounds; if (m_bOnce) { IDynamicGlyphFactory dynamicGlyphFactory = DynamicDisplay.DynamicGlyphFactory; m_dynamicSymbolProps = DynamicDisplay as IDynamicSymbolProperties2; ICharacterMarkerSymbol markerSymbol = new CharacterMarkerSymbolClass(); markerSymbol.Font = ESRI.ArcGIS.ADF.Connection.Local.Converter.ToStdFont(new Font("ESRI Default Marker", 25.0f, FontStyle.Bold)); markerSymbol.Size = 25.0; // set the symbol color to white markerSymbol.Color = (IColor)ESRI.ArcGIS.ADF.Connection.Local.Converter.ToRGBColor(Color.FromArgb(255, 255, 255)); markerSymbol.CharacterIndex = 92; // create the dynamic glyph m_myGlyph = dynamicGlyphFactory.CreateDynamicGlyph((ISymbol)markerSymbol); Random r = new Random(); double X = visibleExtent.XMin + r.NextDouble() * visibleExtent.Width; double Y = visibleExtent.YMin + r.NextDouble() * visibleExtent.Height; m_point = new PointClass(); m_point.PutCoords(X, Y); m_stepX = visibleExtent.Width / 250; m_stepY = visibleExtent.Height / 250; // start the update timer m_updateTimer.Enabled = true; m_bOnce = false; } // draw the marker m_dynamicSymbolProps.set_DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker, m_myGlyph); m_dynamicSymbolProps.SetColor(esriDynamicSymbolType.esriDSymbolMarker, 1.0f, 0.0f, 0.0f, 1.0f); m_dynamicSymbolProps.SetScale(esriDynamicSymbolType.esriDSymbolMarker, 1.0f, 1.0f); DynamicDisplay.DrawMarker(m_point); // update the point location for the next draw cycle m_point.X += m_stepX; m_point.Y += m_stepY; // make sure that the point fall within the visible extent if (m_point.X > visibleExtent.XMax) m_stepX = -Math.Abs(m_stepX); if (m_point.X < visibleExtent.XMin) m_stepX = Math.Abs(m_stepX); if (m_point.Y > visibleExtent.YMax) m_stepY = -Math.Abs(m_stepY); if (m_point.Y < visibleExtent.YMin) m_stepY = Math.Abs(m_stepY); // set the dirty flag to false since drawing is done. base.m_bIsImmediateDirty = false; } void OnTimerElapsed(object sender, ElapsedEventArgs e) { // set the dirty flag to true in order to assure the next drawing cycle base.m_bIsImmediateDirty = true; } } }
[Visual Basic .NET]
MyDynamicLayer.vb
Imports Microsoft.VisualBasic Imports System Imports System.Collections.Generic Imports System.Text Imports System.Drawing Imports System.Timers Imports ESRI.ArcGIS.ADF Imports ESRI.ArcGIS.ADF.BaseClasses Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.Geometry Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.Display Public NotInheritable Class MyDynamicLayer : Inherits BaseDynamicLayer Public m_bOnce As Boolean = True Private m_myGlyph As IDynamicGlyph = Nothing Private m_dynamicSymbolProps As IDynamicSymbolProperties2 = Nothing Private m_point As IPoint = Nothing Private m_stepX As Double = 0 Private m_stepY As Double = 0 Private m_updateTimer As Timer = Nothing Public Sub New() MyBase.New() MyBase.m_sName = "My Dynamic layer" m_updateTimer = New Timer(15) m_updateTimer.Enabled = False AddHandler m_updateTimer.Elapsed, AddressOf OnTimerElapsed End Sub Public Overrides Sub DrawDynamicLayer(ByVal DynamicDrawPhase As esriDynamicDrawPhase, ByVal Display As IDisplay, ByVal DynamicDisplay As IDynamicDisplay) If DynamicDrawPhase <> esriDynamicDrawPhase.esriDDPImmediate Then Return End If If (Not m_bValid) OrElse (Not m_visible) Then Return End If Dim visibleExtent As IEnvelope = Display.DisplayTransformation.FittedBounds If m_bOnce Then Dim dynamicGlyphFactory As IDynamicGlyphFactory = DynamicDisplay.DynamicGlyphFactory m_dynamicSymbolProps = TryCast(DynamicDisplay, IDynamicSymbolProperties2) Dim markerSymbol As ICharacterMarkerSymbol = New CharacterMarkerSymbolClass() markerSymbol.Font = ESRI.ArcGIS.ADF.Connection.Local.Converter.ToStdFont(New Font("ESRI Default Marker", 25.0F, FontStyle.Bold)) markerSymbol.Size = 25.0 ' set the symbol color to white markerSymbol.Color = CType(ESRI.ArcGIS.ADF.Connection.Local.Converter.ToRGBColor(Color.FromArgb(255, 255, 255)), IColor) markerSymbol.CharacterIndex = 92 ' create the dynamic glyph m_myGlyph = dynamicGlyphFactory.CreateDynamicGlyph(CType(markerSymbol, ISymbol)) Dim r As Random = New Random() Dim X As Double = visibleExtent.XMin + r.NextDouble() * visibleExtent.Width Dim Y As Double = visibleExtent.YMin + r.NextDouble() * visibleExtent.Height m_point = New PointClass() m_point.PutCoords(X, Y) m_stepX = visibleExtent.Width / 250 m_stepY = visibleExtent.Height / 250 ' start the update timer m_updateTimer.Enabled = True m_bOnce = False End If ' draw the marker m_dynamicSymbolProps.DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker)= m_myGlyph m_dynamicSymbolProps.SetColor(esriDynamicSymbolType.esriDSymbolMarker, 1.0f, 0.0f, 0.0f, 1.0f) m_dynamicSymbolProps.SetScale(esriDynamicSymbolType.esriDSymbolMarker, 1.0f, 1.0f) DynamicDisplay.DrawMarker(m_point) ' update the point location for the next draw cycle m_point.X += m_stepX m_point.Y += m_stepY ' make sure that the point fall within the visible extent If m_point.X > visibleExtent.XMax Then m_stepX = -Math.Abs(m_stepX) End If If m_point.X < visibleExtent.XMin Then m_stepX = Math.Abs(m_stepX) End If If m_point.Y > visibleExtent.YMax Then m_stepY = -Math.Abs(m_stepY) End If If m_point.Y < visibleExtent.YMin Then m_stepY = Math.Abs(m_stepY) End If ' set the dirty flag to false since drawing is done. MyBase.m_bIsImmediateDirty = False End Sub Private Sub OnTimerElapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs) ' set the dirty flag to true in order to assure the next drawing cycle MyBase.m_bIsImmediateDirty = True End Sub End Class