Code: Select all
Procedure AppCallback(hWnd,Message,wParam,lParam)
result=#PB_ProcessPureBasicEvents
If Message=#WM_NOTIFY
Debug "This is not seen in 6.02, but is for 6.01"
ElseIf Message=#WM_HOTKEY
[...]
Code: Select all
Procedure AppCallback(hWnd,Message,wParam,lParam)
result=#PB_ProcessPureBasicEvents
If Message=#WM_NOTIFY
Debug "This is not seen in 6.02, but is for 6.01"
ElseIf Message=#WM_HOTKEY
[...]
Code: Select all
result=#PB_ProcessPureBasicEvents
If Message=#WM_NOTIFY ; Never triggers on 6.02, but does on 6.01. Seems to be the whole problem?
*pnmh.NMHDR=lParam
gadid=*pnmh\hwndFrom
Select *pnmh\code
Case #LVN_COLUMNCLICK ; ListIconGadget header click.
Select gadid
Case blah1 : ; Do something now that this header was clicked.
Case blah2 : *NMLV.NMLISTVIEW=lParam : If *NMLV\iSubItem=1 : globalvar=1 : EndIf
EndSelect
Case #HDN_BEGINTRACK ; Stop user resizing 0-width (hidden) ListIcon columns.
*lpnm.NMHEADER=lParam
type=*lpnm\hdr\code
If type=#HDN_BEGINTRACK Or type=#HDN_DIVIDERDBLCLICK Or type=#HDN_ITEMCHANGING
If *lpnm\hdr\hwndFrom=GetWindow_(GadgetID(#gad1),#GW_CHILD) And *lpnm\iItem=#gad1 : result=1
ElseIf *lpnm\hdr\hwndFrom=GetWindow_(GadgetID(#gad2),#GW_CHILD) And *lpnm\iItem=>#gad2 : result=1
EndIf
EndIf
Case #TCN_SELCHANGING ; Panel tab changing.
; Do something.
Case #TCN_SELCHANGE ; Panel tab finished changing.
; Finished doing something.
Case #MCN_FIRST+1 ; = #MCN_SELCHANGE (needed to get events from calendar/date gadgets after 19 Jan 2038).
; CalendarGadget do something.
Case #LVN_DELETEALLITEMS ; Fast clear ListIconGadget.
result=1
EndSelect
EndIf
ProcedureReturn result
Code: Select all
Global MyPanelCallback
Procedure PanelCallback(hWnd,Message,wParam,lParam)
[...]
ProcedureReturn CallWindowProc_(MyPanelCallback,hWnd,Message,wParam,lParam)
; But I really need "ProcedureReturn result" here, to cancel ListIcon column width changing, etc.
EndProcedure
MyPanelCallback=SetWindowLongPtr_(GadgetID(#PanelGadget),#GWLP_WNDPROC,@PanelCallback())
I have the same question, how do you deal with ProcedureReturn result when subclassing?Procedure PanelCallback(hWnd,Message,wParam,lParam)
[...]
ProcedureReturn CallWindowProc_(MyPanelCallback,hWnd,Message,wParam,lParam)
; But I really need "ProcedureReturn result" here, to cancel ListIcon column width changing, etc.
EndProcedure
Code: Select all
#Window_Main=1
#Gadget_Main_Panel=1
#Gadget_Main_Tab1=2
#Gadget_Main_List=3
Procedure WindowCallback(WindowID,Message,wParam,lParam)
Shared hRowSelected,hRow
Protected ReturnValue=#PB_ProcessPureBasicEvents
Select Message
Case #WM_NOTIFY
*LVCDHeader.NMLVCUSTOMDRAW=lParam
If *LVCDHeader\nmcd\hdr\code=#NM_CUSTOMDRAW
If *LVCDHeader\nmcd\hdr\hwndFrom=GadgetID(#Gadget_Main_List)
Select *LVCDHeader\nmcd\dwDrawStage
Case #CDDS_PREPAINT
ReturnValue=#CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
hRowSelected=#False
hRow=*LVCDHeader\nmcd\dwItemSpec
If GetGadgetItemState(#Gadget_Main_List,hRow) & #PB_ListIcon_Selected
hRowSelected=#True
*LVCDHeader\clrText=$FFFFFF
Else
*LVCDHeader\clrText=$000000
EndIf
If hRowSelected
SetGadgetItemState(#Gadget_Main_List,hRow,0)
*LVCDHeader\clrTextBk=$000000
ReturnValue=#CDRF_NEWFONT|#CDRF_NOTIFYPOSTPAINT
Else
If (hRow/2)*2=hRow
*LVCDHeader\clrTextBk=$DFFFE7
Else
*LVCDHeader\clrTextBk=$F3FFF6
EndIf
ReturnValue=#CDRF_NEWFONT
EndIf
Case #CDDS_ITEMPOSTPAINT
If hRowSelected
SetGadgetItemState(#Gadget_Main_List,hRow,#PB_ListIcon_Selected)
EndIf
ReturnValue=#CDRF_DODEFAULT
EndSelect
EndIf
EndIf
EndSelect
ProcedureReturn ReturnValue
EndProcedure
If OpenWindow(#Window_Main,0,0,759,458,"Panel Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
PanelGadget(#Gadget_Main_Panel,10,10,735,435)
AddGadgetItem(#Gadget_Main_Panel,-1,"Tab 1")
ListIconGadget(#Gadget_Main_List,10,10,710,395,"My Data",600,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
CloseGadgetList()
For tmp=1 To 50
AddGadgetItem(#Gadget_Main_List,-1,"This is a test "+Str(tmp))
Next
SetWindowCallback(@WindowCallback())
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Code: Select all
;-TOP
; Comment : Module SetGadgetCallback (Windows Only)
; Author : mk-soft
; Version : v0.04
; Created : 10.06.2018
; Updated : 22.05.2023
; Link : https://www.purebasic.fr/english/viewtopic.php?f=12&t=70842
;
; Syntax Callback:
; Procedure GadgetCB(hWnd,uMsg,wParam,lParam)
; Select uMsg
; ;TODO
; EndSelect
; ; Call previous gadget procedure
; ProcedureReturn CallGadgetProc(hWnd,uMsg,wParam,lParam)
; EndProcedure
;
; *****************************************************************************
DeclareModule GadgetCallback
Declare SetGadgetCallback(Gadget, *lpNewFunc, Parent = #False)
Declare CallGadgetProc(hWnd, uMsg, wParam, lParam)
EndDeclareModule
Module GadgetCallback
EnableExplicit
; ---------------------------------------------------------------------------
Procedure SetGadgetCallback(Gadget, *lpNewFunc, Parent = #False)
Protected hWnd, *lpPrevFunc
hWnd = GadgetID(Gadget)
If Parent
hwnd = GetParent_(hwnd)
EndIf
*lpPrevFunc = GetProp_(hWnd, "PB_PrevFunc")
; Remove exists Callback
If *lpPrevFunc
SetWindowLongPtr_(hWnd, #GWL_WNDPROC, *lpPrevFunc)
RemoveProp_(hWnd, "PB_PrevFunc")
EndIf
; Set new Callback
If *lpNewFunc
*lpPrevFunc = SetWindowLongPtr_(hWnd, #GWL_WNDPROC, *lpNewFunc)
SetProp_(hWnd, "PB_PrevFunc", *lpPrevFunc)
ProcedureReturn *lpPrevFunc
EndIf
ProcedureReturn 0
EndProcedure
; ---------------------------------------------------------------------------
Procedure CallGadgetProc(hWnd, uMsg, wParam, lParam)
Protected result, *lpPrevFunc
*lpPrevFunc = GetProp_(hWnd, "PB_PrevFunc")
If *lpPrevFunc
result = CallWindowProc_(*lpPrevFunc, hWnd, uMsg, wParam, lParam)
EndIf
ProcedureReturn result
EndProcedure
EndModule
; *****************************************************************************
EnableExplicit
UseModule GadgetCallback
#Window_Main=1
#Gadget_Main_Panel=1
#Gadget_Main_Tab1=2
#Gadget_Main_List=3
Define hRowSelected,hRow
Procedure GadgetCallback(WindowID,Message,wParam,lParam)
Shared hRowSelected,hRow
Protected *LVCDHeader.NMLVCUSTOMDRAW
Select Message
Case #WM_NOTIFY
*LVCDHeader.NMLVCUSTOMDRAW=lParam
If *LVCDHeader\nmcd\hdr\code=#NM_CUSTOMDRAW
If *LVCDHeader\nmcd\hdr\hwndFrom=GadgetID(#Gadget_Main_List)
Select *LVCDHeader\nmcd\dwDrawStage
Case #CDDS_PREPAINT
ProcedureReturn #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
hRowSelected=#False
hRow=*LVCDHeader\nmcd\dwItemSpec
If GetGadgetItemState(#Gadget_Main_List,hRow) & #PB_ListIcon_Selected
hRowSelected=#True
*LVCDHeader\clrText=$FFFFFF
Else
*LVCDHeader\clrText=$000000
EndIf
If hRowSelected
SetGadgetItemState(#Gadget_Main_List,hRow,0)
*LVCDHeader\clrTextBk=$000000
ProcedureReturn #CDRF_NEWFONT|#CDRF_NOTIFYPOSTPAINT
Else
If (hRow/2)*2=hRow
*LVCDHeader\clrTextBk=$DFFFE7
Else
*LVCDHeader\clrTextBk=$F3FFF6
EndIf
ProcedureReturn #CDRF_NEWFONT
EndIf
Case #CDDS_ITEMPOSTPAINT
If hRowSelected
SetGadgetItemState(#Gadget_Main_List,hRow,#PB_ListIcon_Selected)
EndIf
ProcedureReturn #CDRF_DODEFAULT
EndSelect
EndIf
EndIf
EndSelect
ProcedureReturn CallGadgetProc(WindowID,Message,wParam,lParam)
EndProcedure
Define tmp
If OpenWindow(#Window_Main,0,0,759,458,"Panel Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
PanelGadget(#Gadget_Main_Panel,10,10,735,435)
AddGadgetItem(#Gadget_Main_Panel,-1,"Tab 1")
ListIconGadget(#Gadget_Main_List,10,10,710,395,"My Data",600,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
CloseGadgetList()
For tmp=1 To 50
AddGadgetItem(#Gadget_Main_List,-1,"This is a test "+Str(tmp))
Next
SetGadgetCallback(#Gadget_Main_List, @GadgetCallback(), #True)
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf