Posted: Thu Apr 13, 2006 2:22 pm
				
				Works okay here.
The cursor is hidden as soon as the drag operation is initiated.
Strange...
			The cursor is hidden as soon as the drag operation is initiated.
Strange...
http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
result = CallWindowProc_(GetProp_(hwnd, @text$), hWnd, uMsg, wParam, lParam)Done. Excellent suggestions, thanks akj.Could two of the event names please be changed?
Change #OnEndDragItem to #OnDragItemEnd
Change #OnStartDragItem to #OnDragItemStart
This will help in two ways: It will keep all the #OnDrag... events together in alphabetical order (making it simpler to select the correct event to use) and it is also more consistent with event names:
#OnDragItemOver
#OnMenuItemSelect
I also think that #OnSelectItem should be changed to #OnItemSelect for consistency with #OnMenuItemSelect
The more, the bettersrod wrote:Apologies for having to upload yet another new version.
Code: Select all
        If EVENT_globals\gCursorCount=0
          ShowCursor_(1)
          EVENT_globals\gCursorCount=1
        EndIf
Code: Select all
        If EVENT_globals\gCursorCount=0
          EVENT_globals\gCursorCount=1
          EVENT_globals\gCursor=SetCursor_(oldCursor) ;## changed
          ShowCursor_(1) 
        EndIf
Code: Select all
SetCursor_(EVENT_globals\gCursor)Code: Select all
oldCursor=GetCursor_()Code: Select all
LoadCursor_(0,#IDC_NO)Code: Select all
; run in Debug-Mode
XIncludeFile "EasyVENT.pbi"
;*********************************************************************************
Declare.l DragOverWindow(*sender.PB_Sender)
Declare.l DragItem(*sender.PB_Sender)
Declare.l DropItem(*sender.PB_Sender)
Declare.l DragOver(*sender.PB_Sender)
Declare.l DragItemTree(*sender.PB_Sender)
Declare HighLightSelection(hwnd, state)
;Define Event.l, i, WindowID, GadgetID, GadgetEvent
Global gTargetitem ;Denotes which item we are dropping on.
Global DragSource
OpenWindow(0, 100, 100, 330, 200, "EasyVENT drag and drop items demo 4.", #PB_Window_SystemMenu |#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget| #PB_Window_ScreenCentered)
  
  CreateGadgetList(WindowID(0))
    ListViewGadget(1, 0, 0, 150, 150)
  
    ListIconGadget(2,170,10,150,150, "Drag to", 120)
    For i = 1 To 10
      AddGadgetItem(1, -1, "Gadget 1 - item " + Str(i))
      ; AddGadgetItem(0, -1, "Gadget 0 - item " + Str(i))
      If i < 6
        AddGadgetItem(2, -1, "Gadget 2 - item " + Str(i))
      EndIf
    Next
 
;Set event handlers.
  SetEventHandler(GadgetID(1), #OnDragItemStart, @DragItem()) ; rem this line and debug message below does work otherwise not
  SetEventHandler(GadgetID(2), #OnDragItemOver, @DragOver())
  SetEventHandler(GadgetID(2), #OnDragItemEnd, @DropItem())
  SetEventHandler(WindowID(0), #OnDragItemOver, @DragOverWindow())
SetActiveGadget(1)
Repeat
  Event = WaitWindowEvent()
  WindowID = EventWindow()
  GadgetID = EventGadget()
  GadgetEvent = EventType()
  If Event = #PB_Event_Gadget 
    If GadgetID = 1
      Debug GetGadgetState(1)
    EndIf
  EndIf
Until Event = #PB_Event_CloseWindow
End
;*********************************************************************************
;                                 EVENT HANDLERS
;*********************************************************************************
;The following ensures that any highlighted item in the target control is removed
;whenever the cursor leaves the control.
Procedure.l DragOverWindow(*sender.PB_Sender)
;Remove any selection highlight already in place.
  HighLightSelection(GadgetID(2), 0)
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
;Here we simply return #PB_ProcessPureBasicEvents to enable the drag.
Procedure.l DragItem(*sender.PB_Sender)
  If GetActiveGadget()=1 And GetGadgetState(1)>=0
    DragSource = 1
    *sender\Text$=GetGadgetText(1)
  EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
;Since the following handles only one gadget, we need not check which control etc.
Procedure.l DropItem(*sender.PB_Sender)
;First remove any selection highlight already in place.
  HighLightSelection(*sender\hwnd, 0)
  If DragSource = 1
    AddGadgetItem(2,gTargetitem, GetGadgetText(1)) ;Copy item to ListView.
    RemoveGadgetItem(1,*sender\item) ;Remove item from ListIcon.
  ElseIf DragSource = 0
    AddGadgetItem(2,gTargetitem, GetGadgetText(0)) ;Copy item to ListView.
    RemoveGadgetItem(1,*sender\item) ;Remove item from ListIcon.
  EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure.l DragOver(*sender.PB_Sender)
  Protected hittestinfo.LV_HITTESTINFO
;First remove any selection highlight already in place.
  HighLightSelection(*sender\hwnd, 0)
;Find which item we are currently hovering over. We need an API call for this.
  hittestinfo\pt\x = *sender\MouseX
  hittestinfo\pt\y = *sender\MouseY
  gTargetitem = SendMessage_(*sender\hwnd, #LVM_HITTEST, 0, @hittestinfo)            
;Highlight the new item
  If gTargetitem<>-1
    HighLightSelection(*sender\hwnd, #LVIS_DROPHILITED)
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
;*********************************************************************************
;                              END OF EVENT HANDLERS
;*********************************************************************************
;The following utility either highlights the target item or removes the highlight etc.
Procedure HighLightSelection(hwnd, state)
  Protected pitem.LV_ITEM
    pitem\mask = #LVIF_STATE
    pitem\iItem = gTargetitem
    pitem\state = state
    pitem\stateMask = #LVIS_DROPHILITED
    SendMessage_(hwnd, #LVM_SETITEM, 0, @pitem)
    RedrawWindow_(hwnd, 0, 0, #RDW_UPDATENOW)
EndProcedure