Utilizzare una MediaView con gb.map anziché una MapView
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" e "gb.media"):
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": "908"]).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]) 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: 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() 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