Seite 1 von 1

Item ermitteln über dem die Maus während Drag/Drop ist

Verfasst: 29.09.2014 14:05
von NicknameFJ
Hallo zusammen,

hier ein kleiner Source:

Code: Alles auswählen

EnableExplicit

#Main_Window = 1
#TreeView = 1
  
  



Procedure DropCallback(ZielHandle, Status, Format, Aktion, x, y)
  
  ; Wie kann ich hier im Callback das Item ermitteln über dem während eines Drag/Drop gerade die Maus ist um 
  ; ggfs. den Callback mit Procedurereturn #False zu verlassen, um bei den Items bei denen kein Drop möglich sein soll
  ; das Sperrsysmbol anzeigen zu lassen
  
  ; geht wohl nur mit WIN-API da GetGadgetState(#TreeView) nicht geht siehe folgenden Debug
  
  Debug GetGadgetState(#TreeView)
  
  ProcedureReturn #True
  
EndProcedure

Define i,j, Ebene,Event, GAdget, Quit, Pos

If OpenWindow(#Main_Window,0,0,500,300,"TreeGadget",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  
  TreeGadget(#TreeView,0,0,500,300)
  
  For i = 1 To 10
    For j = 1 To 4
      Ebene = 0
      
      If j > 1
        Ebene = 1
      EndIf
      
      AddGadgetItem(#TreeView,-1,"Item "+ i +" - " + Chr(64+j),0,Ebene)
      
    Next
  Next
  
  
  EnableGadgetDrop(#TreeView,#PB_Drop_Files,#PB_Drag_Copy)
  
  SetDropCallback(@DropCallback())
  
  
  
  
  Repeat                    
    
    Event = WaitWindowEvent()
    Gadget = EventGadget()
    
    Select event
        
      Case #PB_Event_CloseWindow
        Quit = 1
        
        
      Case #PB_Event_GadgetDrop
        Select Gadget
            
          Case #TreeView
            Pos = GetGadgetState(#TreeView)
            
            If Pos <> -1
              Debug GetGadgetItemText(#TreeView,Pos)
            EndIf
          
        EndSelect
        
        
    EndSelect
    
  Until Quit = 1
  
EndIf
Wie kann ich hier im Callback das Item ermitteln bei dem sich (während Drag/Drop Aktion) gerade die Maus befindet um den Callback mit ProcedureReturn #False zu verlassen wenn die Maus über einem Item ist wo kein Drop erlaubt sein soll?

Danke schon mal im Voraus.


NicknameFJ

Re: Item ermitteln über dem die Maus während Drag/Drop ist

Verfasst: 30.09.2014 18:55
von edel
Vielleicht hilft dir das weiter

Code: Alles auswählen

Procedure DropCallback(ZielHandle, Status, Format, Aktion, x, y)
	Protected hititem.TVHITTESTINFO
	Protected item.TVITEM		
	Protected Pos
	
	Static LastItem
	
	hititem\flags = #TVHT_ONITEM
	hititem\pt\x = x
	hititem\pt\y = y	
	
	item\mask = #TVIF_HANDLE
	item\hItem = SendMessage_(ZielHandle, #TVM_HITTEST, 0, hititem)
		
	If item\hItem And Not SendMessage_(ZielHandle, #TVM_GETNEXTITEM, #TVGN_PARENT, item\hItem) = LastItem And Not item\hItem = LastItem
		SendMessage_(ZielHandle, #TVM_EXPAND, #TVE_COLLAPSE, LastItem)
	EndIf	
	
	SendMessage_(ZielHandle, #TVM_SELECTITEM, #TVGN_CARET, item\hItem)
	
	If item\hItem = 0 
		ProcedureReturn #False
	EndIf
	
	If SendMessage_(ZielHandle, #TVM_EXPAND, #TVE_EXPAND, item\hItem)
		LastItem = item\hItem
	EndIf
	
	pos = GetGadgetState(#TreeView)
	Debug "" + pos + ":" + GetGadgetItemAttribute(#TreeView, pos, #PB_Tree_SubLevel) + 
	      ":" + GetGadgetItemText(#TreeView, Pos)
	
	If pos = 1
		ProcedureReturn #False
	EndIf
	
	If pos = 2
		ProcedureReturn #False
	EndIf	
	
	If pos = 4
		ProcedureReturn #False
	EndIf		
	
	ProcedureReturn #True	
EndProcedure

Re: Item ermitteln über dem die Maus während Drag/Drop ist

Verfasst: 30.09.2014 20:04
von NicknameFJ
Danke Edel,

ich werde es mal testen.

NicknameFJ




EDIT:
Verstehe zwar nicht was da API mäßig abläuft aber es funktioniert wunderbar (nachdem ich die Structure TVHITTESTINFO noch definiert habe).

Vielen Dank nochmals.