Funktionreferenz


ControlGetPos

Beschreibung anzeigen in

Erfragt die Position und die Größe eines Controls relativ zu seinem Fenster.

ControlGetPos ( "title", "text", controlID )

Parameter

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.

Rückgabewert

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.

Bemerkungen

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!

Verwandte Funktionen

ControlCommand, ControlMove

Beispiel

Beispiel 1

#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 2

;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 3

;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