[Func] _CheckWindowsPosition() - Re-positionne une GUI

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

[Func] _CheckWindowsPosition() - Re-positionne une GUI

#1

Message par Tlem »

Voici une fonction toute bête, mais qui peut servir en de multiples occasions.

Imaginons que votre script mémorise la dernière position utilisée. Si vous le lancez alors que la résolution à été modifiée par une résolution moins grande, votre GUI ce retrouvera éventuellement en dehors du cadre de votre bureau et là selon le cas, il vous sera peut être impossible d'atteindre la barre de titre afin de repositionner votre GUI.

Afin éviter ce désagrément, utilisez simplement la fonction ci-dessous, qui vérifiera la taille du bureau et de votre GUI ainsi que sa position. En cas de débordement, la fenêtre sera alignée sur le/les bords les plus proches.

La fonction :

Code : Tout sélectionner

#include <WinAPI.au3>

; #FUNCTION# =========================================================================================
; Name...........: _CheckWindowsPosition
; Description ...: Move a designed windows to fit to the desktop workspace
; Syntax.........: _CheckWindowsPosition($hGuiToCheck, $iBar)
; Parameters ....: $hGuiToCheck - The windows handle of the GUI.
;                  $iBar        - Take care of tools bar like systray :
;                   |0 - Don't take care of toolsbar.
;                   |1 - Take care of toolsbar (défault)
; Return values .: An array with the new position of the windows
; Author ........: Tlem
; Modified.......:
; Remarks .......: Tanks to Bowmore (_GetWorkArea function) and Ahbadiane
; Related .......:
; Link ..........: http://www.autoitscript.fr/forum/viewtopic.php?p=55058
; Require .......: WinAPI.au3
; Example .......: Yes
; ====================================================================================================
Func _CheckWindowsPosition($hGuiToCheck, $iBar = 1)
    ; Get Windows position / Récupère les coordonnées de la fenêtre
    Local $aCI = WinGetPos($hGuiToCheck)
    If $iBar <> 0 Then $iBar = 1
    Local $WorkSpace[4]
    ; This part came from / Cette partie provient de :
    ; http://www.autoitscript.com/forum/topic/41576-desktopwidthheight/page__view__findpost__p__462845
    ; Get the workspace of the desktop / Récupère les coordonnées du bureau
    Local $stRect = DllStructCreate("long left;long top;long right;long bottom")
    Local $iResult = _WinAPI_SystemParametersInfo(48, 0, DllStructGetPtr($stRect), 0)
    If $iResult = True And $iBar = 1 Then
        $WorkSpace[0] = DllStructGetData($stRect, "left")
        $WorkSpace[1] = DllStructGetData($stRect, "top")
        $WorkSpace[2] = DllStructGetData($stRect, "right")
        $WorkSpace[3] = DllStructGetData($stRect, "bottom")
    Else
    ; Else we use default workspace / Sinon, on utilise l'espace de bureau classique
        $WorkSpace[0] = 0
        $WorkSpace[1] = 0
        $WorkSpace[2] = @DesktopWidth
        $WorkSpace[3] = @DesktopHeight
    EndIf

    ; If GUI is too to the Left / Si la GUI est trop à gauche
    If $aCI[0] < $WorkSpace[0] Then $aCI[0] = $WorkSpace[0]

    ; If GUI is too to the right / Si la GUI est trop à droite
    If $aCI[0] + $aCI[2] > $WorkSpace[2] Then $aCI[0] = $WorkSpace[2] - $aCI[2]

    ; If GUI is too much at the top / Si la GUI est trop en haut
    If $aCI[1] < $WorkSpace[1] Then $aCI[1] = $WorkSpace[1]

    ; If GUI is too much below / Si la GUI est trop en bas
    If $aCI[1] + $aCI[3] > $WorkSpace[3] Then $aCI[1] = $WorkSpace[3] - $aCI[3]

    ; If GUI is too big for the workspace, then align the title bar at the top
    ; Si la GUI est trop grande pour l'espace du bureau, alors on aligne la barre de titre en haut.
    If $aCI[3] > $WorkSpace[3] Then $aCI[1] = $WorkSpace[1]

    ; Move de windows to the new coordinate / Déplace la fenêtre aux nouvelles coordonnées
    WinMove($hGuiToCheck, "", $aCI[0], $aCI[1])
    Return $aCI
EndFunc
Un code d'exemple :

Code : Tout sélectionner

Global $Form1 = GUICreate("Ma GUI", 600, 400, 200, -50)
GUISetState(@SW_SHOW)

MsgBox(64 + 262144, "Avant", "La fenêtre déborde sur le haut du bureau")
_CheckWindowsPosition($Form1)
MsgBox(64 + 262144, "Après", "La fenêtre est ramenée sur le bureau," & @CRLF & _
                            " aligneé sur le haut")

WinMove($Form1, "", -10, 500)

MsgBox(64 + 262144, "Avant", "La fenêtre déborde sur le bas du bureau")
_CheckWindowsPosition($Form1)
MsgBox(64 + 262144, "Après", "La fenêtre est ramenée sur le bureau," & @CRLF & _
                            " aligneé sur le bas")

WinMove($Form1, "", 600, 400, 600, 800)

MsgBox(64 + 262144, "Avant", "La fenêtre déborde sur le bas gauche du bureau" & @CRLF & _
                             "et est plus grande que l'espace de travail")
_CheckWindowsPosition($Form1)
MsgBox(64 + 262144, "Après", "La fenêtre est ramenée sur le bureau," & @CRLF & _
                             "et la barre de titre alignée en haut")

Exit
Modification du 20-09-2011 : Ajout d'un contrôle de la taille de la fenêtre à repositionner (demande de mikell), afin d'aligner sa barre de titre sur le haut, si sa hauteur dépasse l'espace du bureau et mise à jour de l'exemple.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Ahbadiane
Niveau 5
Niveau 5
Messages : 139
Enregistré le : jeu. 20 déc. 2007 22:39
Localisation : Paris
Status : Hors ligne

Re: [Func] _CheckWindowsPosition() - Re-positionne une GUI

#2

Message par Ahbadiane »

Thierry,

Ta fonction ne prend pas en compte la barre de tâches et donc la fenêtre peut se retrouver sous la barre de tâches.
J'utilise une fonction qui donne l'espace libre du bureau
(Fonction tirée de http://www.autoitscript.com/forum/index ... opic=41576 - message N°24)

Code : Tout sélectionner

#include <WinAPI.au3>
Func _EspaceBureau()
    Local $iEspaceBureau[4]
    Local $stRect = DllStructCreate("long left;long top;long right;long bottom")
    Local $iResult = _WinAPI_SystemParametersInfo(48, 0, DllStructGetPtr($stRect), 0)
    If $iResult Then
        $iEspaceBureau[0] = DllStructGetData($stRect, "left")
        $iEspaceBureau[1] = DllStructGetData($stRect, "top")
        $iEspaceBureau[2] = DllStructGetData($stRect, "right")
        $iEspaceBureau[3] = DllStructGetData($stRect, "bottom")
    Else
        $iEspaceBureau[0] = 0
        $iEspaceBureau[1] = 0
        $iEspaceBureau[2] = @DesktopWidth
        $iEspaceBureau[3] = @DesktopHeight
    EndIf
    Return $iEspaceBureau
EndFunc   ;==>EspaceBureau
et l'intégration dans ta propre fonction donne

Code : Tout sélectionner

Func _CheckWindowsPosition($hGuiToCheck)
    Local $aCI = WinGetPos($hGuiToCheck)
    Local $aDesk = _EspaceBureau()

    ; If GUI is too to the Left / Si la GUI est trop à gauche
    If $aCI[0] < $aDesk[0] Then $aCI[0] = $aDesk[0]

    ; If GUI is too to the right / Si la GUI est trop à droite
    If $aCI[0] + $aCI[2] > $aDesk[2] Then $aCI[0] = $aDesk[2] - $aCI[2]

    ; If GUI is too much at the top / Si la GUI est trop en haut
    If $aCI[1] < $aDesk[1] Then $aCI[1] = $aDesk[1]

    ; If GUI is too much below / Si la GUI est trop en bas
    If $aCI[1] + $aCI[3] > $aDesk[3] Then $aCI[1] = $aDesk[3] - $aCI[3]

    WinMove($hGuiToCheck, "", $aCI[0], $aCI[1])
EndFunc
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] _CheckWindowsPosition() - Re-positionne une GUI

#3

Message par Tlem »

Effectivement, je n'avais pas pris volontairement en considération la barre de tâche, car pour moi, elle ne représente pas une très grande gène.
Je constate qu'il en est sans doute autrement pour d'autre.

Effectivement la solution de Bowmore me semble intéressante à plus d'un titre, car elle prend en compte l'espace libre du bureau et donc toutes barres additionnelles, car sinon le simple retrait de la hauteur de la barre des tâches aurait suffit.
Je vais donc refaire la fonction pour que le choix soit possible entre les coordonnées pures et la prise en compte des barres diverses.

Merci pour cette astuce.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [Func] _CheckWindowsPosition() - Re-positionne une GUI

#4

Message par mikell »

il vous sera peut être impossible d'atteindre la barre de titre afin de repositionner votre GUI.
Hello Image
Il serait intéressant de privilégier certains repositionnements, par exemple :
J'ai une gui trop haute, qui déborde en haut et en bas :

Code : Tout sélectionner

Global $Form1 = GUICreate("Ma GUI", 600, 1200, 200, -50)
(ma resolution étant 1920x1080, une hauteur de 1200 n'est pas inconcevable)
Dans ce cas, la fonction aligne correctement le bord inférieur, et je n'ai toujours pas accès à la barre de titre
" 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
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] _CheckWindowsPosition() - Re-positionne une GUI

#5

Message par Tlem »

Voilà qui est fait. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [Func] _CheckWindowsPosition() - Re-positionne une GUI

#6

Message par mikell »

Merci pour la modif.
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre