Utilizzare una MediaView con gb.map anziché una MapView

Da Gambas-it.org - Wikipedia.

Per mostrare una mappa di un Remote Tile Server, è possibile utilizzare anche un Oggetto MediaView, fornito dal Componente "gb.media".

In particolare, bisogna considerare che un Oggetto MediaView è composto - fra l'altro - da un Oggetto MediaPlayer che a sua volta ha, come "Figlio", un Panel "Figlio" che fa da contenitore ad alcuni Oggetti grafici (suoi "Figli"), tra i quali c'è un altro Panel, che a sua volta contiene, come sua "Figlia", una DrawingArea.

Useremo tale Oggetto DrawingArea (che, come si è descritto, è uno degli Oggetti grafici che compongono l'Oggetto grafico MediaView ) per mostrare la mappa-tile.

Nel contempo sarà possibile vedere anche un file video oppure ascoltare un file audio, cliccando sul tastino di avvio, posto in basso a sinistra dell'Oggetto MediaView. In caso di visualizzazione di un Video o avvio di un file audio, la mappa-tile sarà coperta dal video o - nel caso del file audio - da uno sfondo scuro. Cliccando però sul tastino di arresto del MediaView, si tornerà a visualizzare la mappa.

Esempio pratico (ovviamente è necessario attivare i Componenti "gb.map", "gb.media" e "gb.media.form") [nota 1]:

Private MediaView1 As MediaView
Private DrawingArea1 As DrawingArea
Private mappa As Map
Private mp As New MapPoint(41.8902, 12.4923)
Private mx As Integer
Private my As Integer
Private pt As New Point
Private cpx As New Point
Private c As Short


Public Sub _New()

 With mappa = New Map
   .AddTile("GoogleMaps", "https://khms{s}.google.it/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "991"]).SubDomains = ["0", "1", "2"]
   .Center = mp
   .Zoom = 15
 End With
 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
   .Text = "Zoom: " & CStr(mappa.Zoom)
 End With
 MediaView1 = New MediaView(Me) As "MediaView1"

End


Public Sub Form_Open()

 Dim med As Object
 Dim pn, pn1 As Panel
 
 With MediaView1
   .URL = Media.URL("/percorso/del/file/multimediale")
' Ottiene il primo "Figlio" dell'Oggetto "MediaView", che è un "MediaPlayer":
   med = .Children[0]
   Print Object.Type(med)
 End With 
' Ottiene il primo "Figlio" dell'Oggetto "MediaPlayer", che è un "Panel":
 pn = med.Children[0]
 Print Object.Type(pn)
' Ottiene il primo "Figlio" dell'Oggetto "Panel", che è a sua volta un "Panel":
 pn1 = pn.Children[0]
 Print Object.Type(pn1)
' Ottiene il primo "Figlio" dell'Oggetto "Panel", che è una "DrawingArea":
 DrawingArea1 = pn1.Children[0]
 Print Object.Type(pn1.Children[0])

' Se durante l'esecuzione di un file audio si vuole vedere contestualmente anche la mappa, allora bisogna assegnare alla superficie di fondo della "DrawingArea" il valore della trasparenza. In tal caso, però, non sarà possibile spostare la mappa con il mouse. Ciò tornerà ad essere possibile, arrestando l'esecuzione dell'audio cliccando sul tastino dello "STOP" del "MediaView" in basso a sinistra.
' DrawingArea1.Background = Color.Transparent

' Assegna la "DrawingArea" ad un Gruppo di Eventi:
 Object.Attach(DrawingArea1, Me, "DrawingArea1")
 
End


Public Sub DrawingArea1_Draw()

 With mappa
   .Width = Paint.W
   .Height = Paint.H
   .Center = mp
   .Draw()
 End With

 DrawingArea1.Refresh

End


Public Sub DrawingArea1_MouseDown()  

 pt = Point(Mouse.X, Mouse.Y)

 Me.Text = "Lat. " & Format(mappa.PixelToMapPointRel(pt).Lat, "0.000000") & 
           "   Lon. " & Format(mappa.PixelToMapPointRel(pt).Lon, "0.000000") &
           "  -  Zoom: " & CStr(mappa.Zoom)

 mx = pt.X  
 my = pt.Y
 cpx = Geo.MapPointToPixel(mappa.Center, mappa.Zoom)

' Se si clicca sulla mappa con il tasto centrale, viene creato un file immagine della mappa corrente mostrata:
 If Mouse.Middle Then
   Dim im As New Image(mappa.Width, mappa.Height, Color.Transparent, Image.Standard)
   With Paint
     .Begin(im)
     mappa.Draw()
     .End
   End With
   im.Save("/tmp/immagine_" & CStr(c) & ".png", 100)
   Inc c
 Endif

End


Public Sub DrawingArea1_MouseMove()  

 Dim pix As New Point(cpx.X, cpx.Y)

 pix.X += mx - Mouse.X
 pix.Y += my - Mouse.Y

' Le seguenti righe di comando consentono uno spostamento morbido e uniforme della mappa per ciascun livello di zoom:
 mappa.Center.Lat = Geo.PixelToMapPoint(pix, mappa.Zoom).Lat
 mappa.Center.Lon = Geo.PixelToMapPoint(pix, mappa.Zoom).Lon

End


Public Sub DrawingArea1_MouseWheel()

' Impedisce che si vada oltre il massimo livello di zoom della mappa:
 If mappa.Zoom + Mouse.Delta > mappa.MaxZoom Then Return 

' Pone al centro della mappa il punto ove si è ruotata la rotellina:
 pt = Point(Mouse.X, Mouse.Y)
 mp.Lat = mappa.PixelToMapPointRel(pt).Lat
 mp.Lon = mappa.PixelToMapPointRel(pt).Lon

' Valuta il verso della rotazione della rotellina e modifica lo zoom della mappa:
 mappa.Zoom += Mouse.Delta
 Me.Text = "Zoom: " & CStr(mappa.Zoom)

End


Note

[1] Qualora la mappa non appaia, verificare la versione GoogleMap, ed eventualmente modificarla in questo punto del codice: ["version": "991"].