Erfragt die Position und die Größe eines Controls relativ zu seinem Fenster.
ControlGetPos ( "title", "text", controlID )
title | Der Titel/hWnd/Klasse des Fensters, auf das zugegriffen werden soll. Siehe Erweiterte Fenstertiteldefinition. |
text | Der Text des Fensters, auf das zugegriffen werden soll. Siehe Erweiterte Fenstertextdefinition. |
ControlID | Die ID des Controls, das beeinflusst werden soll. Siehe Controls. |
Erfolg: | Gibt ein Array zurück, das die Position und die Größe des Controls relativ zu seinem Fenster enthält: $aArray[0] = X-Position $aArray[1] = Y-Position $aArray[2] = Breite $aArray[3] = Höhe |
Fehler: | Setzt @error auf 1. |
Der Titel/Text stellt den Bezug zum Fenster her. "" ist mit Vorsicht zu benutzen, da "" den Bezug zum aktiven Fenster herstellt und dieses nicht das gewünschte Fenster sein könnte, welches das Control enthält.
Wird ein Fenster mit GUISetState(@SW_MAXIMIZE, $hGUI) maximiert, so liefert ControlGetPos falsche Werte (siehe Beispiel unten).
Die erfragte Größe bezieht sich auf den Zustand direkt nach der Erstellung des Controls. Spätere Änderungen des Fonts, die sich auf die Größe des Controls auswirken, finden keine Berücksichtigung!
#include <MsgBoxConstants.au3>
Example()
Func Example()
; Startet den Editor
Run("notepad.exe")
; Wartet maximal 10 Sekunden bis das Editorfenster erscheint.
Local $hWnd = WinWait("[CLASS:Notepad]", "", 10)
; Ermittelt die X-Position, Y-Position und Größe (Breite und Höhe) des Edit-Controls im Editor. Dabei wird für den "title" Parameter von ControlGetPos das von WinWait zurückgegebenen Handle verwendet.
Local $aPos = ControlGetPos($hWnd, "", "Edit1")
; Zeigt die Position und Größe des Edit-Controls.
MsgBox($MB_SYSTEMMODAL, "", "Position: " & $aPos[0] & ", " & $aPos[1] & @CRLF & "Size: " & $aPos[2] & ", " & $aPos[3])
; Schließt das Editorfenster durch die Verwendung des von WinWait zurückgegebenen Handles.
WinClose($hWnd)
EndFunc ;==>Example
;Beispiel zum Problem bei @SW_MAXIMIZE (siehe Bemerkungen oben)
;-- TIME_STAMP 2018-01-01 11:22:43 v 0.1
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $WIN_STATE_VISIBLE = 2 ; Fenster ist sichtbar.
Global $WIN_STATE_MINIMIZED = 16 ; Fenster ist minimiert.
Global $WIN_STATE_MAXIMIZED = 32 ; Fenster ist maximiert.
#Region - GUI Create
Local $hGUI = GUICreate('ControlGetPos-Test', 400, 200)
Local $idButton = GUICtrlCreateButton('Exit', 10, 10, 380, 25)
#EndRegion
; Position wie beim Erstellen angegeben
GUISetState($hGUI)
_GetControlPos($hGUI, 'ControlGetPos-Test', $idButton)
; Maximieren
GUISetState(@SW_MAXIMIZE, $hGUI)
_GetControlPos($hGUI, 'ControlGetPos-Test', $idButton) ;>>> lieferte falsche Werte, siehe roter Text in der Console
; Restaurierte Position - wie beim Erstellen angegeben.
GUISetState(@SW_RESTORE, $hGUI)
_GetControlPos($hGUI, 'ControlGetPos-Test', $idButton)
; Minimieren
GUISetState(@SW_MINIMIZE, $hGUI)
_GetControlPos($hGUI, 'ControlGetPos-Test', $idButton)
;~ Exit
Func _GetControlPos($hWnd, $sText, $iCtrlID)
Local Static $iHeader, $aHeader = ['WinPos ($hGUI)', 'CtrlPos ($idButton)', '$WIN_STATE_VISIBLE', '$WIN_STATE_MINIMIZED', '$WIN_STATE_MAXIMIZED', '@SW_RESTORE']
Local $aWinPos = WinGetPos($hWnd)
Local $aCtrlPos = ControlGetPos($hWnd, $sText, $iCtrlID)
Local $iState = WinGetState($hWnd), $aState[1][4], $sColor
If BitAND($iState, $WIN_STATE_VISIBLE) = $WIN_STATE_VISIBLE Then
$aState[0][0] = 'Fenster ist sichtbar'
If BitAND($iState, $WIN_STATE_MAXIMIZED) = $WIN_STATE_MAXIMIZED Then
$aState[0][1] = 'Fenster ist maximiert.'
$sColor = '!'
ElseIf BitAND($iState, $WIN_STATE_MINIMIZED) = $WIN_STATE_MINIMIZED Then
$aState[0][2] = 'Fenster ist minimiert.'
$sColor = '-'
Else
$aState[0][3] = 'Restaurierte Position - wie beim Erstellen angegeben.'
$sColor = '+'
EndIf
Else
$aState[0][0] = 'Fenster ist nicht sichtbar.'
$sColor = '@'
EndIf
If $iHeader = '' Then
ConsoleWrite(StringFormat('> %-42s | %-42s | %-30s | %-23s | %-23s |%s\r', $aHeader[0], $aHeader[1], $aHeader[2], $aHeader[3], $aHeader[4], $aHeader[5]))
$iHeader = True
EndIf
ConsoleWrite(StringFormat('%s x:%7i, y:%7i, w:%7i, h:%7i | x:%7i, y:%7i, w:%7i, h:%7i | %-30s | %-23s | %-23s | %-30s\r', _
$sColor, _
$aWinPos[0], $aWinPos[1], $aWinPos[2], $aWinPos[3], _
$aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[2], $aCtrlPos[3], _
$aState[0][0], $aState[0][1], $aState[0][2], $aState[0][3]))
EndFunc
#Region - GUI SwitchLoop
;~ Local $iState
;~ While True
;~ Switch GUIGetMsg()
;~ Case $GUI_EVENT_CLOSE, $idButton
;~ Exit
;~ EndSwitch
;~ WEnd
#EndRegion
;Beispiel zum Problem bei @SW_MAXIMIZE (siehe Bemerkungen oben)
;resizen und beobachten, wie sich die Werte verändern und das Group-Control neu positioniert wird.
;Dann maximieren und beobachten, daß das Group-Control nicht neu positioniert wird, weil ControlGetPos immer noch die gleichen Werte wie vor der Maximierung zurückliefert.
;Nach dem Restore wird Group übrigens nochmal falsch positioniert, anscheinend nach der Position, die das Input vorher, während der Maximierung hatte.
#include <GUIConstants.au3>
$MainGUI = GUICreate("", 600, 600, -1, -1, $WS_MINIMIZEBOX + $WS_MAXIMIZEBOX + $WS_SIZEBOX)
GUIRegisterMsg($WM_SIZE, "_WM_SIZE")
$patternGroup = GUICtrlCreateGroup("", 10, 210, 570, 60)
GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT + $GUI_DOCKRIGHT + $GUI_DOCKLEFT)
Global $g_idPattern = GUICtrlCreateInput("", 70, 230, 500, 30)
GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT + $GUI_DOCKRIGHT + $GUI_DOCKLEFT)
GUISetState(@SW_SHOW)
Func _WM_SIZE($hWnd, $Msg, $wParam, $lParam)
Local $InputPos = ControlGetPos($MainGUI, "", $g_idPattern)
GUICtrlSetData($g_idPattern, "GUICtrlGetPos( Left: " & $InputPos[0] & ", Top: " & $InputPos[1] & ", Width: " & $InputPos[2] & ", Height: " & $InputPos[3] & ")")
Local $GroupPos = ControlGetPos($MainGUI, "", $patternGroup)
GUICtrlSetPos($patternGroup, Default, $InputPos[1] - 18, $GroupPos[2], Default)
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_SIZE
While GUIGetMsg() <> -3
WEnd