Differenze tra le versioni di "Inserire un Oggetto grafico su una MapView"
Riga 258: | Riga 258: | ||
Object.Call(ob, "Close", Null) | Object.Call(ob, "Close", Null) | ||
ob = Null | ob = Null | ||
+ | MapView1.Refresh | ||
Return | Return | ||
Endif | Endif |
Versione delle 16:00, 4 giu 2023
E' possibile mostrare su una MapView un Oggetto grafico (un Controllo: "Button", "Label", etc) da utilizzare eventualmente durante la visione della mappa.
Il predetto Controllo grafico deve in realtà essere posto sulla DrawingArea, "Figlia" indiretta della MapView.
Come si sa, la MapView possiede un proprio "Figlio", che è un Oggetto Panel, il quale a sua volta possiede un Oggetto "Figlio", che è appunto una DrawingArea, utilizzata per mostrare la mappa prescelta.
Se il Controllo grafico, da far mostrare, fosse attribuito, come ulteriore "Figlio" alla MapView o al Panel, la sua dimensione assumerebbe interamente quella della MapView, evidentemente sottoposto all'effetto ".Fill" della Proprietà ".Arrangement" del Panel.
Pertanto il "Parent" dell'Oggetto grafico da far mostrare sulla MapView dovrà essere la DrawingArea meglio sopra specificata.
Mostriamo qualche esempio pratico.
Inserire una PictureBox sulla mappa
Mostriamo un possibile codice, commentato, con il quale si imposterà una PictureBox sulla mappa.
Private MapView1 As MapView Private Const ZOOM As Byte = 14 Private Const PERCORSO_FILE_IMMAGINE As String = "/percorso/del/file/immagine" Private mp As New MapPoint(41.89018, 12.49230) Private PictureBox1 As PictureBox Private im As Image Public Sub Form_Open() Dim pn As Panel Dim pt As Point 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 = ZOOM ' Imposta il centro della mappa visibile all'apertura iniziale: .Map.Center = mp pt = New Point(.Map.MapPointToPixelRel(mp).X, .Map.MapPointToPixelRel(mp).Y) End With ' Carica un file immagine: im = Image.Load(PERCORSO_FILE_IMMAGINE) ' Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel": pn = MapView1.Children[0] ' Attribuisce il Controllo grafico "PictureBox" all'Oggetto "Figlio" (una "DrawingArea") del predetto "Panel", per impedire che altrimenti si espanda alla dimensione della "MapView": With PictureBox1 = New PictureBox(pn.Children[0]) ' Posiziona la "PictureBox" nei pressi di determinate coordinate geografiche, trasformate adeguatamente in coordinate x,y dell'Oggetto "DrawingArea" (ossia: "pn.Children[0]"), del quale la "PictureBox" è ormai "Figlio": .X = pt.X .Y = pt.Y ' Imposta la formula per proporzionare la lunghezza del "ToggleButton" rispetto al valore dello zoom corrente: .W = im.W * CSingle(1.5 ^ (MapView1.Map.Zoom - ZOOM)) .H = im.H * CSingle(1.5 ^ (MapView1.Map.Zoom - ZOOM)) .Image = im End With End Public Sub MapView1_MouseDown() Dim mpo As MapPoint = MapView1.Map.PixelToMapPointRel(Point(Mouse.X, Mouse.Y)) ' Mostra le coordinate geografiche correnti del puntatore del Mouse sul bordo superiore della "MapView": Me.Text = Format(mpo.Lat, "#.000000") & " " & Format(mpo.Lon, "#.000000") End ' Questo Evento garantisce che, sia all'apertura iniziale della mappa, sia in caso di spostamento la Mappa con il mouse, la "PictureBox" si mostri solo e sempre alle sue coordinate geografiche prestabilite. ' Infatti, se l'istruzione viene posta invece all'interno di un qualsiasi Evento del "Form", l'Oggetto "PictureBox" non acquisirà le predette coordinate. Public Sub MapView1_Draw() With MapView1.Map PictureBox1.Move(.MapPointToPixelRel(mp).X, .MapPointToPixelRel(mp).Y) End With End Public Sub MapView1_MouseWheel() With PictureBox1 ' Imposta la formula per proporzionare la dimensione dell'immagine e conseguentemente della "PictureBox" rispetto al valore dello zoom corrente: .Image = im.Stretch(im.W * CSingle(1.5 ^ (MapView1.Map.Zoom - ZOOM)), im.H * CSingle(1.5 ^ (MapView1.Map.Zoom - ZOOM)), False) .Resize(.Image.W, .Image.H) End With End
Inserire un ToggleButton sulla mappa
Mostriamo un possibile codice, commentato, con il quale si imposterà un ToggleButton sulla mappa, premendo il quale verrà riprodotto un file audio o MIDI. Il percorso di tale file sonoro dovrà essere impostato nella Costante "PERCORSO_FILE_AUDIO".
Private MapView1 As MapView Private Const ZOOM As Byte = 14 Private tb As ToggleButton Private Const COEFFICIENTE As Byte = 50 Private Const PERCORSO_FILE_AUDIO As String = "/percorso/del/file/audio" Private mp As New MapPoint(41.89018, 12.49230) Private ob As Object Public Sub Form_Open() Dim pn As Panel Dim pt As Point 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 = ZOOM ' Imposta il centro della mappa visibile all'apertura iniziale: .Map.Center = mp pt = New Point(.Map.MapPointToPixelRel(mp).X, .Map.MapPointToPixelRel(mp).Y) End With ' Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel": pn = MapView1.Children[0] ' Attribuisce il Controllo grafico "ToggleButton" all'Oggetto "Figlio" (una "DrawingArea") del predetto "Panel", per impedire che altrimenti si espanda alla dimensione della "MapView": With tb = New ToggleButton(pn.Children[0]) As "Audio" ' Posiziona il "ToggleButton" nei pressi di determinate coordinate geografiche, trasformate adeguatamente in coordinate x,y dell'Oggetto "DrawingArea" (ossia: "pn.Children[0]"), del quale il "ToggleButton" è ormai "Figlio": .X = pt.X .Y = pt.Y ' Imposta la formula per proporzionare la lunghezza del "ToggleButton" rispetto al valore dello zoom corrente: .W = COEFFICIENTE * CSingle(1.2 ^ (MapView1.Map.Zoom - ZOOM)) .H = .W * 0.5 .Text = "Mus" .Tooltip = "Ascolta la musica" End With End Public Sub MapView1_MouseDown() Dim mpo As MapPoint = MapView1.Map.PixelToMapPointRel(Point(Mouse.X, Mouse.Y)) ' Mostra le coordinate geografiche correnti del puntatore del Mouse sul bordo superiore della "MapView": Me.Text = Format(mpo.Lat, "#.000000") & " " & Format(mpo.Lon, "#.000000") End ' Questo Evento garantisce che, sia all'apertura iniziale della mappa, sia in caso di spostamento la Mappa con il mouse, il "Button" si mostri solo e sempre alle sue coordinate geografiche prestabilite. ' Infatti, se l'istruzione viene posta invece all'interno di un qualsiasi Evento del "Form", l'Oggetto "Rect" non acquisirà le predette coordinate. Public Sub MapView1_Draw() With MapView1.Map tb.Move(.MapPointToPixelRel(mp).X, .MapPointToPixelRel(mp).Y) End With End Public Sub MapView1_MouseWheel() ' Imposta la formula per proporzionare la dimensione del "ToggleButton" rispetto al valore dello zoom corrente: tb.Resize(COEFFICIENTE * CSingle(1.2 ^ (MapView1.Map.Zoom - ZOOM)), COEFFICIENTE * 0.5 * CSingle(1.2 ^ (MapView1.Map.Zoom - ZOOM))) End Public Sub Audio_Click() If Not tb.Value Then ' Se, dopo aver avviato l'esecuzione audio, si preme nuovamente il "ToggleButton", l'esecuzione viene terminata: Object.Call(ob, "Close", Null) ob = Null Return Endif Dim cl As Class ' Si è deciso di non caricare preliminarmente dall'IDE di Gambas il Componente "gb.media", bensì ora da codice: Component.Load("gb.media") cl = Class.Load("MediaPlayer") ob = cl.New() ' Carica il file audio: With Object .Attach(ob, Me, "MPlayer") .SetProperty(ob, "Url", Object.Call(Class.Load("Media"), "URL", [PERCORSO_FILE_AUDIO])) .Call(ob, "Play", Null) End With End Public Sub MPlayer_End() Object.Call(ob, "Close", Null) tb.Value = False End
Inserire un ToggleButton sulla mappa e prevedere un codice per eseguire un file video
Mostriamo il codice, simile al precedente, con il quale questa volta si mostrerà sulla mappa un ToggleButton, cliccando sul quale si eseguirà un file video che sarà mostrato all'interno di una autonoma finestra creata dall'Oggetto MediaPlayer presso il ToggleButton.
Private MapView1 As MapView Private Const ZOOM As Byte = 14 Private tb As ToggleButton Private Const COEFFICIENTE As Byte = 50 Private Const PERCORSO_FILE_VIDEO As String = "/percorso/del/file/video" Private mp As New MapPoint(41.89018, 12.49230) Private ob As Object Public Sub Form_Open() Dim pn As Panel Dim pt As Point 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 = ZOOM .Map.Center = mp pt = New Point(.Map.MapPointToPixelRel(mp).X, .Map.MapPointToPixelRel(mp).Y) End With pn = MapView1.Children[0] With tb = New ToggleButton(pn.Children[0]) As "Video" .X = pt.X .Y = pt.Y .W = COEFFICIENTE * CSingle(1.2 ^ (MapView1.Map.Zoom - ZOOM)) .H = .W * 0.5 .Text = "Mus" .Tooltip = "Ascolta la musica" End With End Public Sub MapView1_MouseDown() Dim mpo As MapPoint = MapView1.Map.PixelToMapPointRel(Point(Mouse.X, Mouse.Y)) Me.Text = Format(mpo.Lat, "#.000000") & " " & Format(mpo.Lon, "#.000000") End Public Sub MapView1_Draw() With MapView1.Map tb.Move(.MapPointToPixelRel(mp).X, .MapPointToPixelRel(mp).Y) End With End Public Sub MapView1_MouseWheel() tb.Resize(COEFFICIENTE * CSingle(1.2 ^ (MapView1.Map.Zoom - ZOOM)), COEFFICIENTE * 0.5 * CSingle(1.2 ^ (MapView1.Map.Zoom - ZOOM))) End Public Sub Video_Click() If Not tb.Value Then Object.Call(ob, "Close", Null) ob = Null MapView1.Refresh Return Endif Dim cl As Class Component.Load("gb.media") cl = Class.Load("MediaPlayer") ob = cl.New() With Object .Attach(ob, Me, "Mplayer") ' Carica il file video: .SetProperty(ob, "Url", Object.Call(Class.Load("Media"), "URL", [PERCORSO_FILE_VIDEO])) ' Imposta i "Controllo" (la "DrawingArea" 'Figlia del "Panel"), ove sarà mostrato il video: .Call(ob, "SetWindow", [MapView1, tb.X + tb.W, tb.Y + tb.H, 150, 100]) .Call(ob, "Play", Null) End With End Public Sub MPlayer_End() Object.Call(ob, "Close", Null) tb.Value = False MapView1.Refresh End