Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET]Trascinare oggetti con il mouse
Forum - C# / VB.NET - [VB.NET]Trascinare oggetti con il mouse

Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 15:28
Venerdì, 24/07/2009
Ciao a tutti mi chiedevo se era possibile spostare gli oggetti in un form in maniera del tutto libera, sto lavorando un pò con i vari eventi del mouse, ma non riesco, avete qualche idea in merito ?

PM Quote
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 15:31
Venerdì, 24/07/2009
Vedi qui: http://www.vb-helper.com/howto_net_drag_drop.html
(C'era pure un esempio su MSDN...se lo trovo, lo posto)


"Se vuoi che una funzione di un programma non venga mai trovata, descrivila nella documentazione"
PM Quote
Avatar
oretovalley (Normal User)
Pro


Messaggi: 109
Iscritto: 12/04/2009

Segnala al moderatore
Postato alle 15:44
Venerdì, 24/07/2009
il codice che sto utilizzando è questo:

Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.  
  3.     Dim drag As Boolean
  4.  
  5.     Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove  
  6.         If drag = False Then Exit Sub
  7.  
  8.         Button1.Location = New Point(e.X - Me.Location.X - 5, e.Y - Me.Location.Y - 5)
  9.  
  10.         drag = False
  11.  
  12.     End Sub
  13.  
  14.     Private Sub Button1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove
  15.  
  16.         drag = False
  17.         Dim Controllo As Control = sender
  18.  
  19.         Controllo.DoDragDrop(Controllo, DragDropEffects.Copy)
  20.         drag = True
  21.  
  22.     End Sub
  23.  
  24. End Class



però noto che il button allo spostamento non si posiziona nel punto dove rilascio il mouse e inoltre molto spesso scompare. Secondo voi xkè ?

Ultima modifica effettuata da oretovalley il 24/07/2009 alle 15:47
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1888
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:08
Venerdì, 24/07/2009
Un ottimo modo per fare questo e un cilco for per tutti i controlli disponibili nel form
su Me.Controls

Fatto questo esegui un CType per indetificare l'oggetto.
e permettere l'eventuale spostamento di qulasiasi controllo si tratti,
scrivendo semplicemente una sola funzione che vale per tutti i controlli windows che vengono trascinati.
:k:


PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:32
Martedì, 28/07/2009
No, gli eventi di drag&drop non possono andare nell'evento Move.

Testo quotato

Con il termine "Drag and Drop" si indica una tecnica visuale che permette di trascinare dati da un controllo su un altro controllo con il solo ausilio del mouse. È assai utile poichè permette all'utente di ottenere il massimo grado di interazione con il programma con il minimo sforzo. Per far sì che un controllo possa recepire dati spostati mediante Drag and Drop, la sua proprietà AllowDrop deve essere impostata a True. L'operazione di trascinamento inizia quando viene premuto il pulsante sinistro del mouse sul controllo, perciò nell'evento MouseDown. Si crei ad esempio un form con due textbox vuote, e AllowDrop di una su True:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub TextBox1_MouseDown(ByVal sender As Object, _
  2.     ByVal e As EventArgs) Handles TextBox1.MouseDown
  3.     'Inizia l'operazione di Drag e Drop dalla textbox numero 1, usando
  4.     'come dati da trasportare il sue testo. L'effetto del mouse, invece,
  5.     'deve essere quello usato per la copia
  6.     TextBox1.DoDragDrop(TextBox1.Text, DragDropEffects.Copy)
  7. End Sub



DoDragDrop è un metodo appartenente alla classe Control e perciò viene ereditato da tutti i controlli. Il primo parametro è costituito dall'insieme dei dati da passare nell'operazione, mentre il secondo è un enumeratore che definisce le modalità di spostamento. Queste non influiscono sul comportamento del meccanismo a meno che non lo voglia il programmatore: infatti tutti il codice per il travaso e la manipolazione dei dati viene scritto manualmente.
Ora che si possono iniziare operazioni di Drag&Drop, non è tuttavia portarle a termine: manca infatti il codice che gestisce il meccanismo sul controllo ricevente. Per prima cosa bisogna controllare in entrata, che ci siano dati e, in questo caso, che siano coerenti con il contenuto del controllo. Per far questo si utilizza l'evento DragEnter, che notifica quando il mouse entra nell'area specificata.

Codice sorgente - presumibilmente VB.NET

  1. Private Sub TextBox2_DragEnter(ByVal sender As Object, _
  2.     ByVal e As DragEventArgs) Handles TextBox2.DragEnter
  3.     'Se contiene i dati giusti di tipo String
  4.     If e.Data.GetDataPresent(GetType(String)) Then
  5.         'Continua a copiare
  6.         e.Effect = DragDropEffects.Copy
  7.     Else
  8.         'Altrimenti annulla l'azione
  9.         e.Effect = DragDropEffects.None
  10.     End If
  11. End Sub



Il terzo passo è il più importante e permette di scrivere il pezzo di codice per la gestione effettiva dei dati. Quando il mouse viene rilasciato, si genere l'evento DragDrop, nel quale si deve operare:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub TextBox2_DragDrop(ByVal sender As Object, _
  2.     ByVal e As DragEventArgs) Handles  TextBox2.DragDrop
  3.     'Ottiene i dati di tipo string presenti in memoria
  4.     Dim S As String = e.Data.GetData(GetType(String))
  5.     'Imposta il testo della seconda textbox uguale a quello della prima
  6.     TextBox2.Text = S
  7. End Sub



In questo esempio si è creato un meccanismo molto semplice che permette di trascinare del testo da una textbox ad un'altra, ma nulla vieta di farlo con argomenti assai più complessi, come ad esempio il Drag&Drop di file. Quest'ultimo si può effettuare dall'explorer di windows sui programmi .net semplicemente controllando che i dati siano coerenti a DataFormat.FileDrop: in questo caso i dati sono un array di stringhe contenenti i percorsi completi dei file.




Ma comunque penso che tu non debba usare il drag&drop, poiché devi solo spostare dei controlli e non delle informazioni. Basterebbe modificare la proprietà Location per farla coincidere con quella del mouse.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote