Wenn du mehr als ein Callback setzen moechtest, wuerde ich eher zu "SetWindowSubclass" raten, es ist einfacher zu benutzen und gibt es seit windows XP. (Natuerlich nicht in PB...)
Code: Alles auswählen
Import ""
GetProcAddress(hmod, s.p-ascii)
EndImport
Prototype pSetWindowSubclass(hWnd, *Proc, *Id, *RefData)
Prototype pDefSubclassProc(hWnd, Msg, wparam, lParam)
Prototype pRemoveWindowSubclass(hWnd, *Proc, *Id)
Prototype pGetWindowSubclass(hWnd, *Proc, *Id, *RefData)
;https://msdn.microsoft.com/de-de/library/windows/desktop/bb776430(v=vs.85).aspx
Procedure SetWindowSubclass(hWnd, *Proc, *Id, *RefData)
Protected Comctl32 = GetModuleHandle_("Comctl32")
Protected func.pSetWindowSubclass = GetProcAddress(Comctl32, "SetWindowSubclass")
ProcedureReturn func(hWnd, *Proc, *Id, *RefData)
EndProcedure
;https://msdn.microsoft.com/de-de/library/windows/desktop/bb776403(v=vs.85).aspx
Procedure DefSubclassProc(hWnd, Msg, wparam, lParam)
Protected Comctl32 = GetModuleHandle_("Comctl32")
Protected func.pDefSubclassProc = GetProcAddress(Comctl32, "DefSubclassProc")
ProcedureReturn func(hWnd, Msg, wparam, lParam)
EndProcedure
;https://msdn.microsoft.com/de-de/library/windows/desktop/bb762094(v=vs.85).aspx
Procedure RemoveWindowSubclass(hWnd, *Proc, *Id)
Protected Comctl32 = GetModuleHandle_("Comctl32")
Protected func.pRemoveWindowSubclass = GetProcAddress(Comctl32, "RemoveWindowSubclass")
ProcedureReturn func(hWnd, *Proc, *Id)
EndProcedure
;https://msdn.microsoft.com/de-de/library/windows/desktop/bb776430(v=vs.85).aspx
Procedure GetWindowSubclass(hWnd, *Proc, *Id, *RefData)
Protected Comctl32 = GetModuleHandle_("Comctl32")
Protected func.pGetWindowSubclass = GetProcAddress(Comctl32, "GetWindowSubclass")
ProcedureReturn func(hWnd, *Proc, *Id, *RefData)
EndProcedure
Beispiel :
Code: Alles auswählen
Procedure Proc1(hWnd, Msg, wparam, lParam, id, *refData)
Debug "Proc1 ID : " + id + " refData : " + *refData
; DefSubclassProc sorgt dafur das der naechste Callback aufgerufen wird.
ProcedureReturn DefSubclassProc(hWnd, Msg, wparam, lParam)
EndProcedure
Procedure Proc2(hWnd, Msg, wParam, lParam, id, *refData)
Debug "Proc2 ID : " + id + " refData : " + *refData
; DefSubclassProc sorgt dafur das der naechste Callback aufgerufen wird.
ProcedureReturn DefSubclassProc(hWnd, Msg, wParam, lParam)
EndProcedure
Procedure Main()
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 500, 500, "")
ButtonGadget(0, 10, 10, 100, 100, "Klick")
;Setzen des Callbacks.
;Setzt man mehrere Callbacks auf ein Fenster, kann man eine ID
;angeben, um zu unterscheiden.
SetWindowSubclass(WindowID(0), @Proc1(), 0, 0)
SetWindowSubclass(WindowID(0), @Proc1(), 1, 45334)
SetWindowSubclass(WindowID(0), @Proc2(), 2, 0)
SetWindowSubclass(GadgetID(0), @Proc2(), 1, 1)
SetWindowSubclass(GadgetID(0), @Proc2(), 2, 2)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
EndProcedure: End Main()