Disegnare sulla MapView dei cerchi concentrici al punto ove si è cliccato con il puntatore del mouse

Da Gambas-it.org - Wikipedia.

Mostreremo di seguito un possibile codice, sufficientemente commentato, con il quale disegnare in sequenza temporale sulla MapView dei cerchi concentrici al punto ove si è cliccato con il puntatore del mouse.

Se si clicca sulla MapView con il tasto destro del mouse, allora saranno disegnati in sequenza temporale i cerchi concentrici, e alla fine di tale effetto grafico resterà un puntino pieno rosso.
Se si clicca con il tasto centrale del mouse, allora i punti precedentemente disegnati saranno cacellati dalla superficie della MapView.

E' necessario attivare il Componente gb.map.

Private MapView1 As MapView
Private pn As Panel
Private mmpp As MapPoint[]
Private ct As Short

Public Sub Form_Open()

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With
 With MapView1 = New MapView(Me) As "MapView1"
   .Map.AddTile("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}")
   .Map.Zoom = 14
' Imposta il centro della mappa all'inizio:
   .Map.Center = New MapPoint(44.407335, 8.918706)
 End With 

' Individua l'Oggetto "Figlio" della "MapView", che è un "Panel":
 pn = MapView1.Children[0]

' Crea un array di Oggetti "MapPoint" per memorizzare le coordinate geografiche di tutti i punti ove si è cliccato sulla mappa e conseguentemente per farli ridisegnare ogni volta sulla superficie della "MapView":
 mmpp = New MapPoint[]

End


Public Sub MapView1_MouseUp()

' Se si clicca con il tasto destro del mouse, sono disegnati sulla superficie della "MapView" dei cerchi concentrici al punto ove si è cliccato, e sono confermati anche gli eventuali punti precedentemente impostati:
 If Mouse.Right Then 
   Dim pt As Point
   Dim c As Short
   pt = New Point(Mouse.X, Mouse.Y)
' Memorizza le coordinate geografiche del punto ove si è cliccato sulla mappa:
   mmpp.Push(MapView1.Map.PixelToMapPointRel(pt))
' Fornisce i dati per far disegnare dei cerchi concentrici in sequenza sulla mappa, mostrata dall'Oggetto "MapView":
   For c = 28 DownTo 1 Step 3
     ct = c
     MapView1.Refresh
     Wait 0.1
   Next 
   Me.Text = Format(MapView1.Map.PixelToMapPointRel(pt).Lat, "0.000000") & "   " &
             Format(MapView1.Map.PixelToMapPointRel(pt).Lon, "0.000000")
 Endif 

' Se si clicca con il tasto centrale del mouse, i punti precedentemente disegnati sono cacellati dalla superficie della "MapView":
 If Mouse.Middle Then 
   mmpp.clear
   MapView1.Refresh
 Endif 

End


Public Sub MapView1_Draw()

 If mmpp.Count == 0 Then Return 
 
 Dim i As Integer

 With Paint
' Il disegno sarà possibile solo sull'Oggetto "Figlio" del "Panel" (a sua volta "Figlio" della "MapView"), che è una "DrawingArea":
   .Begin(pn.Children[0])
   .Brush = .Color(Color.Red)
' Disegna i punti precedentemente impostati sulla "MapView":
   For i = 0 To mmpp.Max - 1
' Si passano al Metodo ".Arc()" le coordinate geografiche memorizzate in precedenza per ciascun punto cliccato:
     .Arc(MapView1.Map.MapPointToPixelRel(mmpp[i]).X, MapView1.Map.MapPointToPixelRel(mmpp[i]).Y, 2, Rad(0), Rad(360), False)
     .Fill
   Next 
' Disegna il punto corrente (ossia l'ultimo) ove si è cliccato, passando al Metodo ".Arc()" le sue coordinate geografiche memorizzate:
   .Arc(MapView1.Map.MapPointToPixelRel(mmpp[mmpp.Max]).X, MapView1.Map.MapPointToPixelRel(mmpp[mmpp.Max]).Y, 2 * ct, Rad(0), Rad(360), False)
   If ct > 1 Then 
' Disegna i cerchi rossi concentrici:
     .Stroke
   Else 
' Disegna il puntino rosso finale:
     .Fill
   Endif 
   .End
 End With

End