Differenze tra le versioni di "Spostare oggetti con il mouse all'interno di un contenitore senza Drag & Drop"
Riga 10: | Riga 10: | ||
===Spostamento con riferimento alle proprietà ''.ScreenX'' e ''.ScreenY''=== | ===Spostamento con riferimento alle proprietà ''.ScreenX'' e ''.ScreenY''=== | ||
Poniamo il caso di voler spostare con il mouse un ''Button'' all'interno di un ''Form'': | Poniamo il caso di voler spostare con il mouse un ''Button'' all'interno di un ''Form'': | ||
+ | Private spx As Short | ||
+ | Private spy As Short | ||
+ | |||
+ | |||
+ | '''Public''' Sub Button1_MouseDown() | ||
+ | |||
+ | spx = Mouse.X | ||
+ | spy = Mouse.Y | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
'''Public''' Sub Button1_MouseMove() | '''Public''' Sub Button1_MouseMove() | ||
− | + | <FONT color=gray>' ''Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font> | |
− | + | With Button1 | |
− | + | .X = Mouse.ScreenX - Me.ScreenX - spx | |
+ | .Y = Mouse.ScreenY - Me.ScreenY - spy | ||
+ | End With | ||
'''End''' | '''End''' | ||
+ | |||
+ | |||
+ | Se non si intende utilizzare alcuna variabile ''globale'', sarà possibile servirsi - ad esempio - della proprietà ''.Tag'' dell'oggetto da spostare, avendo però cura di istanziare tale proprietà come vettore con due elementi: | ||
+ | '''Public''' Sub Form_Open() | ||
+ | |||
+ | Button1.Tag = [0, 0] | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | '''Public''' Sub Button1_MouseDown() | ||
+ | |||
+ | With Button1 | ||
+ | .Tag[0] = Mouse.X | ||
+ | .Tag[1] = Mouse.Y | ||
+ | End With | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | '''Public''' Sub Button1_MouseMove() | ||
+ | |||
+ | <FONT color=gray>' ''Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font> | ||
+ | With Button1 | ||
+ | .X = Mouse.ScreenX - Me.ScreenX - Button1.Tag[0] | ||
+ | .Y = Mouse.ScreenY - Me.ScreenY - Button1.Tag[1] | ||
+ | End With | ||
+ | |||
+ | '''End''' | ||
+ | |||
===Spostamento con riferimento alla posizione del cursore del mouse rispetto al contenitore=== | ===Spostamento con riferimento alla posizione del cursore del mouse rispetto al contenitore=== | ||
Poniamo il caso di voler spostare con il mouse una ''TextLabel'' all'interno di una ''ScrollView'': | Poniamo il caso di voler spostare con il mouse una ''TextLabel'' all'interno di una ''ScrollView'': | ||
+ | Private spx As Short | ||
+ | Private spy As Short | ||
+ | |||
+ | |||
+ | '''Public''' Sub TextLabel1_MouseDown() | ||
+ | |||
+ | spx = Mouse.X | ||
+ | spy = Mouse.Y | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
'''Public''' Sub TextLabel1_MouseMove() | '''Public''' Sub TextLabel1_MouseMove() | ||
− | <FONT color= | + | <FONT color=gray>' ''La "TextLabel" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font> |
− | |||
With TextLabel1 | With TextLabel1 | ||
− | .X = | + | .X = TextLabel1.X + Mouse.X - spx |
− | .Y = | + | .Y = TextLabel1.Y + Mouse.Y - spy |
End With | End With | ||
'''End''' | '''End''' | ||
+ | |||
Riga 49: | Riga 105: | ||
With Button1 | With Button1 | ||
− | <FONT color= | + | <FONT color=gray>' ''Solo per curiosità vediamo il contenitore ''Padre'' attuale dell'oggetto:''</font> |
Print .Parent.Name | Print .Parent.Name | ||
End With | End With | ||
Riga 67: | Riga 123: | ||
With Button1 | With Button1 | ||
− | <FONT color= | + | <FONT color=gray>' ''Si effettua la modifica del contenitore ''genitore'' dell'oggetto;'' |
' ''il contenitore "Panel1" diventa il nuovo "Padre" dell'oggetto:''</font> | ' ''il contenitore "Panel1" diventa il nuovo "Padre" dell'oggetto:''</font> | ||
.Reparent(Panel1, Mouse.X - Panel1.X) | .Reparent(Panel1, Mouse.X - Panel1.X) |
Versione delle 07:59, 16 giu 2015
Vedremo di seguito come spostare un oggetto all'interno di un contenitore senza l'uso del Drag 'n Drop.
Per effettuare lo spostamento dell'oggetto useremo l'evento _MouseMove() che viene sollevato quando il mouse, stando all'interno dell'oggetto, viene spostato, mentre un tasto del mouse è tenuto premuto.
Indice
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 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 spx As Short Private spy As Short Public Sub Button1_MouseDown() spx = Mouse.X spy = Mouse.Y End Public Sub Button1_MouseMove() ' Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate: With Button1 .X = Mouse.ScreenX - Me.ScreenX - spx .Y = Mouse.ScreenY - Me.ScreenY - spy End With End
Se non si intende utilizzare alcuna variabile globale, sarà possibile servirsi - ad esempio - della proprietà .Tag dell'oggetto da spostare, avendo però cura di istanziare tale proprietà come vettore con due elementi:
Public Sub Form_Open() Button1.Tag = [0, 0] End Public Sub Button1_MouseDown() With Button1 .Tag[0] = Mouse.X .Tag[1] = Mouse.Y End With End Public Sub Button1_MouseMove() ' Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate: With Button1 .X = Mouse.ScreenX - Me.ScreenX - Button1.Tag[0] .Y = Mouse.ScreenY - Me.ScreenY - Button1.Tag[1] End With End
Spostamento con riferimento alla posizione del cursore del mouse rispetto al contenitore
Poniamo il caso di voler spostare con il mouse una TextLabel all'interno di una ScrollView:
Private spx As Short Private spy As Short Public Sub TextLabel1_MouseDown() spx = Mouse.X spy = Mouse.Y End Public Sub TextLabel1_MouseMove() ' La "TextLabel" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate: With TextLabel1 .X = TextLabel1.X + Mouse.X - spx .Y = TextLabel1.Y + Mouse.Y - spy End With End
Se vogliamo che il puntatore del mouse capiti durante lo spostamento esattamente al centro dell'oggetto, allora scriveremo così:
Public Sub TextLabel1_MouseMove() With TextLabel1 .X = (Mouse.X + TextLabel1.X) - TextLabel1.W / 2 .Y = (Mouse.Y + TextLabel1.Y) - TextLabel1.H / 2 End With End
Spostamento in altro contenitore e modifica della proprietà Parent
Il caso che segue prevede lo spostamento di un oggetto (nell'esempio: un Button) dal Form in un Panel con conseguente modifica della sua proprietà Parent:
Public Sub Button1_MouseDown() With Button1 ' Solo per curiosità vediamo il contenitore Padre attuale dell'oggetto: Print .Parent.Name End With End Public Sub Button1_MouseMove() Button1.X = (Mouse.ScreenX - Me.ScreenX) - (Button1.W / 2) Button1.Y = (Mouse.ScreenY - Me.ScreenY) - (Button1.H / 1.2) End Public Sub Button1_MouseUp() With Button1 ' Si effettua la modifica del contenitore genitore dell'oggetto; ' il contenitore "Panel1" diventa il nuovo "Padre" dell'oggetto: .Reparent(Panel1, Mouse.X - Panel1.X) End With With Button1 Print .Parent.Name End With End