Differenze tra le versioni di "Spostare oggetti con il mouse all'interno di un contenitore senza Drag & Drop"
(17 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Vedremo di seguito come spostare un | + | Vedremo di seguito come spostare un Oggetto grafico all'interno di un ''Contenitore'' <SPAN style="text-decoration:underline">senza</span> l'uso del ''Drag 'n Drop''. <SUP>[[[#Note|nota 1]]]</sup> |
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. | 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= | =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. | 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. | ||
Riga 15: | Riga 13: | ||
Public Sub Button1_MouseDown() | Public Sub Button1_MouseDown() | ||
+ | <FONT color=gray>' ''Raccoglie il valore di "Mouse.X" e di "Mouse.Y" all'inizio dell'Evento:''</font> | ||
x = Mouse.X | x = Mouse.X | ||
y = Mouse.Y | y = Mouse.Y | ||
Riga 26: | Riga 25: | ||
End | 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() | Public Sub Button1_MouseMove() | ||
− | + | Button1.Move(Mouse.ScreenX - Me.ScreenX - Mouse.StartX, Mouse.ScreenY - Me.ScreenY - Mouse.StartY) | |
− | |||
− | |||
− | |||
End | End | ||
− | ==Spostamento con riferimento alla posizione del cursore del mouse rispetto al | + | ==Spostamento con riferimento alla posizione del cursore del mouse rispetto al proprio Contenitore== |
In questo caso non si fa riferimento allo Schermo, <SPAN Style="text-decoration:underline">bensì al ''Contenitore'' dell'Oggetto grafico da spostare</span>. | In questo caso non si fa riferimento allo Schermo, <SPAN Style="text-decoration:underline">bensì al ''Contenitore'' dell'Oggetto grafico da spostare</span>. | ||
<BR>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. | <BR>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. | ||
Riga 77: | Riga 55: | ||
End | 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() | Public Sub Button1_MouseMove() | ||
With Button1 | With Button1 | ||
− | .Move((Mouse.X + .X) - .W <FONT | + | .Move((Mouse.X + .X) - .W <FONT Color=red>/ 2</font>, (Mouse.Y + .Y) - .H <FONT Color=red>/ 2</font>) |
End With | End With | ||
Riga 96: | Riga 85: | ||
Public Sub Form_Open() | Public Sub Form_Open() | ||
+ | Button1.Y = 200 | ||
Button1.Text = CStr(Button1.Y) | Button1.Text = CStr(Button1.Y) | ||
Riga 118: | Riga 108: | ||
End | End | ||
− | =Spostamento in altro contenitore e modifica della | + | |
+ | =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 <SPAN Style="text-decoration:underline">modifica della sua Proprietà ".Parent"</span>: | Il caso che segue prevede lo spostamento di un Oggetto grafico (nell'esempio: un ''Button'') dal ''Form'' in un ''Panel'' con conseguente <SPAN Style="text-decoration:underline">modifica della sua Proprietà ".Parent"</span>: | ||
Private x As Short | Private x As Short | ||
Riga 141: | Riga 132: | ||
.Move(.X + Mouse.X - x, .Y + Mouse.Y - y) | .Move(.X + Mouse.X - x, .Y + Mouse.Y - y) | ||
End With | End With | ||
− | + | ||
End | End | ||
Riga 153: | Riga 144: | ||
End With | End With | ||
Endif | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | =Spostare un Controllo all'interno del suo Contenitore '''senza''' dover tenere premuto un tasto del mouse= | ||
+ | Se si vuole spostare un Oggetto grafico all'interno del suo Contenitore <SPAN style="text-decoration:underline">senza</span> dover tenere premuto un tasto del mouse, si possono adottare alcune modalità. | ||
+ | |||
+ | ==Uso della Proprietà ".Tracking"== | ||
+ | Una modalità prevede l'uso della Proprietà ".Tracking", se posseduta, del ''Controllo''. <SUP>[[[#Note|nota 2]]]</sup> | ||
+ | |||
+ | 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"). | ||
+ | <BR>Il ''Form'' potrà essere spostato sulla ''Scrivania'', muovendo il mouse, senza dover tenere premuto un tasto del mouse su di esso. | ||
+ | |||
+ | |||
+ | ==Uso di un file-device del Mouse== | ||
+ | Quest'altra modalità prevede di aprire in "Lettura" un file-device del Mouse e contestualmente di porlo in "osservazione". | ||
+ | <BR>Poiché il file-device del Mouse è un file di sistema protetto, sarà necessario eliminare questa protezione mediante il comando bash "chmod" preceduto dal comando "sudo" e dalla propria password. | ||
+ | |||
+ | Mostriamo un esempio pratico, nel quale si porrà in osservazione il file-device "/dev/input/mouse0": | ||
+ | Private fl As File | ||
+ | |||
+ | |||
+ | Public Sub Form_Open() | ||
+ | |||
+ | Dim pw as String | ||
+ | |||
+ | With Label1 = New Label(Me) As "Label1" | ||
+ | .W = 100 | ||
+ | .H = 50 | ||
+ | .X = (Me.W * 0.5) - (Label1.W * 0.5) | ||
+ | .Y = (Me.H * 0.5) - (Label1.H * 0.5) | ||
+ | .Background = Color.SoftYellow | ||
+ | End With | ||
+ | |||
+ | <FONT Color=gray>' ''Elimina la protezione del file-device del Mouse:''</font> | ||
+ | pw = InputBox("Immettere la propria password...") | ||
+ | Shell "echo " & pw & " | sudo -S chmod 444 /dev/input/mouse0" Wait | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Label1_Enter() | ||
+ | |||
+ | <FONT Color=gray>' ''Entrando con il puntatore del Mouse all'interno dalla "Label", esso sarà spostato esattamente al centro della "Label":''</font> | ||
+ | Mouse.Move(Me.X + Label1.X + (Label1.W / 2), Me.Y + Label1.Y + (Label1.H / 2)) | ||
+ | |||
+ | <FONT Color=gray>' ''Apre in "Lettura" il file-device del Mouse e lo pone in "osservazione":''</font> | ||
+ | fl = Open "/dev/input/mouse0" For Read Watch | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Label1_MouseUp() | ||
+ | |||
+ | <FONT Color=gray>' ''Se si clicca all'interno della "Label" con il tasto sinistro, viene chiuso il flusso di dati e si potrà uscire con il puntatore del Mouse comodamente dalla "Label":''</font> | ||
+ | If Mouse.Left Then fl.Close | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub File_Read() | ||
+ | |||
+ | <FONT Color=gray>' ''Determina lo spostamento della "Label" a seconda dello spostamento del puntatore del Mouse:''</font> | ||
+ | Label1.Move(Mouse.ScreenX - Me.X - (Label1.W / 2), Mouse.ScreenY - Me.Y - (Label1.H / 2)) | ||
End | End | ||
Riga 160: | Riga 230: | ||
=Nota= | =Nota= | ||
[1] Vedere anche: [[Spostare con il mouse un Controllo grafico generato in una DrawingArea]] | [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]] |
Versione attuale delle 16:19, 25 lug 2024
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.
Indice
- 1 Semplice spostamento
- 2 Spostamento in altro contenitore e modifica della Proprietà Parent
- 3 Spostare un Controllo all'interno del suo Contenitore senza dover tenere premuto un tasto del mouse
- 4 Nota
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.Y = 200 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 dover tenere premuto un tasto del mouse
Se si vuole spostare un Oggetto grafico all'interno del suo Contenitore senza dover tenere premuto un tasto del mouse, si possono adottare alcune modalità.
Uso della Proprietà ".Tracking"
Una modalità prevede l'uso della 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.
Uso di un file-device del Mouse
Quest'altra modalità prevede di aprire in "Lettura" un file-device del Mouse e contestualmente di porlo in "osservazione".
Poiché il file-device del Mouse è un file di sistema protetto, sarà necessario eliminare questa protezione mediante il comando bash "chmod" preceduto dal comando "sudo" e dalla propria password.
Mostriamo un esempio pratico, nel quale si porrà in osservazione il file-device "/dev/input/mouse0":
Private fl As File Public Sub Form_Open() Dim pw as String With Label1 = New Label(Me) As "Label1" .W = 100 .H = 50 .X = (Me.W * 0.5) - (Label1.W * 0.5) .Y = (Me.H * 0.5) - (Label1.H * 0.5) .Background = Color.SoftYellow End With ' Elimina la protezione del file-device del Mouse: pw = InputBox("Immettere la propria password...") Shell "echo " & pw & " | sudo -S chmod 444 /dev/input/mouse0" Wait End Public Sub Label1_Enter() ' Entrando con il puntatore del Mouse all'interno dalla "Label", esso sarà spostato esattamente al centro della "Label": Mouse.Move(Me.X + Label1.X + (Label1.W / 2), Me.Y + Label1.Y + (Label1.H / 2)) ' Apre in "Lettura" il file-device del Mouse e lo pone in "osservazione": fl = Open "/dev/input/mouse0" For Read Watch End Public Sub Label1_MouseUp() ' Se si clicca all'interno della "Label" con il tasto sinistro, viene chiuso il flusso di dati e si potrà uscire con il puntatore del Mouse comodamente dalla "Label": If Mouse.Left Then fl.Close End Public Sub File_Read() ' Determina lo spostamento della "Label" a seconda dello spostamento del puntatore del Mouse: Label1.Move(Mouse.ScreenX - Me.X - (Label1.W / 2), Mouse.ScreenY - Me.Y - (Label1.H / 2)) End
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