Page 1 sur 1

Forcer le focus sur une fenêtre

Publié : mer. 25/juin/2008 14:11
par Octavius
J'ai un programme avec plusieurs fenêtres : une fenêtre principale, et d'autres fenêtres secondaires que j'ouvre et que je ferme.

Je voudrais que lorsqu'une fenêtre secondaire est ouverte, le programme force le focus à rester sur cette fenêtre.

Je connais la commande StickyWindow(), mais ce n'est pas ce que je cherche : la fenêtre reste au premier plan, mais elle n'est pas active ; moi je veux qu'elle reste toujours active.

Grosso modo, je voudrais donc que ces fenêtres secondaires réagissent comme les fenêtres des MessageRequester().

Comment faire ? Je suppose qu'il faut passer par l'API... Merci de votre aide !

Re: Forcer le focus sur une fenêtre

Publié : mer. 25/juin/2008 14:23
par Ar-S
Y'aurait pas moyen d'utiliser hidewindow et setactivewindow en jouant avec tes fenêtres secondaires ?

Code : Tout sélectionner

If HideWindow(#fenetremessage,1) ; lorsque la fenetre popup est cachée
   SetActiveWindow(#FenetrePrincipale) ; rend active la fenêtre principale
EndIf

Publié : mer. 25/juin/2008 14:32
par Octavius
HideWindow() c'est pour la rendre invisible, je suppose que tu voulais parler de GetActiveWindow() ?

J'ai déjà essayé, mais je n'obtiens pas le résultat que je veux, ça permet à mon programme de faire une courte boucle et de prendre en compte les événements de la boucle principale avant de re-rendre active la fenêtre secondaire.

Les MessageRequester interdisent le perte de focus (avec un petit "bip" !), je veux en fait la même chose pour mes fenêtres secondaires.

(Pardon de ne pas poster de code, mais je n'ai pas PB sur cet ordinateur-là)

Publié : mer. 25/juin/2008 14:49
par brossden
Bonjour comme d'habitude si tu nous donnais un bout de code même s'il ne fonctionne pas ??

Publié : mer. 25/juin/2008 14:52
par Ar-S
Effectivement j'avais mal lu ton problème :oops:

Et avec un petit while ?
Tant que ta fenêtre popup est visible alors setactivewindow fenêtre popup

Publié : mer. 25/juin/2008 18:03
par Jacobus
Avec la fonction DisableWindow(#win,etat) c'est simple et efficace

Exemple : Ci-dessous une procedure ouvrant une fenêtre secondaire qui sera seule active, prenant le pas sur la principale jusqu'à sa fermeture. Peut-être appelée quand on veut dans le code principal et reste autonome. Ce qui est fait avec peut-être récupéré très simplement de plusieurs façons...

Code : Tout sélectionner

Procedure Secondaire()
 If OpenWindow(#Win2,0,0, 500, 300, "Fenêtre secondaire",#PB_Window_SystemMenu  | #PB_Window_ScreenCentered |#PB_Window_TitleBar)=0 Or CreateGadgetList(WindowID(#Win2))=0  
   End 
 EndIf  
 DisableWindow(#WIN1,1) ; désactive la fenêtre principale 
 ;tu ne peux que te servir de la secondaire tant qu'elle n'est pas fermée
 ;
 ;
 ;ton code
 ;
 Repeat
  Event = WaitWindowEvent() 
   If Event = #PB_Event_Gadget
     Select EventGadget()
     ;
     ;ton code
     ;
     ;
     EndSelect  
   EndIf
 Until Event = #PB_Event_CloseWindow
CloseWindow(#Win2) ; ferme la secondaire
DisableWindow(#WIN1,0); pour activer la principale
EndProcedure
Bonus; tu as le petit "bip" comme dans les requester :)

Publié : mer. 25/juin/2008 18:50
par Octavius
Merci! Exactement ce que je cherchais! Je ne pensais pas que ça allait être aussi simple! :D