Differenze tra le versioni di "Disegnare un mirino come cursore del mouse su una MapView"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "E' possibile disegnare un mirino come cursore del mouse, quando ci si sposta su una ''MapView'' e mostrare la latitudine e la longitudine corrispondente al centro del mirino....")
 
Riga 15: Riga 15:
 
   Dim pn As Panel
 
   Dim pn As Panel
 
    
 
    
   Me.Mouse = Mouse.Blank
+
   With Me
 +
    .W = Screen.AvailableWidth
 +
    .H = Screen.AvailableHeight
 +
    .Arrangement = Arrange.Fill
 +
    .Mouse = Mouse.Blank
 +
  End With
 
    
 
    
 
   With MapView1.Map
 
   With MapView1.Map
Riga 48: Riga 53:
 
  '''Public''' Sub MapView1_Draw()
 
  '''Public''' Sub MapView1_Draw()
 
    
 
    
   Dim c, x, y, r, px, py As Short
+
   Dim c, x, y, r As Short
  Dim w, h As Byte
 
 
   Dim po As Point = MapView1.Map.MapPointToPixelRel(mp)
 
   Dim po As Point = MapView1.Map.MapPointToPixelRel(mp)
 
    
 
    
Riga 71: Riga 75:
 
       po.X = x + r * Cos(Rad(c))  
 
       po.X = x + r * Cos(Rad(c))  
 
       po.Y = y + r * Sin(Rad(c))
 
       po.Y = y + r * Sin(Rad(c))
       mp = MapView1.Map.PixelToMapPointRel(po)
+
       .MoveTo(po.X, po.Y)
      Select Case c
+
<FONT Color=gray>' ''Per ridurre la lunghezza della "x" per i gradi 0, 90, 180 e 270 è necessaria questa sequenza: +n 0 -n 0 che si ottiene con il Coseno di c.''
        Case 0
+
' ''Per ridurre la lunghezza della "y" per i gradi 0, 90, 180 e 270 è necessaria questa sequenza: 0 -n 0 +n che si ottiene con il Coseno di c + 90.''</font>
          px = po.X - 30
+
       .LineTo(x + (20 * Round(Cos(Rad(c)))), y - (20 * Round(Cos(Rad(c + 90)))))
          py = po.Y
+
      .Stroke
          w = 30
 
          h = 2
 
        Case 90
 
          px = po.X
 
          py = po.Y - 30
 
          w = 2
 
          h = 30
 
        Case 180
 
          px = po.X
 
          py = po.Y
 
          w = 30
 
          h = 2
 
        Case 270
 
          px = po.X
 
          py = po.Y
 
          w = 2
 
          h = 30
 
      End Select
 
       .DrawRect(px, py, w, h, Color.Red, 1)
 
 
     Next
 
     Next
 
     .End
 
     .End

Versione delle 09:33, 16 apr 2021

E' possibile disegnare un mirino come cursore del mouse, quando ci si sposta su una MapView e mostrare la latitudine e la longitudine corrispondente al centro del mirino.
Si farà uso della "DrawingArea", Oggetto "Figlio" di un "Panel", "Figlio" quest'ultimo a sua volta dell'Oggetto "MapView":

MapView
 padre di un
Panel
 padre di una
DrawingArea

Mostriamo di seguito un codice esemplificativo:

Private mp As MapPoint = MapPoint(41.8903, 12.492255)
Private DrawingArea1 As DrawingArea
 
 
Public Sub Form_Open()
 
 Dim pn As Panel
 
 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
   .Mouse = Mouse.Blank
 End With
 
 With MapView1.Map
   .AddTile("GoogleMap", "https://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}")
   .Zoom = 15
' Imposta il centro della mappa:
   .Center = mp
 End With
 
' Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel":
 pn = MapView1.Children[0]
' Quindi individua l'Oggetto "Figlio" del "Panel", che è una "DrawingArea":
 DrawingArea1 = pn.Children[0]
  
End
 
Public Sub MapView1_MouseMove()
 
 Dim pt As New Point(Mouse.X, Mouse.Y)
 Dim lat As Float = MapView1.Map.PixelToMapPointRel(pt).Lat
 Dim lon As Float = MapView1.Map.PixelToMapPointRel(pt).Lon
 
 mp = MapPoint(lat, lon)
 
 Me.Text = "Lat. " & Format(lat, "0.######") & "  -  Lon. " & Format(lon, "0.######")
 
 MapView1.Refresh
 MapView1.Map.Refresh
 
End

Public Sub MapView1_Draw()
 
 Dim c, x, y, r As Short
 Dim po As Point = MapView1.Map.MapPointToPixelRel(mp)
 
 With Paint
' Disegna sull'Oggetto "Figlio" del "Panel", che è una "DrawingArea", la stessa che la Classe "MapView" usa per mostrare la mappa:
   .Begin(DrawingArea1)
   .Brush = .Color(Color.DarkOrange)
   .LineWidth = 2.0
   .Arc(MapView1.Map.MapPointToPixelRel(mp).X, MapView1.Map.MapPointToPixelRel(mp).Y, 50, 0, 360, False)
   .Arc(MapView1.Map.MapPointToPixelRel(mp).X, MapView1.Map.MapPointToPixelRel(mp).Y, 30, 0, 360, False)
   .Stroke
   .Brush = .Color(Color.Red)
   .Arc(MapView1.Map.MapPointToPixelRel(mp).X, MapView1.Map.MapPointToPixelRel(mp).Y, 1.5, 0, 360, False)
   .Fill
   
   r = 50
   x = po.X
   y = po.Y
   
   For c = 0 To 360 Step 90
     po.X = x + r * Cos(Rad(c)) 
     po.Y = y + r * Sin(Rad(c))
     .MoveTo(po.X, po.Y)
' Per ridurre la lunghezza della "x" per i gradi 0, 90, 180 e 270 è necessaria questa sequenza: +n 0 -n 0 che si ottiene con il Coseno di c.
' Per ridurre la lunghezza della "y" per i gradi 0, 90, 180 e 270 è necessaria questa sequenza: 0 -n 0 +n che si ottiene con il Coseno di c + 90.
     .LineTo(x + (20 * Round(Cos(Rad(c)))), y - (20 * Round(Cos(Rad(c + 90)))))
     .Stroke
   Next
   .End
 End With
 
End