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