Do not pass by write do not hesitate.

Here's another version without using the window id (which is important).
This option would suit me more only there is no cross-platform.
Code:
; Module
Enumeration #PB_EventType_FirstCustomValue
#PB_EventType_Show
#PB_EventType_Timer
EndEnumeration
Procedure TimerStart(hWnd, TimerId, Delay, ProcedureAdress)
SetTimer_(hWnd,TimerId,Delay,ProcedureAdress)
EndProcedure
Procedure TimerKill(hWnd, TimerId)
KillTimer_(hWnd, TimerId)
EndProcedure
Procedure CallBack()
Select EventType()
Case #PB_EventType_Show
Debug "show"
Case #PB_EventType_Timer
Debug "Timer"
EndSelect
EndProcedure
Procedure TimerCallBack(hwnd.l, uMsg.l, *idEvent, dwTime.w);
If *idEvent = 0 And IsWindowVisible_(hwnd)
PostEvent(#PB_Event_Gadget, GetProp_(GetParent_(hwnd), "PB_WindowID")-1, GetDlgCtrlID_(hwnd), #PB_EventType_Show)
TimerKill(hWnd,*idEvent)
Else
PostEvent(#PB_Event_Gadget, GetProp_(GetParent_(hwnd), "PB_WindowID")-1, GetDlgCtrlID_(hwnd), #PB_EventType_Timer)
EndIf
EndProcedure
Procedure Gadget(Gadget, X.l, Y.l, Width.l, Height.l, time=0)
CanvasGadget(Gadget, X, Y, Width, Height)
TimerStart(GadgetID(Gadget), 0, 1, @TimerCallBack())
If time
TimerStart(GadgetID(Gadget), 1, time, @TimerCallBack())
EndIf
BindGadgetEvent(Gadget, @CallBack())
EndProcedure
; EndModule
If OpenWindow(10, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Gadget(10, 10, 10, 200, 200, 500)
; HideGadget(0,1)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
EndIf