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

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
someonescripting
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mar. 16 juin 2020 03:55
Status : Hors ligne

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

#1

Message 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 !
Modifié en dernier par someonescripting le ven. 10 juil. 2020 00:30, modifié 1 fois.
Un bon informaticien, est un informaticien fainéant !
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#2

Message 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)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
someonescripting
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mar. 16 juin 2020 03:55
Status : Hors ligne

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

#3

Message 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
Un bon informaticien, est un informaticien fainéant !
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#4

Message 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 ( )

Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#5

Message 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 ( )

Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
someonescripting
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mar. 16 juin 2020 03:55
Status : Hors ligne

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

#6

Message 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 !
Un bon informaticien, est un informaticien fainéant !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#7

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
someonescripting
Niveau 3
Niveau 3
Messages : 44
Enregistré le : mar. 16 juin 2020 03:55
Status : Hors ligne

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

#8

Message 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 !
Un bon informaticien, est un informaticien fainéant !
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

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

#9

Message 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.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#10

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GMH
Niveau 6
Niveau 6
Messages : 227
Enregistré le : dim. 24 juin 2012 14:56
Status : Hors ligne

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

#11

Message 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.
Répondre