Page 1 sur 1

Alignement Haut de 2 GUI Centrées à l'écran

Posté : lun. 23 juil. 2018 12:16
par LaTMoT
Bonjour,

J'ai réussi à aligner les deux fenêtres mais je ne comprend pas trop comment car j'ai utilisé des valeurs en dur que j'ai trouvé à tâtons.

Est-ce que quelqu'un pourrait m'expliquer le pourquoi du comment ?

Merci.

Code : Tout sélectionner

#include <Constants.au3>
#include <GuiConstants.au3>

;~ CREATION DE LA FENETRE PRINCIPALE
Global $MyPrincipalGui = GUICreate("MA GUI PRINCIPALE", 800, 600, @DesktopWidth/2-400, @DesktopHeight/2-300, -1, $WS_EX_TOOLWINDOW + $WS_EX_WINDOWEDGE) ; TAILLE (800x600)
GUISetBkColor($COLOR_WHITE) ; SUR FOND BLANC

;~ CREATION LABEL TEXTE
GUICtrlCreateLabel("CLIQUER SUR LA FLECHE A DROITE :", 50, 15, 200, 25) ; TEXTE

Local $OptionsButtonShowGui = GUICtrlCreateButton("==>", 740, 10, 50, 25) ; CREATION DU BOUTON POUR LA FENETRE OPTION

;~ CREATION DE LA FENETRE OPTIONS
Global $MyPrincipalGuiOpt = GUICreate("Options", 200 , 100, @DesktopWidth/2-200+605, @DesktopHeight/2-100-200, -1, $WS_EX_TOOLWINDOW + $WS_EX_WINDOWEDGE)
GUISetBkColor($COLOR_WHITE) ; SUR FOND BLANC

;~ GUISetState(@SW_SHOW, $MyPrincipalGuiOpt)
GUISetState(@SW_SHOW, $MyPrincipalGui)

While 1
        $msg = GUIGetMsg()

        Select
                Case $msg = $GUI_EVENT_CLOSE
                        _do_exit_stuff()

				Case $msg = $OptionsButtonShowGui
						GUISetState(@SW_SHOW, $MyPrincipalGuiOpt)
						GUICtrlSetData($OptionsButtonShowGui, "<==")
						If ControlGetText("","", $OptionsButtonShowGui)= "<==" Then
							GUISetState(@SW_HIDE, $MyPrincipalGuiOpt)
							GUICtrlSetData($OptionsButtonShowGui, "==>")
						EndIf
		EndSelect
WEnd

Func _do_exit_stuff()

        Exit

EndFunc   ;==>_do_exit_stuff

Re: Alignement Haut de 2 GUI Centrées à l'écran

Posté : mar. 24 juil. 2018 10:26
par walkson
Bonjour,
Pour positionner une gui par rapport à l'autre, il faut utiliser $aPos = WinGetPos($MyPrincipalGui, "")
Cela retourne un array (X, Y, W, H, voir l'aide)

Sur votre code, il y a ControlGetText("","", $OptionsButtonShowGui)= "<==" alors qu'il faut utiliser Guictrlread()

Quand 2 guis sont utilisées, il est utile de préciser à la gui fille qui est le parent, voir GUICreate() (utile mais non indispensable)
Enfin le Mode événementiel facilite la gestion de plusieurs guis. Voir GUICtrlSetOnEvent() dans l'aide.
Si vous utilisez Koda, vous pouvez générer le code en événementiel par Outils => Générer avec options et cocher les cases souhaitées

Re: Alignement Haut de 2 GUI Centrées à l'écran

Posté : mar. 24 juil. 2018 11:20
par LaTMoT
Bonjour,

Merci pour ces explications.

J'essaye de les appliquer mais sans succès.

Je vais prendre le temps de réfléchir et reviendrais bientôt :-)

Merci.

Re: Alignement Haut de 2 GUI Centrées à l'écran  

Posté : mar. 24 juil. 2018 13:07
par walkson
J'ai retrouvé ce vieux code que j'ai adapté à vos besoins
Je l'avais conservé pour garder en mémoire Func _WM_MOVE ( $hWnd, $Msg, $wParam, $lParam ) qui permet de réajuster la position des fenêtres filles quand la fenêtre parent est déplacée
Un bon exemple en mode événementiel avec 4 guis à gérer
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1) ;mode événementiel
Global $Form2, $Form3, $Form4, $Button1_1
Global $Form1 = GUICreate("Form1 Maitre", 200, 200, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
Global $Button1 = GUICtrlCreateButton("Ouvre", 16, 16, 81, 33)
GUICtrlSetOnEvent(-1, "Button1Click")
Global $Button2 = GUICtrlCreateButton("Button2", 16, 60, 81, 33)
GUICtrlSetOnEvent(-1, "Button2Click")
Global $Button3 = GUICtrlCreateButton("Button3", 16, 104, 81, 33)
GUICtrlSetOnEvent(-1, "Button3Click")
GUISetState(@SW_SHOW)
Global $sPos = WinGetPos($Form1, "")
;_ArrayDisplay($sPos)
GUIRegisterMsg ( $WM_MOVE, "_WM_MOVE" ) ;surveille position fenêtre
While 1
 Sleep(100)
WEnd

Func Button1Click()
   $read = GUICtrlRead($Button1)
   If $read = "Ouvre" Then
   Gui_1()
   GUICtrlSetData($Button1, "Ferme")
   Else
   GUICtrlSetData($Button1, "Ouvre")
   Form2Close()
   EndIf
EndFunc
Func Button2Click()
   Gui_2()
EndFunc
Func Button3Click()
   Gui_3()
EndFunc
Func Form1Close()
Exit
EndFunc

Func Gui_1()
If IsHWnd($Form2) Then Return SetError(1) ;si fenêtre existe, pas de création
$Form2 = GUICreate("Form2", 200, 200, $sPos[0] + $sPos[2] + 20, $sPos[1], $WS_POPUP, -1, $Form1 )
GUISetBkColor(0xFFDD00)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form2Close")
$Button1_1 = GUICtrlCreateButton("Button1", 16, 16, 81, 33)
GUICtrlSetOnEvent(-1, "Button1_1Click")
GUISetState(@SW_SHOW)
EndFunc
Func Button1_1Click()
   MsgBox(0,"","clic", 3, $Form2)
EndFunc
Func Form2Close()
   GUIDelete($Form2)
EndFunc

Func Gui_2()
If IsHWnd($Form3) Then Return SetError(1) ;si fenêtre existe, pas de création
$Form3 = GUICreate("Form3", 200, 200, $sPos[0] - $sPos[2] - 20, $sPos[1], -1, -1, $Form1 )
GUISetOnEvent($GUI_EVENT_CLOSE, "Form3Close")
GUISetState(@SW_SHOW)
EndFunc
Func Form3Close()
   GUIDelete($Form3)
EndFunc

Func Gui_3()
If IsHWnd($Form4) Then Return SetError(1) ;si fenêtre existe, pas de création
$Form4 = GUICreate("Form4", 200, 200, $sPos[0] , $sPos[1] + $sPos[3] + 20, -1, -1, $Form1 )
GUISetOnEvent($GUI_EVENT_CLOSE, "Form4Close")
GUISetState(@SW_SHOW)
EndFunc
Func Form4Close()
   GUIDelete($Form4)
EndFunc

Func _WM_MOVE ( $hWnd, $Msg, $wParam, $lParam ) ;réajuste positions fenêtres enfants
    $sPos = WinGetPos($Form1, "")
    If IsHWnd($Form2) Then WinMove($Form2,"",$sPos[0] + $sPos[2] + 20, $sPos[1])
   If IsHWnd($Form3) Then WinMove($Form3,"",$sPos[0] - $sPos[2] - 20, $sPos[1])
   If IsHWnd($Form4) Then WinMove($Form4,"",$sPos[0] , $sPos[1] + $sPos[3] + 20)
    Return $GUI_RUNDEFMSG
EndFunc ;==> _WM_COMMAND ( )

 

Re: Alignement Haut de 2 GUI Centrées à l'écran

Posté : mar. 24 juil. 2018 13:28
par mikell
On peut aussi gérer plusieurs gui avec GUIGetMsg + paramètre (voir exemple 2 dans l'aide) :wink:

Re: Alignement Haut de 2 GUI Centrées à l'écran

Posté : mer. 25 juil. 2018 09:13
par LaTMoT
Bonjour,

Merci Walkson, cela fonctionne parfaitement, je n'ai plus besoin de réfléchir et je pense avoir compris :)

Salut mikell :wink: Merci pour l'information.

@Plus