AW: Treeview drag (wie mit gedrückter ctrl Taste) in Textbox
08.11.2024 16:32:45
Robert
So, jetzt wird ein bisschen komplizierter, ich wollte ja
dass man nur einen Knoten, der keine Kinder hat auf eine Textbox ziehen kann (ohne, dass der Knoten aus dem Baum verschwindet, also wie bei gedrückter ctrl Taste). Zumindest wird dann kein Text abgelegt, falls der Knoten Kinder hat
Weiters soll es nicht erforderlich sein, dass der Knoten, der verschoben wird, vorher selektiert werden muss.
Beim Knoten, der gedraggt wird muss auch der Key ermittelt werden (den benötige ich später im Programm), der Text wird in der Textbox angegezeigt.
So gehts:
Bei mouseover den korrekten Knoten finden, dazu wird X,Y von Pixel Twips umgerechnet werden, der oft zu findende Faktor 15 funktioniert bei mir nicht zuverlässig
Quelle: https://dutchgemini.wordpress.com/2010/12/17/listview-tristate-checkboxes-userformexcel/
Drag mit Ctrl :
Private Sub Tree_OLECompleteDrag(Effect As Long)
Effect = vbDropEffectCopy
End Sub
Drag:
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
Private Sub MyTree_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As stdole.OLE_XPOS_PIXELS, ByVal Y As stdole.OLE_YPOS_PIXELS)
Dim hDC As Long
Dim RetVal As Long
Dim TwipsPerPixelX As Long
Dim TwipsPerPixelY As Long
Const LOGPIXELSX = 88
Const LOGPIXELSY = 90
Const TWIPSPERINCH = 1440
hDC = GetDC(0)
TwipsPerPixelX = TWIPSPERINCH / GetDeviceCaps(hDC, LOGPIXELSX)
TwipsPerPixelY = TWIPSPERINCH / GetDeviceCaps(hDC, LOGPIXELSY)
X = X * TwipsPerPixelX
Y = Y * TwipsPerPixelY
If Not (MyTree.HitTest(X, Y) Is Nothing) Then
Dim nde As Node
Set nde = MyTree.HitTest(X, Y)
If nde.Children = 0 Then ' Knoten hat keine Kinder - selektion bei MousOver
nde.Selected = True
'MyKey=nde.Key ' Der Key zum Knoten
End If
Set nde = Nothing
End If
End Sub