[Résolu] Comment créer 2 fenêtres inséparables

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Comment créer 2 fenêtres inséparables

Message par Micoute »

Bonjour à tous,

Toujours dans mon carnet de surveillance, je souhaiterais que quand je le souhaite avoir certaines informations telles que le resucrage ou les recommandations, une fenêtre fille se colle à sa mère, même si je déplace la fenêtre mère avant ou après l'ouverture de la fenêtre fille, l'inverse n'est pas obligatoire et je pense inutile. Je pense qu'il faut un rappel quand la fenêtre mère est déplacée, je ne sais pas si c'est avec ResizeWindow() ou une autre commande.

Alors si vous pouviez m'aider, ce serait un grand bonheur pour moi et je vous en remercierai jamais assez.

Je vous remercie par avance parce je sais que votre aide me sera d'une aide infinie.
Dernière modification par Micoute le ven. 29/nov./2019 16:36, modifié 2 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Comment créer 2 fenêtres inséparables

Message par kernadec »

salut micoute
voici un exemple de Rashad sur le MDIGadget, maintenant c'est auto géré je comprend pas ton souci

cordialement

Code : Tout sélectionner

#Main = 0
#MDIChild = 1
#MDIChild2 = 2
#MDIChild3 = 3

If OpenWindow(#Main, 0, 0, 400, 300, "MDIGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
If CreateMenu(#Main, WindowID(#Main))
  MenuTitle("Menu index 0")
    MenuItem(0, "self created item")
    MenuItem(1, "Select Window #2")

  MDIGadget(0, 0, 0, 0, 0, 1, 2, #PB_MDI_AutoSize)
    AddGadgetItem(0, #MDIChild, "child window")
      ; add gadgets here...
      AddGadgetItem(0, #MDIChild2, "child window #2")
      AddGadgetItem(0, #MDIChild3, "child window #3")
  UseGadgetList(WindowID(#Main)) ; go back to the main window gadgetlist
EndIf
   
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
        Quit = 1
       
    Case #PB_Event_ActivateWindow
        act = GetGadgetState(0)
        Debug act
         
    Case #PB_Event_Menu
      Select EventMenu()
        Case 1
          SetGadgetState(0,2)
          act = 2
          Debug act
      EndSelect
  EndSelect
Until Quit = 1
  EndIf
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment créer 2 fenêtres inséparables

Message par Micoute »

Merci Kernadec, mais le titre de mon poste est peut-être mal choisi, car en fait je souhaiterais avec 2 fenêtres collées l'une à l'autre et interdépendantes ou la fille dépendante de la mére.

Cet exemple me servira plus tard, c'est pourquoi je l'ai archivé.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Comment créer 2 fenêtres inséparables

Message par kernadec »

comme ca peut être :D

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Window example file
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

;
; Open a window, and do some stuff with it...
;

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

  
  
  OpenWindow(1, WindowX(0)+350,  WindowY(0), 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  
  
  MessageRequester("Information", "Click to move the Window", 0)
  ResizeWindow(0, 200, 200, #PB_Ignore, #PB_Ignore)   ; Move the window to the coordinate 200,200 
  ResizeWindow(1, WindowX(0)+350, 200, #PB_Ignore, #PB_Ignore)   ; Move the window to the coordinate 200,200
  
  MessageRequester("Information", "Click to resize the Window", 0)
  ResizeWindow(0, #PB_Ignore, #PB_Ignore, 320, 200) ; Resize the window to 320,200
  ResizeWindow(1, #PB_Ignore, #PB_Ignore, 320, 200) ; Resize the window to 320,200
  
  MessageRequester("Information", "Click to resize the Window", 0)
  ResizeWindow(0, #PB_Ignore, #PB_Ignore, 320, 200) ; Resize the window to 320,200
  ResizeWindow(1, #PB_Ignore, #PB_Ignore, 320, 200) ; Resize the window to 320,200
  
  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the Event
  ; isn't 0 and we just have to see what have happened...
  ;

  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1
  
EndIf

End   ; All the opened windows are closed automatically by PureBasic

Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Comment créer 2 fenêtres inséparables

Message par Marc56 »

Toujours dans mon carnet de surveillance, je souhaiterais que quand je le souhaite avoir certaines informations telles que le resucrage ou les recommandations, une fenêtre fille se colle à sa mère, même si je déplace la fenêtre mère avant ou après l'ouverture de la fenêtre fille, l'inverse n'est pas obligatoire et je pense inutile. Je pense qu'il faut un rappel quand la fenêtre mère est déplacée, je ne sais pas si c'est avec ResizeWindow() ou une autre commande.
Bonjour Micoute,

C'est effectivement ResizeWindow qui permet de déplacer les fenêtres et il suffit ensuite d'utiliser l'évènement #PB_Event_MoveWindow et de déplacer la fenêtre fille par rapport aux coordonnées de la fenêtre mère.

Code : Tout sélectionner

EnableExplicit

Enumeration 
    #Win_A
    #Win_B
EndEnumeration

OpenWindow(#Win_A, 100, 100, 200, 300, "Fenêtre Principale")
OpenWindow(#Win_B, 310, 100, 200, 300, "Fenêtre Secondaire")

Procedure Move_Win_B()
    ResizeWindow(#Win_B, WindowX(#Win_A) + 210, WindowY(#Win_A), #PB_Ignore, #PB_Ignore)
EndProcedure

BindEvent(#PB_Event_MoveWindow, @Move_Win_B(), #Win_A)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

End
Notes:
1. En utilisant BindEvent() on voit les fenêtres au complet pendant le déplacement alors que sinon on a juste le cadre.
2. Il te reste à gérer le déplacement de l'autre côté si la fenêtre sort de l'écran
3. Si ta fenêtre principale est redimensionnable, il faut alors utiliser WindowWidth() de la fenêtre A pour positionner la fenêtre B toujours collée.

:wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Comment créer 2 fenêtres inséparables

Message par Micoute »

Merci Marc56,

je me suis inspiré de ton exemple, mais à la place d'utiliser les coordonnées de ma fenêtre, j'ai utilisé un CanVasGadget()

Code : Tout sélectionner

    ;Si la fenêtre de saisies est déplacée, faire en sorte que les autres fenêtres ouvertes suivent le mouvement
    BindGadgetEvent(#Cvs_Saisie, @Deplacer_les_fenetres())

Code : Tout sélectionner

Procedure Deplacer_les_fenetres()
  If IsWindow(#Fenetre_Complications)
    ResizeWindow(#Fenetre_Complications, WindowX(#Fenetre_Saisies) + WindowWidth(#Fenetre_Saisies), WindowY(#Fenetre_Saisies) + 175, #PB_Ignore, #PB_Ignore)
  EndIf
  If IsWindow(#Fenetre_Recommandations)
    ResizeWindow(#Fenetre_Recommandations, WindowX(#Fenetre_Saisies) + WindowWidth(#Fenetre_Saisies), WindowY(#Fenetre_Saisies) + 105, #PB_Ignore, #PB_Ignore)
  EndIf
  If IsWindow(#Fenetre_Resucrage)
    ResizeWindow(#Fenetre_Resucrage, WindowX(#Fenetre_Saisies) + WindowWidth(#Fenetre_Saisies), WindowY(#Fenetre_Saisies) + 235, #PB_Ignore, #PB_Ignore)
  EndIf
  If IsWindow(#Fenetre_Graphique)
    ResizeWindow(#Fenetre_Graphique, WindowX(#Fenetre_Saisies) - 600, WindowY(#Fenetre_Saisies) + 50, #PB_Ignore, #PB_Ignore)
  EndIf  
  If IsWindow(#Fenetre_couleurs)
    ResizeWindow(#Fenetre_couleurs, WindowX(#Fenetre_Saisies), WindowY(#Fenetre_Saisies) + 50, #PB_Ignore, #PB_Ignore)
  EndIf
  If IsWindow(#fenetre_Choisir_couleur)
    ResizeWindow(#fenetre_Choisir_couleur, WindowX(#Fenetre_Saisies) + 315, WindowY(#Fenetre_Saisies) + 450, #PB_Ignore, #PB_Ignore)
  EndIf  
EndProcedure
Merci encore
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Comment créer 2 fenêtres inséparables

Message par MLD »

@Micoute
Bonjour
Il y a aussi un truc dans ce genre

Code : Tout sélectionner

Enumeration
  #Ma_fen = 1
  #BT1 = 2
  #Ma_fen2 = 3
EndEnumeration
Global DPF ;drapeau fenetre 

Procedure fen2()
X2 =  WindowX(#Ma_fen)+  WindowWidth(#Ma_fen) + 5
Y2 =  WindowY(#Ma_fen)
OpenWindow(#Ma_fen2,X2,Y2,400,140,"Ma Fenêtre secondaire",#PB_Window_MinimizeGadget|#NUL|#NUL|#NUL)
SetWindowColor(#Ma_fen2,$0CA5)
SetActiveWindow(#Ma_fen)
EndProcedure
OpenWindow(#Ma_fen,720,320,320,265,"Ma Fenêtre P",#PB_Window_MinimizeGadget|#NUL|#NUL|#NUL)
SetWindowColor(#Ma_fen,$6842AF)
StickyWindow(#Ma_fen,1)
;Vos gadgets ici
ButtonGadget(#BT1, 150, 200,150, 30, "Fen 2")

;
  
Repeat
  If DPF = 1
   X2 =  WindowX(#Ma_fen)+  WindowWidth(#Ma_fen) + 5
   Y2 =  WindowY(#Ma_fen)
   ResizeWindow(#Ma_fen2, X2, Y2,#PB_Ignore , #PB_Ignore )


  EndIf  
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
       Case #BT1
        DPF = 1
        fen2()
    EndSelect    
   Case #PB_Event_CloseWindow
    Break
 EndSelect
ForEver
End

Répondre