voila un exemple avec deux fonctions pour une seule callback...
Code : Tout sélectionner
Declare WindowCallback(WindowID.l, Message.l, wParam.l, lParam.l)
Declare WindowSetMinMaxSize(WindowID.l, MinW.l, MinH.l, MaxW.l, MaxH.l)
Declare WindowLockPosition(WindowID.l, x.w, y.w)
Declare MinMax(Value.l, OldValue.l)
Procedure WindowCallback(WindowID.l, Message.l, wParam.l, lParam.l)
Protected WndProc.l, Result.l, *MinMax.MinMaxInfo, *Pos.WindowPos, x.l, y.l
If Message = #WM_GETMINMAXINFO
*MinMax = lParam
*MinMax\ptMinTrackSize\x = MinMax(GetProp_(WindowID, "MinTrackWidth"), *MinMax\ptMinTrackSize\x)
*MinMax\ptMinTrackSize\y = MinMax(GetProp_(WindowID, "MinTrackHeight"), *MinMax\ptMinTrackSize\y)
*MinMax\ptMaxTrackSize\x = MinMax(GetProp_(WindowID, "MaxTrackWidth"), *MinMax\ptMaxTrackSize\x)
*MinMax\ptMaxTrackSize\y = MinMax(GetProp_(WindowID, "MaxTrackHeight"), *MinMax\ptMaxTrackSize\y)
ElseIf Message = #WM_WINDOWPOSCHANGING
*Pos = lParam
x = GetProp_(WindowID, "PositionLockX")
y = GetProp_(WindowID, "PositionLockY")
If x & $10000 : *Pos\x = x & $FFFF : EndIf
If y & $10000 : *Pos\y = y & $FFFF : EndIf
EndIf
WndProc = GetProp_(WindowID, "WndProc")
If WndProc
Result = CallWindowProc_(WndProc, WindowID, Message, wParam, lParam)
EndIf
ProcedureReturn Result
EndProcedure
Procedure WindowSetMinMaxSize(WindowID.l, MinW.l, MinH.l, MaxW.l, MaxH.l)
Protected WndProc.l
SetProp_(WindowID, "MinTrackWidth", MinW)
SetProp_(WindowID, "MinTrackHeight", MinH)
SetProp_(WindowID, "MaxTrackWidth", MaxW)
SetProp_(WindowID, "MaxTrackHeight", MaxH)
If GetProp_(WindowID, "WndProc") = #Null
WndProc = SetWindowLong_( WindowID, #GWL_WNDPROC, @WindowCallback() )
SetProp_(WindowID, "WndProc", WndProc)
EndIf
EndProcedure
Procedure WindowLockPosition(WindowID.l, x.w, y.w)
Protected WndProc.l, xx.l, yy.l
If x >= 0 : xx = $10000 | x : EndIf
If y >= 0 : yy = $10000 | y : EndIf
SetProp_(WindowID, "PositionLockX" ,xx)
SetProp_(WindowID, "PositionLockY" ,yy)
If GetProp_(WindowID, "WndProc") = #Null
WndProc = SetWindowLong_( WindowID, #GWL_WNDPROC, @WindowCallback() )
SetProp_(WindowID, "WndProc", WndProc)
EndIf
EndProcedure
Procedure MinMax(Value.l, OldValue.l)
If Value <= 0
Value = OldValue
EndIf
ProcedureReturn Value
EndProcedure
OpenWindow(0, 0, 0, 480, 360, #PB_Window_MinimizeGadget|#PB_Window_SizeGadget, "MinMax + Lock")
WindowSetMinMaxSize(WindowID(0), 320, 240, 640, 480)
WindowLockPosition(WindowID(0), #PB_Default, 0)
OpenWindow(1, 400, 100, 400, 300, #PB_Window_MinimizeGadget|#PB_Window_SizeGadget, "Min")
WindowSetMinMaxSize(WindowID(1), 320, 240, #Null, #Null)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
si la propriété n'existe pas, la fonction GetProp_() renvoie 0... donc faut s'arranger si c'est un long pour que 0 soit une valeur incorrecte... Ou alors on peut pointer vers une structure LONG si toutes les valeurs sont acceptées...