Page 1 sur 1

gestion des fenetres

Publié : mer. 04/févr./2004 14:00
par nadrak
bonjour,

voila mon probleme,

j'ai deux fenetres, A et B.

Je veux que l'affichage de la fenetre B soit conditonné par la fenetre A.

c'est à dire, que la fenetre B s'affiche juste en dessous de la fenetre (jusque la pas de blem) et que quand je bouge la fenetre A, la B bouge avec.(si c'est pas en tps reel, pas de bleme, je veux juste que la fenetre B se remette sous la A)


Merci

Publié : mer. 04/févr./2004 14:51
par Oliv
Cherche un peu dans les apis windows il y en a une toute simple qui donne la position du fdenêtre, je l'ai déjà utilisé mais je ne me rapelle plus......

Publié : mer. 04/févr./2004 15:21
par filperj
Pourquoi une api?
Il y a les commandes windowx(), windowy(), et movewindow().
Ca marche pas avec ça ?

Publié : mer. 04/févr./2004 15:39
par Invité
Ben dsl, mais j'arrive pas a recupere l'event avec #PB_Event_MoveWindow

les position de x et y ne s'actualisent pas.

Je dois mal m'y prendre

Publié : mer. 04/févr./2004 16:04
par filperj
Ben dsl, mais j'arrive pas a recupere l'event avec #PB_Event_MoveWindow
Oui, c'est vrai...
Mais par contre windowx() et widowy() renvoient des valeurs correctes, du moins chez moi.
Donc tu peux vérifier la position de la fenêtre dans le "Default" de ton "Select Waitwindowevent()"

Code : Tout sélectionner


w=OpenWindow(0,0,0,200,200,#pb_window_screencentered|#pb_window_systemmenu,"")

Repeat
 Select WaitWindowEvent()
   Case #pb_event_closewindow : End
   Default
     Debug "x="+Str(WindowX())
     Debug "y="+Str(WindowY())
 EndSelect
ForEver

Et si tu as plusieur fenêtres, n'oublie pas de passer de l'une à l'autre avec Usewindow().

Publié : mer. 04/févr./2004 16:30
par Le Soldat Inconnu
essai avec la constantes #wm_move pour choper l'évènement fenêtre déplacer

sinon, une autre méthodes est d'afficher tous les événement et de regarder la valeur de celui qui est obtenu quand tu bouges une fenêtre.

Code : Tout sélectionner

repeat
Event = waitwindowevent()
debug Event
until Event = #wm_close

Publié : mer. 04/févr./2004 16:32
par filperj
Tiens, j'avais du temps à tuer alors voilà:

Code : Tout sélectionner


w=OpenWindow(0,0,0,200,200,#pb_window_screencentered|#pb_window_borderless,"")
w2=OpenWindow(1,0,0,100,100,#pb_window_windowcentered|#pb_window_systemmenu,"",w)

Repeat
 Select WaitWindowEvent()
   Case #pb_event_closewindow : End
   Default
     UseWindow(1)
     newx=WindowX()
     newy=WindowY()
     If newx<>oldx Or newy<>oldy
       UseWindow(0)
       MoveWindow(newx-50,newy-50)
       oldx=newx:oldy=newy
     EndIf
 EndSelect
ForEver

Ca correspond à ta question, non ?

Publié : mer. 04/févr./2004 16:34
par Invité
ton exemple marche bien avec une fenetre, mais des que j'en met deux il y a un probleme.

enfin bon je ne comprend pas trop .

Publié : mer. 04/févr./2004 16:36
par Invité
merci pour vos reponses,

ne tenez pas compte du message precedent,

et encore merci

Publié : mer. 04/févr./2004 16:36
par Invité
merci pour vos reponses,

ne tenez pas compte du message precedent,

et encore merci

Publié : mer. 04/févr./2004 17:11
par Oliv
t'as raison Filperj, il devait y avoir un truc en plus dans l'api qu me convenai mais je ne sais plus quoi......... :(

Publié : mer. 04/févr./2004 18:36
par Patrick88
un peu comme winamp, quand tu bouges le lecteur, la playlist et l'équaliseur , bouge en même temps....

patrick

Publié : mer. 04/févr./2004 21:55
par Chris
Salut :)

En passant par une CallBack, ça fonctionne plutôt bien !

Code : Tout sélectionner

; ****************************************************
; ****                Move 2 Windows              ****
; ****  ----------------------------------------  ****
; ****  Déplacement d'une fenêtre avec une autre  ****
; ****  Auteur Chris : http://forum.purebasic.fr  ****
; ****                  04/02/2004                ****
; ****************************************************

Enumeration
  #Window_0
  #Window_1
EndEnumeration

WinPos.RECT

Global WinPos, hWnd_1, hWnd_0

Procedure MyCallback(WindowID,Message,wParam,lParam)
  result = #PB_ProcessPureBasicEvents
  Select WindowID
    Case hWnd_0
      Select Message
        Case #WM_MOVING
          GetWindowRect_(WindowID,WinPos)
          UseWindow(#Window_1) : MoveWindow(WinPos\left,WinPos\bottom)
        ;MoveWindow_(hWnd_1,WinPos\left,WinPos\bottom,WinPos\right-WinPos\left,WinPos\bottom-WinPos\top,#True)
      EndSelect
  EndSelect
  ProcedureReturn result 
EndProcedure

hWnd_0 = OpenWindow(#Window_0, 300, 200, 300, 200, #PB_Window_SystemMenu, "Fenêtre 1",0)
hWnd_1 = OpenWindow(#Window_1, 300, 300, 300, 200, #PB_Window_SystemMenu, "Fenêtre 2",hWnd_0)

GetWindowRect_(hWnd_0,WinPos)
UseWindow(#Window_1) : MoveWindow(WinPos\left,WinPos\bottom)
; MoveWindow_(hWnd_1,WinPos\left,WinPos\bottom,WinPos\right-WinPos\left,WinPos\bottom-WinPos\top,#True)

SetWindowCallback(@MyCallback())
  
Repeat
  Select WindowEvent()
    Case #PB_EventCloseWindow : quit = 1
  EndSelect
Until quit = 1
End
C'est ce que j'ai pu trouver de mieux, jusqu'à maintenant ! :lol:

Chris :)
********* Edité ********
J'ai un peu modifié le code pour utiliser au maximum les commandes de Pure Basic.
J'ai laissé les commandes qui passaient par l'Api en commenté.

Chris :)