Page 1 sur 1

[R]Positionnement deuxieme GUI par dessus la première.

Posté : jeu. 09 juil. 2020 15:31
par someonescripting
Bonjour bonjour,

Une petite question, dans mon script je crée une GUI principale et j'utilise une fonction pour en faire apparaitre une 2ème qui se supprime si on la ferme. Ma question est la suivante : est il possible que ma deuxième GUI puisse s'ouvrir par dessus la première et toujours au centre de celle ci plutôt que de lui donner une position défini sur l'écran en pixel ? C'est a dire que si je déplace ma première GUI de sa position initiale, si j'ouvre la deuxième que celle ci se mette automatiquement au centre et par dessus la première.

En espérant avoir été assez clair.
Merci bien !

Re: [..]Positionnement deuxieme GUI par dessus la première.

Posté : jeu. 09 juil. 2020 17:26
par walkson
Bonjour,
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $Form1 = GUICreate("Form1", 615, 438)
GUISetState(@SW_SHOW)
$ipos = WinGetPos($Form1)

Global $Form2 = GUICreate("Form1", 400, 300, $ipos[0], $ipos[1],-1,-1,$Form1)
GUISetState(@SW_SHOW)
While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit

 EndSwitch
WEnd
Je vous laisse fignoler pour ajuster la position
Après si la position de la GUI principale n'a pas d'importance, vous pouvez faire ceci
Global $Form1 = GUICreate("Form1", 615, 438,-1,-1)
Global $Form2 = GUICreate("Form1", 400, 300, -1, -1,-1,-1,$Form1)

Re: [..]Positionnement deuxieme GUI par dessus la première.

Posté : jeu. 09 juil. 2020 19:04
par someonescripting
Bonjour @walkson.

Merci pour ta réponse mais cela ne fonctionne pas comme je le souhaiterais.
En effet, lorsque j'appuie sur le bouton qui m'ouvre ma 2ème gui, celle ci s'ouvre sur le coin supérieur gauche de la GUI principale au lieu du centre (à la rigueur ce n'est pas le plus important), mais si je déplace ma GUI principale après le lancement, lorsque j'appuie sur le bouton, ma 2ème GUI s'ouvre à l'ancienne position de la 1ere.
J’appréciais que celle ci "détecte" la position actuelle de la première GUI pour s'afficher en son centre.

Merci

Re: [..]Positionnement deuxieme GUI par dessus la première.

Posté : jeu. 09 juil. 2020 19:33
par walkson
Et en plus, il est difficile. ça va couter plus cher :lol:
J'ai repris un code que j'ai modifié. ça explique les fantaisies. La gui fille suit sa mère comme une brave et réapparait en son centre à sa création

Code : Tout sélectionner

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1) ;mode événementiel
Global $Form2, $Button1_1, $sPos
Global $Form1 = GUICreate("Form1 Maitre", 400, 400, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
Global $Button1 = GUICtrlCreateButton("Ouvre", 16, 16, 81, 33)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)
Global $sPos = WinGetPos($Form1, "")
Global $x = $sPos[0], $y = $sPos[1] ;emplacement initial de $Form1
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 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] + 100, $sPos[1] + 100, $WS_POPUP, $WS_EX_OVERLAPPEDWINDOW, $Form1 )
GUISetBkColor(0xFFDD00)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form2Close")
$Button1_1 = GUICtrlCreateButton("Button1", 16, 16, 81, 33)
GUICtrlSetOnEvent(-1, "Button1_1Click")
GUICtrlCreateLabel("Form2", 16,55,81,33,BitOR(0x1000,0x01,0x0200))
GUICtrlSetFont(-1,16,600)
GUISetState(@SW_SHOW)
	For $i = 0 To 255 Step 5
	WinSetTrans($Form2, "", $i)
	Sleep(10)
	Next
EndFunc
Func Button1_1Click()
	MsgBox(32,"","clic", 2, $Form1)
EndFunc
Func Form2Close()
	For $i = 255 To 0 Step -5
	WinSetTrans($Form2, "", $i)
	Sleep(10)
	Next
	GUIDelete($Form2)
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] + 100, $sPos[1] + 100)
    Return $GUI_RUNDEFMSG
EndFunc ;==> _WM_COMMAND ( )


Re: [..]Positionnement deuxieme GUI par dessus la première.  

Posté : jeu. 09 juil. 2020 19:49
par walkson
Je vous mets le code initial pour le fun (c'est pas vraiment votre question). Il permet de créer une "grappe" de guis qui suit la Gui mère et se positionnent autour d'elle. Peut être utile pour un de vos futures projet ?...

Code : Tout sélectionner

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1) ;mode événementiel
Global $Form2, $Form3, $Form4, $Button1_1, $sPos
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, "")
Global $x = $sPos[0], $y = $sPos[1] ;emplacement initial de $Form1
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, $WS_EX_OVERLAPPEDWINDOW, $Form1 )
GUISetBkColor(0xFFDD00)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form2Close")
$Button1_1 = GUICtrlCreateButton("Button1", 16, 16, 81, 33)
GUICtrlSetOnEvent(-1, "Button1_1Click")
GUICtrlCreateLabel("Form2", 16,55,81,33,BitOR(0x1000,0x01,0x0200))
GUICtrlSetFont(-1,16,600)
GUISetState(@SW_SHOW)
	For $i = 0 To 255 Step 5
	WinSetTrans($Form2, "", $i)
	Sleep(10)
	Next
EndFunc
Func Button1_1Click()
	MsgBox(32,"","clic", 2, $Form1)
	WinMove($Form1,"",$x, $y)
EndFunc
Func Form2Close()
	For $i = 255 To 0 Step -5
	WinSetTrans($Form2, "", $i)
	Sleep(10)
	Next
	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: [..]Positionnement deuxieme GUI par dessus la première.

Posté : jeu. 09 juil. 2020 21:27
par someonescripting
Merci @walkson !

Je pense que cela pourrait m'être utile en effet car j'avais pensé à cela à l'origine (fenêtre qui suis sa parente comme bouton 2 et 3), je vais voir ce que je peux faire de tout ça afin de l'adapter à mes besoins et je reviendrais vers vous !

Merci pour ces exemple qui vont m'aider !

Re: [..]Positionnement deuxieme GUI par dessus la première.

Posté : jeu. 09 juil. 2020 21:28
par mikell
someonescripting a écrit : jeu. 09 juil. 2020 19:04cela ne fonctionne pas comme je le souhaiterais.
Une minime adaptation du code fait l'affaire. Quelle flemme ! :roll: :mrgreen:

#include <GUIConstantsEx.au3>

$Form1 = GUICreate("Form1", 615, 438)
$btn = GuiCtrlCreateButton("gui 2", 50, 50, 50, 30)
GUISetState(@SW_SHOW)

While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
   Case $GUI_EVENT_CLOSE
      Exit
   Case $btn
      $ipos = WinGetPos($Form1)
      $w2 = 400
      $h2 = 300
      $Form2 = GUICreate("Form1", $w2, $h2, _
               $ipos[0]+$ipos[2]/2-$w2/2, $ipos[1]+$ipos[3]/2-$h2/2, -1, -1, $Form1)
      GUISetState(@SW_SHOW)
 EndSwitch
WEnd

Re: [R]Positionnement deuxieme GUI par dessus la première.

Posté : ven. 10 juil. 2020 00:32
par someonescripting
Merci @mikell de ta réponse.

Du coup je me suis débrouillé avec le second exemple de walkson, et cela me convient parfaitement !

Merci pour l'aide encore et toujours !

Re: [R]Positionnement deuxieme GUI par dessus la première.

Posté : mar. 21 juil. 2020 17:55
par GMH
Bonjour,

Votre code, Mikell, ferme les deux fenêtres lorsqu'on ferme la fenêtre-fille. Le Case $GUI_EVENT_CLOSE s'applique donc aux deux. Peut-on désactiver la croix de fermeture de la fenêtre-fille ? Si oui, on ajouterait un bouton [Close] dans la fenêtre-fille. Sinon, comment résoudre la question ?

Merci pour ces codes bien utiles.

Re: [R]Positionnement deuxieme GUI par dessus la première.

Posté : mar. 21 juil. 2020 21:31
par mikell
Ce code était rudimentaire, juste une réponse à la situation évoquée :mrgreen:
Pour pouvoir fermer avec la croix la fenêtre fille seulement, il faut (par exemple) utiliser GUIGetMsg avec son paramètre "advanced" pour lui faire retourner l'array qui va bien

#include <GUIConstantsEx.au3>

$Form1 = GUICreate("Form1", 615, 438)
$btn = GuiCtrlCreateButton("gui 2", 50, 50, 50, 30)
GUISetState(@SW_SHOW)

While 1
 $nMsg = GUIGetMsg(1)   ;<<<<<
 Switch $nMsg[0]    ;<<<<<
   Case $GUI_EVENT_CLOSE
      GuiDelete($nMsg[1])   ;<<<<<
      If $nMsg[1] = $Form1 Then Exit
   Case $btn
      $ipos = WinGetPos($Form1)
      $w2 = 400
      $h2 = 300
      $Form2 = GUICreate("Form1", $w2, $h2, _
               $ipos[0]+$ipos[2]/2-$w2/2, $ipos[1]+$ipos[3]/2-$h2/2, -1, -1, $Form1)
      GUISetState(@SW_SHOW)
 EndSwitch
WEnd

Re: [R]Positionnement deuxieme GUI par dessus la première.

Posté : mer. 22 juil. 2020 10:15
par GMH
Merci pour ce code complétant le premier. Je note tous les codes présentés dans ce fil. Je ne tarderai pas à utiliser l'un ou l'autre. Merci à tous deux.