Differenze tra le versioni di "Mostrare sulla MapView disegni, immagini e Controlli senza l'uso del Metodo Map.AddShape()"

Da Gambas-it.org - Wikipedia.
Riga 20: Riga 20:
  
 
===Esempio astratto per disegnare qualsiasi qualcosa===
 
===Esempio astratto per disegnare qualsiasi qualcosa===
Mostriamo di seguito un esempio astratto, per disegnare qualsiasi cosa, facendola apparire al di sopra della mappa:
+
Mostriamo di seguito un esempio astratto ed essenziale, per disegnare qualsiasi cosa, facendola apparire al di sopra della mappa:
 
  Private pn As Panel
 
  Private pn As Panel
 
   
 
   
Riga 55: Riga 55:
 
  End
 
  End
  
==Mostrare ''Controlli'' sulla ''MapView''==
+
==Mostrare ''Controlli'' grafici sulla ''MapView''==
 
La suddetta routine "MapView_Draw()" è valida anche nel caso di impostazione sulla ''MapView'' di uno o più [[Inserire_un_Oggetto_grafico_su_una_MapView|''Controlli'' grafici]] (''Button'', ''Label'', etc), <SPAN Style="text-decoration:underline">sebbene solo</span> per far sì che, qualora si sposti la Mappa con il mouse, il ''Controllo'' si mostri solo e sempre alle sue coordinate geografiche prestabilite.
 
La suddetta routine "MapView_Draw()" è valida anche nel caso di impostazione sulla ''MapView'' di uno o più [[Inserire_un_Oggetto_grafico_su_una_MapView|''Controlli'' grafici]] (''Button'', ''Label'', etc), <SPAN Style="text-decoration:underline">sebbene solo</span> per far sì che, qualora si sposti la Mappa con il mouse, il ''Controllo'' si mostri solo e sempre alle sue coordinate geografiche prestabilite.
 
<BR>In particolare si porrà il Metodo ".Move()" del ''Controllo'', assegnando ai due argomenti previsti le coordinate x,y ricavate - quali Proprietà ".X" e ".Y" dal Metodo ".MapPointToPixelRel()" della Classe ''Map'', al quale viene passata la variabile di tipo della Classe ''MapPoint'', contenente le coordinate geografiche del ''Controllo'', precedentemente assegnatele.
 
<BR>In particolare si porrà il Metodo ".Move()" del ''Controllo'', assegnando ai due argomenti previsti le coordinate x,y ricavate - quali Proprietà ".X" e ".Y" dal Metodo ".MapPointToPixelRel()" della Classe ''Map'', al quale viene passata la variabile di tipo della Classe ''MapPoint'', contenente le coordinate geografiche del ''Controllo'', precedentemente assegnatele.
 +
 +
===Esempio astratto per porre un ''Controllo'' grafico sulla ''MapView''===
 +
Mostriamo di seguito un esempio astratto ed essenziale, per far apparire un ''Controllo'' grafico (ad esempio un ''Button'') al di sopra della mappa:
 +
Private MapView1 As MapView
 +
Private bu As Button
 +
Private mpbu As MapPoint
 +
 +
Public Sub Form_Open()
 +
 +
  Dim mp As New MapPoint(41.89018, 12.49230)
 +
  Dim pn As Panel
 +
  Dim pt As Point
 +
  Dim da As DrawingArea
 +
 +
  With Me
 +
    .W = Screen.AvailableWidth
 +
    .H = Screen.AvailableHeight
 +
    .Arrangement = Arrange.Fill
 +
  End With
 +
  With MapView1 = New MapView(Me) As "MapView1"
 +
    .Map.AddTile("topo", "https&#058;//a.tile.opentopomap.org/{z}/{x}/{y}.png")
 +
    .Map.Zoom = 14
 +
    .Map.Center = mp
 +
    pt = New Point(.MapPointToPixelRel(mp).X, .MapPointToPixelRel(mp).Y)
 +
  End With
 +
 +
<FONT Color=gray>' '''''Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel":'''''</font>
 +
  pn = <FONT Color=#B22222><B>MapView1.Children[0]</b></font>
 +
 +
<FONT Color=gray>' '''''Quindi individua l'Oggetto "Figlio" del predetto "Panel", che è una "DrawingArea":'''''</font>
 +
  da = <FONT Color=#B22222><B>pn.Children[0]</b></font>
 +
 +
  <Font Color=gray>' ''Attribuisce il Controllo grafico "Button" alla predetta "DrawingArea" ("Figlia" del "Panel"), per impedire che altrimenti si espanda alla dimensione della "MapView":''</font>
 +
  With bu = New Button(da) As "Controllo1"
 +
<Font Color=gray>' ''Posiziona il "Button" nei pressi di determinate coordinate geografiche, trasformate adeguatamente in coordinate x,y dell'Oggetto "DrawingArea", della quale il "Button" è ormai "Figlio":''</font>
 +
    .X = pt.X
 +
    .Y = pt.Y
 +
    .W = 20
 +
    .H = 20
 +
  End With
 +
 +
<FONT Color=gray>' ''Converte le coordinate x,y del "Controllo" ("Button") in coordinate geografiche e le assegna a una viariabile di tipo "MapPoint":''</font>
 +
  <FONT Color=blue>mpbu</font> = MapView1.Map.PixelToMapPointRel(pt)
 +
 +
End
 +
 +
<Font Color=gray>' ''Questo Evento garantisce che, sia all'apertura iniziale della mappa, sia in caso di spostamento la Mappa con il mouse, il "Controllo" si mostri solo e sempre alle sue coordinate geografiche prestabilite.''
 +
' ''Se l'istruzione viene posta invece all'interno di un Evento del "Form", il "Controllo" non acquisirà le predette coordinate.''</font>
 +
Public Sub <FONT Color=#B22222>MapView1_Draw()</font>
 +
 +
<Font Color=gray>' ''Assicura che il "Controllo" grafico sia mostrato solo e sempre alle sue coordinate geografiche prestabilite, che trasforma adeguatamente in coordinate x,y sulla "DrawingArea" qualora ne ricorrano le circostanze geografiche ad esempio a seguito di eventuale spostamento della mappa con il mouse):''</font>
 +
  With MapView1.Map
 +
    bu<FONT Color=#B22222>.Move(.MapPointToPixelRel(<FONT Color=blue>mpbu</font>).X, .MapPointToPixelRel(<FONT Color=blue>mpbu</font>).Y)</font>
 +
  End With
 +
 +
End
  
  

Versione delle 22:06, 12 gen 2022

Introduzione: la struttura della MapView

Il Controllo grafico "MapView " è costituito da un Oggetto "Figlio" Panel, il quale è a sua volta ha un Oggetto "Figlio" che è una DrawingArea:

MapView
 genitore di un
Panel
 genitore di una
DrawingArea

Mostrare elementi grafici non riproducibili con il Metodo "Map.AddShape()"

Di norma, per mostrare alcuni elementi grafici (punti, figure piane e immagini), si deve fare riferimento al Metodo ".AddShape()" della Classe Map.
Questo Metodo, però, non consente di inserire direttamente anche altri elementi, come ad esempio: testo, effetti grafici in movimento, Controlli grafici ed altro.

In caso di bisogno, dunque, per mostrare sulla MapView elementi ed effetti grafici, testo, disegni, immagini e anche Controlli, non riproducibili normalmente con il Metodo "Map.AddShape()", si utilizzerà l'Oggetto DrawingArea, "Figlio" dell'Oggetto Panel a sua volta "Figlio" del Controllo MapView.
Ovviamente con tale modalità potranno essere mostrati sulla mappa anche altri elementi grafici comunque normalmente riproducibili dal predetto Metodo "Map.AddShape()". Tale circostanza rende molto versatile, duttile ed efficiente questo particolare utilizzo dell'Oggetto DrawingArea, "nipote" della MapView.

Disegnare effetti grafici sulla MapView

Va precisato che l'Evento, ove deve avvenire la realizzazione del disegno mediante le risorse della Classe Paint resta comunque quello dell'Oggetto MapView:

MapView_Draw()

avendo cura in tale routine di assegnare al Metodo "Paint.Begin()" l'Oggetto DrawingArea, "Figlio" del Panel.

Esempio astratto per disegnare qualsiasi qualcosa

Mostriamo di seguito un esempio astratto ed essenziale, per disegnare qualsiasi cosa, facendola apparire al di sopra della mappa:

Private pn As Panel


Public Sub Form_Open()

 With MapView1
   .Map.AddTile("topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png")
   .Map.Zoom = 14
   .Map.Center = MapPoint(41.89018, 12.49230)
 End With

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

End

Public Sub MapView1_Draw()

' Individua l'Oggetto "Figlio" del "Panel", che è una "DrawingArea":
 Dim da As DrawingArea

 da = pn.Children[0]

 With Paint
' Disegna sull'Oggetto "Figlio" del "Panel", che è una "DrawingArea" (ossia lo stesso Oggetto che la Classe "MapView" usa ordinariamente per mostrare la mappa):
   .Begin(da)

   ' ...qui disegna qualcosa...

   .End
 End With

End

Mostrare Controlli grafici sulla MapView

La suddetta routine "MapView_Draw()" è valida anche nel caso di impostazione sulla MapView di uno o più Controlli grafici (Button, Label, etc), sebbene solo per far sì che, qualora si sposti la Mappa con il mouse, il Controllo si mostri solo e sempre alle sue coordinate geografiche prestabilite.
In particolare si porrà il Metodo ".Move()" del Controllo, assegnando ai due argomenti previsti le coordinate x,y ricavate - quali Proprietà ".X" e ".Y" dal Metodo ".MapPointToPixelRel()" della Classe Map, al quale viene passata la variabile di tipo della Classe MapPoint, contenente le coordinate geografiche del Controllo, precedentemente assegnatele.

Esempio astratto per porre un Controllo grafico sulla MapView

Mostriamo di seguito un esempio astratto ed essenziale, per far apparire un Controllo grafico (ad esempio un Button) al di sopra della mappa:

Private MapView1 As MapView
Private bu As Button
Private mpbu As MapPoint

Public Sub Form_Open()

 Dim mp As New MapPoint(41.89018, 12.49230)
 Dim pn As Panel
 Dim pt As Point
 Dim da As DrawingArea

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With
 With MapView1 = New MapView(Me) As "MapView1"
   .Map.AddTile("topo", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png")
   .Map.Zoom = 14
   .Map.Center = mp
   pt = New Point(.MapPointToPixelRel(mp).X, .MapPointToPixelRel(mp).Y)
 End With

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

' Quindi individua l'Oggetto "Figlio" del predetto "Panel", che è una "DrawingArea":
 da = pn.Children[0]

 ' Attribuisce il Controllo grafico "Button" alla predetta "DrawingArea" ("Figlia" del "Panel"), per impedire che altrimenti si espanda alla dimensione della "MapView":
 With bu = New Button(da) As "Controllo1"
' Posiziona il "Button" nei pressi di determinate coordinate geografiche, trasformate adeguatamente in coordinate x,y dell'Oggetto "DrawingArea", della quale il "Button" è ormai "Figlio":
   .X = pt.X
   .Y = pt.Y
   .W = 20
   .H = 20
 End With

' Converte le coordinate x,y del "Controllo" ("Button") in coordinate geografiche e le assegna a una viariabile di tipo "MapPoint":
 mpbu = MapView1.Map.PixelToMapPointRel(pt)

End

' Questo Evento garantisce che, sia all'apertura iniziale della mappa, sia in caso di spostamento la Mappa con il mouse, il "Controllo" si mostri solo e sempre alle sue coordinate geografiche prestabilite.
' Se l'istruzione viene posta invece all'interno di un Evento del "Form", il "Controllo" non acquisirà le predette coordinate.
Public Sub MapView1_Draw()

' Assicura che il "Controllo" grafico sia mostrato solo e sempre alle sue coordinate geografiche prestabilite, che trasforma adeguatamente in coordinate x,y sulla "DrawingArea" qualora ne ricorrano le circostanze geografiche ad esempio a seguito di eventuale spostamento della mappa con il mouse):
 With MapView1.Map
   bu.Move(.MapPointToPixelRel(mpbu).X, .MapPointToPixelRel(mpbu).Y)
 End With 

End


Esempi pratici

Esempi pratici posso essere rinvenuti nelle seguenti pagine: