Perte de Focus mais barre de titre toujours active!

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Perte de Focus mais barre de titre toujours active!

Message par nico »


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