besonderen als Mauscursor bei OleDragDrop im Listview

23/08/2012 - 07:54 von Ahmed Martens | Report spam
Hallo Leute,

ich habe folgenden Code um Listview.Items per OleDragDrop anzusprechen.

<Code>
' API Deklarationen
Private Const WM_HSCROLL = &H114
Private Const WM_VSCROLL = &H115

Private Const SB_LINELEFT = 0
Private Const SB_LINERIGHT = 1
Private Const SB_LINEUP = 0
Private Const SB_LINEDOWN = 1

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long

' SendMessage API (sieheOben)
'Private Const LVM_FIRST As Long = &H1000
'Private Const LVM_GETCOUNTPERPAGE As Long = (LVM_FIRST + 40)

Public Function LSV_GetVisibleCount(oLSV As MSComctlLib.ListView) As
Long
'--
' Gibt die maximal mögliche Anzahl der sichtbaren Items in dem
' ListView zurück. Allerdings wird im View Icon & SmallIcon
' Immer die anzahl aller ListItems zurückgegeben. Im View
' List & Report wird dagegen die maximale mögliche Anzahl an Items
' auf einer 'Seite' zurückgegeben.
LSV_GetVisibleCount = SendMessage(oLSV.hwnd, _
LVM_GETCOUNTPERPAGE, _
0&, _
ByVal 0&)
'--
End Function

Private Sub Form_Load()
Dim i As Integer

For i = 0 To 200
ListView1.ListItems.Add , , "Spalte 1 / Zeile " & i
ListView1.ListItems((i + 1)).SubItems(1) = "Spalte 2 / Zeile " & i
Next
End Sub


Private Sub ListView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect
As Long, Button As Integer, Shift As Integer, x As Single, y As Single)

Dim oItem As ListItem

If ListView1.View = lvwReport Then
' In der Reportansicht mit EnsureVisible den ScrollEffekt erzeugen
Set oItem = ListView1.HitTest(x, y)
If Not oItem Is Nothing Then
Debug.Print "OLEDragOver " & oItem.Index
oItem.EnsureVisible
End If

Else

Exit Sub
End If

MsgBox oItem.Text

End Sub

Private Sub ListView1_OLEDragOver(Data As MSComctlLib.DataObject, Effect
As Long, Button As Integer, Shift As Integer, x As Single, y As Single,
State As Integer)
Dim oItem As ListItem

Debug.Print "OLEDragOver x: " & x & " y: " & y

If ListView1.View = lvwReport Then
' In der Reportansicht mit EnsureVisible den ScrollEffekt erzeugen
Set oItem = ListView1.HitTest(x, y)
If Not oItem Is Nothing Then
Debug.Print "OLEDragOver " & oItem.Index
oItem.EnsureVisible
End If
Else
' Ansonsten das ganze einfach manuell machen!
If y > ListView1.Height - 200 Then
' Scroll nach unten
Debug.Print "ScrollDown"
Call SendMessage(ListView1.hwnd, WM_VSCROLL, SB_LINEDOWN, ByVal
0&)
ElseIf y < 200 Then
' Scroll nach oben
Debug.Print "ScrollUp"
Call SendMessage(ListView1.hwnd, WM_VSCROLL, SB_LINEUP, ByVal 0&)
ElseIf x > ListView1.Width - 200 Then
Debug.Print "ScrollRight"
Call SendMessage(ListView1.hwnd, WM_HSCROLL, SB_LINERIGHT, ByVal
0&)
ElseIf x < 200 Then
Debug.Print "ScrollRight"
Call SendMessage(ListView1.hwnd, WM_HSCROLL, SB_LINELEFT, ByVal
0&)
End If
End If
End Sub

</Code>

Das funktioniert alles einwandfrei und kann als Ausgangsbasis für meinen
Programmcode dienen.

Nun möchte ich aber noch, dass der Mauscursor ein bewegendes ListItem
andeutet (so eine Art Schatten). In vielen Programm gibt es das schon.
Ich wollte Fragen, ob man das auch mit VB6 und vernünftigen Aufwand
hinbekommt?

Ich hoffe ich konnte mich verstàndlich ausdrücken. :-?
Vielen Dank im voraus.

Gruß Ahmed
Antworten bitte nur in der Newsgroup.
Win7 Prof. 64bit / MS-Office 2010 Prof. 32bit
 

Lesen sie die antworten

#1 Ahmed Martens
23/08/2012 - 09:24 | Warnen spam
Hallo Leute,

ich habe jetzt ein Lösung gefunden.

1. Man nehme eine Picturebox (picMove) und
2. ein Label in der Picturebox (lblMove).

Die Picturebox musste ich nehmen, da das Label nicht über dem Listview
angezeigt werden kann.

Bei der DragDrop-Bewegung wird jetzt einfach immer das aktuelle ListItem
in dem Label angezeigt. Das alles noch mit Transparenz und eventuell ein
bisschen Farbe und schon habe ich was ich möchte.

Hier die notwendige Änderung:

<Code>

Private Sub ListView1_OLEDragOver(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)
Dim oItem As ListItem

If ListView1.View = lvwReport Then
' In der Reportansicht mit EnsureVisible den ScrollEffekt erzeugen
Set oItem = ListView1.HitTest(X, Y)
If Not oItem Is Nothing Then
oItem.EnsureVisible
lblMove.Caption = oItem.Text '<- einlesen des aktuellen ListItems unter der Maus
End If
Else
' Ansonsten das ganze einfach manuell machen!
If Y > ListView1.Height - 200 Then
' Scroll nach unten
Call SendMessage(ListView1.hwnd, WM_VSCROLL, SB_LINEDOWN, ByVal 0&)
ElseIf Y < 200 Then
' Scroll nach oben
Call SendMessage(ListView1.hwnd, WM_VSCROLL, SB_LINEUP, ByVal 0&)
ElseIf X > ListView1.Width - 200 Then
Call SendMessage(ListView1.hwnd, WM_HSCROLL, SB_LINERIGHT, ByVal 0&)
ElseIf X < 200 Then
Call SendMessage(ListView1.hwnd, WM_HSCROLL, SB_LINELEFT, ByVal 0&)
End If
End If

'Picturebox etwas versetzt anzeigen
With picMove
.Left = X + 700
.Top = Y + .Height + 150
End With


End Sub

</Code>

Muss ich jetzt aber noch auf verschiedene Monitorauflösungen achten oder
funktioniert der Code universell?

Gruß Ahmed
Antworten bitte nur in der Newsgroup.
Win7 Prof. 64bit / MS-Office 2010 Prof. 32bit

Ähnliche fragen