[Func] _CheckWindowsPosition() - Re-positionne une GUI
Posté : dim. 18 sept. 2011 00:13
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 :
Un code d'exemple :
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.
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
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