Page 1 of 1
How to detect mouse wheel in a ListIconGadget?
Posted: Thu Dec 21, 2017 2:23 pm
by marcoagpinto
Hello!
I am using virtual ListIconGadgets (no vertical bar) in my Hunspell tool "Proofing Tool GUI".
I noticed the other day that we can have a shortcut also for the mouse wheel.
If I use the shortcut, how do I detect that the user used the mouse wheel over the gadget and if it scrolled up or down?
Thank you in advance!
Kind regards,
EDIT: Virtual ListIconGadget means that I may have 10000s of entries but I only show a few at a time.
Re: How to detect mouse wheel in a ListIconGadget?
Posted: Fri Dec 22, 2017 11:06 am
by CELTIC88
hi
Code: Select all
;By Celtic88 (c) 2017
;More info about Virtual List-View:https://msdn.microsoft.com/en-us/library/windows/desktop/bb774735(v=vs.85).aspx#Virtual_ListView_Style
Procedure.s RandomString(len=10)
Protected Ranstr.s,oklm
For oklm=1 To len
Ranstr + Chr(Random(90,64))
Next
ProcedureReturn Ranstr
EndProcedure
Global Dim ItemInfo.s(1,100000)
Global LvHwnd
Structure NMLVSCROLL
hdr.NMHDR;NMHDR structure that contains information about a LVN_ENDSCROLL or a LVN_BEGINSCROLL notification code.
dx.l ;Value of type int that specifies in pixels the horizontal position where a scrolling operation should begin or end.
dy.l ;Value of type int that specifies in pixels the vertical position where a scrolling operation should begin or end.
EndStructure
Procedure WinCallback(hWnd, uMsg, WParam, LParam)
Protected *pNMLVSCROLL.NMLVSCROLL
Select uMsg
Case #WM_NOTIFY
Protected *tNMHDR.NMHDR = LParam
Select *tNMHDR\hwndFrom
Case LvHwnd
Select *tNMHDR\code
Case #LVN_BEGINSCROLL
*pNMLVSCROLL = LParam
Debug " #LVN_BEGINSCROLL : x = " + Str(*pNMLVSCROLL\dx) + " y= " + Str(*pNMLVSCROLL\dy)
Case #LVN_ENDSCROLL
*pNMLVSCROLL = LParam
Debug " #LVN_ENDSCROLL : x = " + Str(*pNMLVSCROLL\dx) + " y= " + Str(*pNMLVSCROLL\dy)
Case #LVN_GETDISPINFO
Protected *tNMLVDISPINFO.NMLVDISPINFO = LParam
With *tNMLVDISPINFO
If \item\mask & #LVIF_TEXT
\item\pszText = @ItemInfo(\item\iSubItem,\item\iItem)
\item\cchTextMax = Len(ItemInfo(\item\iSubItem,\item\iItem))
EndIf
EndWith
EndSelect
EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 100, 100, 500, 600, "Test Virtual List-View", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0, 5, 5, 490, 590, "Nom", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection|#LVS_OWNERDATA)
LvHwnd = GadgetID(0)
AddGadgetColumn(0, 1, "Adresse", 250)
SetWindowCallback(@WinCallback(),0)
Debug "preparing list.."
itemCount = 10000
For u=0 To itemCount-1
For ii=0 To 1
ItemInfo(ii,u) = Str(u) + " " + RandomString(5)
Next
Next
Debug "End preparing list.."
SendMessage_( LvHwnd, #LVM_SETITEMCOUNT, itemCount, 0 )
Repeat
Evenement = WaitWindowEvent()
Until Evenement = #PB_Event_CloseWindow
EndIf
Re: How to detect mouse wheel in a ListIconGadget?
Posted: Sat Dec 23, 2017 11:45 am
by marcoagpinto
Guys, tomorrow I will try to write some code to show what I am after.
Thanks!
Re: How to detect mouse wheel in a ListIconGadget?
Posted: Sun Dec 24, 2017 12:04 pm
by marcoagpinto
This is what I had in mind:
Code: Select all
OpenWindow(0,10,10,500,500,"Testing")
ListIconGadget(1,4,20-5,15+10+40+40+30+15+600-20+10+5+4+4+4-300-10-5-5-2,300-30+5+40,"#",30+40+10+5,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_CheckBoxes)
AddGadgetColumn(1,1,"Words",100+10+20+20+10)
AddGadgetColumn(1,2,"Tags",150+5+15)
For f=1 To 10
AddGadgetItem(1,-1,"Line #"+Str(f)+#LF$+"blah"+#LF$+"The vertical scroll gadget will be virtual")
Next f
; Keyboard shortcuts
AddKeyboardShortcut(0,#PB_Shortcut_Scroll,1000)
Repeat
event=WaitWindowEvent()
; Shortcut for mouse-wheel
If event=#PB_Event_Menu And EventMenu()=1000
Debug "MOUSE-WHEEL pressed"
EndIf
ForEver
But the mouse wheel isn't detected.
I wanted to show in this example 10 items at the time.
I need to be able to detect if the mouse wheel is rotated, the gadget where it happened and if it was scroll up or down.
Also, it must work with all OSes.
Thank you!
Re: How to detect mouse wheel in a ListIconGadget?
Posted: Mon Jan 08, 2018 12:00 pm
by Dude
#PB_Shortcut_Scroll means the "Scroll Lock" key; not scrolling of the mouse or anything else.
Re: How to detect mouse wheel in a ListIconGadget?
Posted: Mon Jan 08, 2018 6:14 pm
by TI-994A
marcoagpinto wrote:I wanted to show in this example 10 items at the time.
I need to be able to detect if the mouse wheel is rotated, the gadget where it happened and if it was scroll up or down.
Also, it must work with all OSes.
If I understand correctly, this is perhaps what you had in mind:
Code: Select all
Declare populateList(g, start)
wFlags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
lFlags = #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_CheckBoxes
mainWin = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 500, 300, "MouseWheel Example", wFlags)
mainCanvas = CanvasGadget(#PB_Any, 0, 0, 500, 300, #PB_Canvas_Keyboard | #PB_Canvas_Container)
mainList = ListIconGadget(#PB_Any, 0, 0, 490, 300, "#", 100, lFlags)
CloseGadgetList()
StartDrawing(CanvasOutput(mainCanvas))
Box(0, 0, 500, 300, RGB(200, 200, 200))
StopDrawing()
AddGadgetColumn(mainList, 1, "Words", 180)
AddGadgetColumn(mainList, 2, "Tags", 180)
populateList(mainList, 1)
;DisableGadget(mainList, 1) ;list is always scrollable but not selectable
SetActiveGadget(mainCanvas)
listCount = 1
MessageRequester("MouseWheel Example", "Click on the GREY area before scrolling.")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
appQuit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case mainCanvas
Select EventType()
Case #PB_EventType_MouseWheel
delta = GetGadgetAttribute(EventGadget(), #PB_Canvas_WheelDelta)
If delta = 1
If listCount > 1
listCount - 10
update = #True
EndIf
ElseIf delta < 0
listCount + 10
update = #True
EndIf
If update
update = #False
populateList(mainList, listCount)
EndIf
EndSelect
EndSelect
EndSelect
Until appQuit = 1
Procedure populateList(g, start)
ClearGadgetItems(g)
For populate = start To start + 9
AddGadgetItem(g, -1, "Line #" + Str(populate) + #LF$ +
"Dummy Text " + Str(populate) + #LF$ +
"More dummy text " + Str(populate) )
Next
EndProcedure
The mousewheel is detected, the scroll is virtual, and it's presumably cross-platform.
However, the drawback is that you'd either have to disable the list
(which would render it unselectable), or click on the canvas
(grey area) each time before scrolling.
Just a simple workaround.

Re: How to detect mouse wheel in a ListIconGadget?
Posted: Tue Jan 09, 2018 9:16 am
by marcoagpinto
Anyway, my two cents:
http://www.purebasic.fr/english/viewtop ... 49#p516649
If there is a ScrollBarGadget, it should also accept mouse scroll built-in.