Procedure NouvelleProc( hWnd, Msg, wParam, lParam)
Protected OriginProc.l
OriginProc.l= GetProp_ (hWnd, "OriginProc" )
Select Msg
Case #WM_NCPAINT
SendMessage_ (hWnd, #WM_NCACTIVATE ,1,0)
Case #WM_NCACTIVATE
wParam=1
Case #WM_NCDESTROY
SetWindowLong_ (hWnd, #GWL_WNDPROC , OriginProc)
RemoveProp_ (hWnd, "OriginProc" )
EndSelect
ProcedureReturn CallWindowProc_ (OriginProc,hWnd,Msg,wParam,lParam)
EndProcedure
If OpenWindow (0,0,0,322,275, "StringGadget Flags" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered )
StickyWindow (0,1)
OriginProc = SetWindowLong_ ( WindowID (0), #GWL_WNDPROC , @NouvelleProc())
SetProp_ ( WindowID (0), "OriginProc" , OriginProc)
Repeat
EventID = WaitWindowEvent ()
Select EventID
Case #WM_CLOSE
Quit=1
EndSelect
Until Quit=1
EndIf
Dans la pratique, on utilise cet effet pour les barres d'outils flottantes:
Je vous présente un code, il fonctionne pas trop mal, de temps en temps il y a un petit flash, rien de méchant.
Je vous conseille de visiter ce site qui montre une meilleur façon de procéder:
http://catch22.net/tuts/docking1.asp
Procedure ToolWindow( hWnd, Msg, wParam, lParam)
Protected OriginProc.l
OriginProc.l= GetProp_ (hWnd, "OriginProc" )
Select Msg
Case #WM_NCACTIVATE
If IsWindow (0)
SendMessage_ ( WindowID (0), #WM_NCACTIVATE ,wParam,lParam)
EndIf
Case #WM_NCDESTROY
SetWindowLong_ (hWnd, #GWL_WNDPROC , OriginProc)
RemoveProp_ (hWnd, "OriginProc" )
EndSelect
ProcedureReturn CallWindowProc_ (OriginProc,hWnd,Msg,wParam,lParam)
EndProcedure
Procedure NouvelleProc( hWnd, Msg, wParam, lParam)
Protected OriginProc.l
OriginProc.l= GetProp_ (hWnd, "OriginProc" )
Select Msg
Case #WM_ACTIVATE
If (wParam & $FFFF)= #WA_INACTIVE
If lParam<>WindowID(1)
SendMessage_ ( WindowID (1), #WM_NCACTIVATE ,0,lParam)
EndIf
Else
SendMessage_ ( WindowID (1), #WM_NCACTIVATE ,1,lParam)
EndIf
Case #WM_NCDESTROY
SetWindowLong_ (hWnd, #GWL_WNDPROC , OriginProc)
RemoveProp_ (hWnd, "OriginProc" )
EndSelect
ProcedureReturn CallWindowProc_ (OriginProc,hWnd,Msg,wParam,lParam)
EndProcedure
If OpenWindow (0,0,0,300,300, "Window" , #PB_Window_SystemMenu|#PB_Window_ScreenCentered )
OpenWindow (1,100,100,200,50, "ToolWindow" , #PB_Window_SystemMenu|#PB_Window_Invisible )
SetWindowLong_ ( WindowID (1), #GWL_EXSTYLE , GetWindowLong_ ( WindowID (1), #GWL_EXSTYLE )|#WS_EX_TOOLWINDOW)
StickyWindow (0,1)
StickyWindow (1,1)
OriginProc = SetWindowLong_ ( WindowID (0), #GWL_WNDPROC , @NouvelleProc())
SetProp_ ( WindowID (0), "OriginProc" , OriginProc)
OriginProc = SetWindowLong_ ( WindowID (1), #GWL_WNDPROC , @ToolWindow())
SetProp_ ( WindowID (1), "OriginProc" , OriginProc)
HideWindow (1,0)
SetActiveWindow (0)
Repeat
EventID = WaitWindowEvent ()
Select EventID
Case #PB_Event_Gadget
Select EventGadget ()
Case 0
Debug "Normal StringGadget"
EndSelect
Case #WM_CLOSE
Quit=1
EndSelect
Until Quit=1
EndIf