Spostare oggetti con il mouse all'interno di un contenitore senza Drag & Drop

Da Gambas-it.org - Wikipedia.

Vedremo di seguito come spostare un Oggetto grafico all'interno di un Contenitore senza l'uso del Drag 'n Drop. [nota 1]

Per effettuare lo spostamento dell'Oggetto grafico useremo l'Evento "_MouseMove()" che viene sollevato quando il mouse, stando all'interno dell'Oggetto grafico, viene spostato, mentre un tasto del mouse è tenuto premuto.

Semplice spostamento

Il semplice spostamento può far riferimento alle posizioni assolute orizzontale e verticale del cursore del mouse all'interno dello schermo, ossia alle Proprietà ".ScreenX" e ".ScreenY" della Classe Mouse; oppure può far riferimento alla posizione del cursore del mouse rispetto al Contenitore genitore dell'Oggetto grafico da spostare.

Spostamento con riferimento alle Proprietà ".ScreenX" e ".ScreenY"

Poniamo il caso di voler spostare con il mouse un Button all'interno di un Form:

Private x As Short
Private y As Short


Public Sub Button1_MouseDown()

' Raccoglie il valore di "Mouse.X" e di "Mouse.Y" all'inizio dell'Evento:
 x = Mouse.X
 y = Mouse.Y

End

Public Sub Button1_MouseMove()

' Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:
 Button1.Move(Mouse.ScreenX - Me.ScreenX - x, Mouse.ScreenY - Me.ScreenY - y)

End

Il predetto codice può essere ridotto semplicemente ad un unico Evento, usando le Proprietà ".StartX" e ".StartY" della Classe Mouse, le quali svolgono il compito di quanto impostato nell'Evento "Button1_MouseDown()" del precedente codice:

Public Sub Button1_MouseMove()

 Button1.Move(Mouse.ScreenX - Me.ScreenX - Mouse.StartX, Mouse.ScreenY - Me.ScreenY - Mouse.StartY)

End


Spostamento con riferimento alla posizione del cursore del mouse rispetto al proprio Contenitore

In questo caso non si fa riferimento allo Schermo, bensì al Contenitore dell'Oggetto grafico da spostare.
Nell'esempio che segue, altresì, in particolare il puntatore del mouse durante lo spostamento del Controllo grafico resterà nel punto interno all'Oggetto, ove si è cliccato.

Private x As Short
Private y As Short


Public Sub Button1_MouseDown()

 x = Mouse.X
 y = Mouse.Y

End

Public Sub Button1_MouseMove()

' Il "Button" sarà posizionato in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:
 With Button1
   .Move(.X + Mouse.X - x, .Y + Mouse.Y - y)
 End With

End

Il predetto codice può essere ridotto semplicemente ad un unico Evento, usando le Proprietà ".StartX" e ".StartY" della Classe Mouse, le quali svolgono il compito di quanto impostato nell'Evento "Button1_MouseDown()" del precedente codice:

Public Sub Button1_MouseMove()

 With Button1
   .Move(.X + Mouse.X - Mouse.StartX, .Y + Mouse.Y - Mouse.StartY)
 End With

End

Far capitare il puntatore del mouse al centro dell'Oggetto spostato

Il seguente codice consente durante lo spostamento di posizionare il puntatore del mouse esattamente al centro dell'Oggetto grafico. >BR>Anche in questo caso, come nel precedente, codice è ridotto semplicemente all'un unico seguente Evento.

Public Sub Button1_MouseMove()

 With Button1
   .Move((Mouse.X + .X) - .W / 2, (Mouse.Y + .Y) - .H / 2)
 End With

End

Spostare un Oggetto grafico all'interno di un Contenitore entro un limite minimo e un limite massimo di coordinate x,y

Nel seguente esempio sarà possibile spostare un Button esclusivamente in verticale fra le coordinate 10 e 200 dell'asse delle "Y".

Private Const LIMITE_MINIMO As Byte = 10
Private Const LIMITE_MASSIMO As Byte = 200
Private x As Short
Private y As Short


Public Sub Form_Open()

 Button1.Text = CStr(Button1.Y)

End

Public Sub Button1_MouseDown()

 x = Mouse.X
 y = Mouse.Y

End

Public Sub Button1_MouseMove()

 With Button1
   If (Not ((.Y + Mouse.Y - y) < LIMITE_MINIMO)) And (Not ((.Y + Mouse.Y - y) > LIMITE_MASSIMO)) Then
     .Move(.X, .Y + Mouse.Y - y)
     .Text = CStr(.Y)
  Endif 
End With

End

Spostamento in altro contenitore e modifica della Proprietà Parent

Il caso che segue prevede lo spostamento di un Oggetto grafico (nell'esempio: un Button) dal Form in un Panel con conseguente modifica della sua Proprietà ".Parent":

Private x As Short
Private y As Short


Public Sub Button1_MouseDown()

 With Button1
' Solo per curiosità vediamo il contenitore Padre attuale dell'oggetto:
   Print "Attuale 'Genitore':", .Parent.Name
 End With
 
 x = Mouse.X
 y = Mouse.Y
 
End

Public Sub Button1_MouseMove()

 With Button1
   .Move(.X + Mouse.X - x, .Y + Mouse.Y - y)
 End With
 
End

Public Sub Button1_MouseUp()

 If Button1.Parent.Name = "FMain" And Mouse.Inside(Panel1) Then
   With Button1
' Si effettua la modifica del contenitore genitore dell'oggetto; il contenitore "Panel1" diventa il nuovo "Padre" dell'oggetto:
     .Reparent(Panel1, .X - Panel1.X, .Y - Panel1.Y)
     Print "\nNuovo 'Genitore':", .Parent.Name
   End With
 Endif

End

Spostare un Controllo all'interno del suo Contenitore senza premere sui tasti del mouse

Se si vuole spostare un Oggetto grafico all'interno del suo Contenitore senza dover premere sui tasti del mouse, bisognerà usare la Proprietà ".Tracking", se posseduta, del Controllo. [nota 2]

Mostriamo un esempio pratico:

Public Sub Form_Open()

 Button1.Tracking = True

End


Public Sub Button1_MouseMove()

 With Button1
   .Move((Mouse.X + .X) - .W / 2, (Mouse.Y + .Y) - .H / 2)
 End With

End

Volendo agire sul Form, si adotterà il medesimo precedente codice, ovviamente sostituendo l'identificatore della variabile di tipo "Button" con quello del Form (ossia: "Me").
Il Form potrà essere spostato sulla Scrivania, muovendo il mouse, senza dover tenere premuto un tasto del mouse su di esso.


Nota

[1] Vedere anche: Spostare con il mouse un Controllo grafico generato in una DrawingArea

[2] Vedere anche: Sollevare l'Evento MouseMove() di un Oggetto grafico spostando su di esso il mouse senza tenere premuto un suo tasto