Inspirée de la source de PCPT :
("Les vacances de Mr Mulot",du 22/02/2006 16:30:02)
Cette source combine le DragDrop et le deplacement d' une PictureBox.
Mise à jour prévue : utilisation d' un user control pour la transparence.
...
Conclusion :
@PCPT / Pour l' ico , aucune nouvelle mise à jour n' est prévu pour le moment
peut être plus tard.J' ai eu ma dose avec cette source !
Alors, j'ai fait tout comme "c'est qu't'a dit",
1/ j'ai rien compris a l'histoire de l'icone a la volée, aurais tu un exemple s'il te plait ?
2/ Pourquoi quand on selectionne une ligne dans le listview on voit tout le listview qui se deplace ?
Merci de ton aide
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Const LB_ITEMFROMPOINT As Long = &H1A9
Private Sub Form_Load()
Dim i As Integer
' initialisation des controls
With lstSource
.AddItem "lstSource 1"
.AddItem "lstSource 2"
.AddItem "lstSource 3"
.AddItem "lstSource 4"
.AddItem "lstSource 5"
.AddItem "lstSource 6"
.AddItem "lstSource 7"
End With
With lstCible
.AddItem "lstCible 8"
.AddItem "lstCible 9"
.AddItem "lstCible 10"
End With
With grdCible
.TextMatrix(0, 0) = "grdCible"
For i = 1 To .Cols - 1
.ColWidth(i) = 1200
Next
End With
End Sub
Private Sub lstSource_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
lstSource.Drag vbBeginDrag
End Sub
Private Sub lstCible_DragDrop(Source As Control, X As Single, Y As Single)
lstCible.AddItem Source.Text
Source.RemoveItem Source.ListIndex
End Sub
Private Sub grdCible_DragDrop(Source As Control, X As Single, Y As Single)
With grdCible
.Row = .MouseRow
.Col = .MouseCol
If .Row >= .FixedRows And .Col >= .FixedCols Then
.Text = Source.Text
.CellBackColor = vbGreen
Source.RemoveItem Source.ListIndex
End If
End With
End Sub
Private Sub cmdTerminer_Click()
Unload Me
End Sub
Public Function GetListItemIndexFromPoint(ByRef Obj As ListBox, ByVal X As Single, ByVal Y As Single) As Integer
Dim Coords As Long
Dim OverIndex As Long
Coords = Obj.Parent.ScaleY(Y, Obj.Parent.ScaleMode, vbPixels) * &H10000 + Obj.Parent.ScaleX(X, Obj.Parent.ScaleMode, vbPixels)
OverIndex = SendMessage(Obj.hwnd, LB_ITEMFROMPOINT, 0&, ByVal Coords)
'# Si le HighWord = 0, un élément a été trouvé
If (OverIndex \ &H10000) = 0 Then
GetListItemIndexFromPoint = OverIndex Mod &H10000
Else
'# Aucun élément n'est survollé...
GetListItemIndexFromPoint = -1
End If
End Function
Dim nIndex As Long
nIndex = GetListItemIndexFromPoint(lstCible, X, Y)
If nIndex > -1 Then
lstCible.AddItem Source.Text, nIndex
Else
lstCible.AddItem Source.Text
End If
Source.RemoveItem Source.ListIndex
End Sub
Si je devais ajouter une icone je le ferais surle UC et pas
avec Drag Drop Standard.Avec ce dernier je n' aurais que
l' icone ou le contour et pas de texte.
Je n' ai jamais vu de texte se déplacer avec un Drag standard.
C' est justement pour ça que j' ai choisi de le personnaliser .
chaibat
si tu veux dans un UserControl, ajoutes dans celui-ci une fonction HitTest
(comme on en trouve dans un Treeview ou listView)
Pour l'icone, comme te le suggère PCPT, il suffirait de créer une icone dynamiquement, avec le texte de l'element selectionné (ou d'utiliser une icone drag & drop standard, commune a tous les elements)
et de la placer dans la propriété DragIcon de ton controle source
tu me demandes un commentaire, alors le voici ;)
intéressant, code lisible, çà peut donc servir.
par contre un ico lors du déplacement, le manque se fait ressentir.
problème : lors du simple click sur lstSource (donc début de déplacement sans déposer), le déplacement a tout de même lieu. en fait tu ne vérifies pas la réception du usercontrol.
et pour pouvoir réutiliser le tout, tout çà sous forme de classe withevents çà serait bien pratique.
bon courage ++
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.