Newsgroup: it.comp.lang.visual-basic
Titolo: Ancora Drag&Drop... ricavare l'elemento della Lista su cui ho droppato

Salve!!!!!
Questa davvero penso non ci sia su MSDN a meno che
non sono diventato totalmente scemo e cecato.
Il max che puo' essere è che ho cercato nel posto sbagliato.
Ho la mia solita ListBox, voglio ricavarmi l'indice dell'elemento su
cui ho fatto il drop... come si fa?
Andrea

 
Private Sub List1_DragDrop(Source As Control, X As Single, Y As Single)
Vedi X e Y ??
Sorry, ma vb non e'fatto per cose cosi' complicate! ;-)
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 Sorry, ma vb non e'fatto per cose cosi' complicate! ;-)
ma adesso deve ricavare l'item dalle coordinate...
sarà capace?  :-)
--
Salutoni
Sergio

Il 4/2/2003 3:19 PM, CSSoft scrisse:

Ma qui e' pieno di gente che e' in gradi di rispondergli.
Basta postare un messaggio con scritto:
[FACILE][SFIDA][GURU] Chi mi risolve questo!
;-)


 sarà capace?  :-)
Eh, se ci fosse un metodo ItemAtPos o qualcosa di questo genere...
ma gli unici che ho trovato in MSDN sono per le ListView... :-(
Andrea

 drop... come si fa?
Devi utilizzare l'api di comctl32 "LBItemFromPt".
Immagino che tu voglia "evidenziare" al passaggio del mouse
l'elemento della ListBox su cui effettuare il drop e di
conseguenza inserire l'item trascinato prima (o dopo) l'item
selezionato.
Di seguito il codice che uso io :) e' una versione rivista
del codice di Marco Principato, che si trova da un paio
d'anni sul sito comune :P
'*********'*********'*********'*********'*********'*********
'        Il seguente codice e' "Cut&Paste Compliant"
'*********'*********'*********'*********'*********'*********
Option Explicit
Private Declare Function GetCursorPos Lib "user32" _
                    (lpPoint As POINTAPI) As Long
Private Declare Function LBItemFromPt Lib "comctl32" _
                    (ByVal hLB As Long, _
                     ByVal xPoint As Long, _
                     ByVal yPoint As Long, _
                     ByVal bAutoScroll As Long) As Long
Private Declare Function DragDetect Lib "user32" _
                    (ByVal hwnd As Long, _
                     ByVal xPoint As Long, _
                     ByVal yPoint As Long) As Long
Private Declare Function SetCapture Lib "user32" _
                    (ByVal hwnd As Long) As Long
Private Declare Function SetCursor Lib "user32" _
                    (ByVal hCursor As Long) As Long
Private Declare Function WindowFromPoint Lib "user32" _
                    (ByVal xPoint As Long, _
                     ByVal yPoint As Long) As Long
Private Type POINTAPI
    x As Long
    y As Long
End Type
Private isDragging As Boolean
Private isMouseOnDropControl As Boolean
Private dragIndex As Integer
Private dropIndex As Integer
Private Sub Form_Load()
    Dim i As Long
    For i = 0 To 10
        List1.AddItem "Elemento" & CStr(i)
    Next i
End Sub
Private Sub List1_MouseDown(Button As Integer, _
                            Shift As Integer, _
                            x As Single, _
                            y As Single)
    Dim pos As POINTAPI
    'Cattura la posizione del mouse
    Call GetCursorPos(pos)
    'Ricava l'item della listbox che si trova in quella
    'posizione
    dragIndex = LBItemFromPt(List1.hwnd, pos.x, pos.y, 0)
    If dragIndex <> -1 And List1.ListCount Then
        'Attiva il Drag&Drop
        isDragging = DragDetect(List1.hwnd, pos.x, pos.y)
        If isDragging Then
            Call SetCapture(List2.hwnd)
        End If
    End If
End Sub
Private Sub List1_MouseMove(Button As Integer, _
                            Shift As Integer, _
                            x As Single, _
                            y As Single)
    Dim pos As POINTAPI
    If isDragging Then
        'Cattura la posizione del mouse
        Call GetCursorPos(pos)
        'Verifica che il mouse si trovi sul controllo
        'sul quale effettuare il drop
        isMouseOnDropControl = _
            (WindowFromPoint(pos.x, pos.y) = List1.hwnd)
        'Seleziona l'item corrispondente alla posizione
        'del mouse (il +1 esegue il drop dopo l'elemento
        'selezionato)
        dropIndex = _
            LBItemFromPt(List1.hwnd, pos.x, pos.y, 0) + 1
        If dropIndex <> -1 Then
            If List1.ListCount > 0 Then
                List1.Selected(dropIndex) = True
            End If
        Else
            dropIndex = List1.ListCount
        End If
        'Imposta l'icona del cursore
        If isMouseOnDropControl Then
            Call SetCursor(imgDrop)
        Else
            Call SetCursor(imgDrag)
        End If
    End If
End Sub
Private Sub List1_MouseUp(Button As Integer, _
                          Shift As Integer, _
                          x As Single, _
                          y As Single)
    'Esegue il drop dell'elemento
    If isDragging And isMouseOnDropControl Then
        List1.AddItem List2.List(dragIndex), dropIndex
        List2.RemoveItem dragIndex
    End If
    isDragging = False
End Sub
Private Sub List2_MouseDown(Button As Integer, _
                            Shift As Integer, _
                            x As Single, _
                            y As Single)
    Dim pos As POINTAPI
    Call GetCursorPos(pos)
    dragIndex = LBItemFromPt(List2.hwnd, pos.x, pos.y, 0)
    If dragIndex <> -1 And List2.ListCount Then
        isDragging = DragDetect(List2.hwnd, pos.x, pos.y)
        If isDragging Then
            Call SetCapture(List1.hwnd)
        End If
    End If
End Sub
Private Sub List2_MouseMove(Button As Integer, _
                            Shift As Integer, _
                            x As Single, _
                            y As Single)
    Dim pos As POINTAPI
    If isDragging Then
        Call GetCursorPos(pos)
        isMouseOnDropControl = _
            (WindowFromPoint(pos.x, pos.y) = List2.hwnd)
        dropIndex = _
            LBItemFromPt(List2.hwnd, pos.x, pos.y, 0) + 1
        If dropIndex <> -1 Then
            If List2.ListCount > 0 Then
                List2.Selected(dropIndex) = True
            End If
        Else
            dropIndex = List2.ListCount
        End If
        If isMouseOnDropControl Then
            Call SetCursor(imgDrop)
        Else
            Call SetCursor(imgDrag)
        End If
    End If
End Sub
Private Sub List2_MouseUp(Button As Integer, _
                          Shift As Integer, _
                          x As Single, _
                          y As Single)
    If isDragging And isMouseOnDropControl Then
        List2.AddItem List1.List(dragIndex), dropIndex
        List1.RemoveItem dragIndex
        List2.Selected(List2.NewIndex) = True
    End If
    isDragging = False
End Sub
'*********'*********'*********'*********'*********'*********
hth,
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

 ma gli unici che ho trovato in MSDN sono per le ListView... :-(
ho trovato questo, del solito, ottimo hal
non so se poi è stato messo sul sito comune, ma puoi provare a dare una occhiata
(ti è andata bene anche questa volta :-) )
--
Salutoni
Sergio

Il 4/2/2003 3:28 PM, The DeerBear scrisse:

E tu usa una Listview!
Ma non controlli le proprieta' ed i metodi di un controllo prima di 
utilizzarlo. Forse dovresti leggerti del codice e qualche articolo del 
sito comune! Ed anche i post precedenti!!
;-)


 [FACILE][SFIDA][GURU] Chi mi risolve questo!
Risolto :p
ROTFL per i tag!


 ha scritto nel messaggio
news:b6es1q$4nmhl$1...@ID-170738.news.dfncis.de...

non sono sicuro possa servirti, ma qui l'item si ricava al mousemove:
filedata e' una stringa con data, dimensioni, ecc.
ciao, a.
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal
lParam As Any) As Long
Public Const LB_ITEMFROMPOINT = &H1A9
Private Sub File1_MouseMove(Button As Integer, Shift As Integer, x As
Single, Y As Single)
    On Error Resume Next
    Dim lXPoint As Long, lYPoint As Long, li As Long
    If Button = 0 Then
        lXPoint = CLng(x / Screen.TwipsPerPixelX)
        lYPoint = CLng(Y / Screen.TwipsPerPixelY)
        With File1
            li = SendMessage(.hwnd, LB_ITEMFROMPOINT, _
                0, ByVal ((lYPoint * 65536) + lXPoint))
            If (li >= 0) And (li <= .ListCount) Then
                .ToolTipText = FileData(.List(li))
            Else
                .ToolTipText = ""
            End If
        End With
    End If
End Sub

 una occhiata (ti è andata bene anche questa volta :-) )
certo che se poi non posto il link :-(
http://makeashorterlink.com/?V29D56F04
scusate....
ma tanto mi sembra sia la stessa cosa suggerita dagli altri...
--
Salutoni
Sergio

Lokar wrote:
[SNIP]
Innanzitutto GRAZIE per le risposte.
In secondo luogo, io mi domando, che
CIPPA ci voleva a scrivere una riga in
MSDN nella categoria "List" o "Drag&Drop"?
Mica uno può inventarseli i nomi di funzione!!!!!
E che cacchio!
Andrea

 Lokar
Dichiaro la gara chiusa!
Hanno presentato risposte contemporaneamente CSSoft e Lokar.
Purtroppo la risposta non e' presente nel messaggio di CSSoft.
Quindi si aggiudica il premio Lokar!
Spettera' a Lokar rispondere alle domande di DeerBear e di tutti i 
newbie per tutta la settimana!
Congratulazioni!
 
	mc.maxx


 Congratulazioni!
LOL =)
P.S. meno male che e' gia' mercoledi'! ;)
