• Offizieller Beitrag

    Hier mal noch ein paar zusätzliche API-Funktionen für die RECT-Struktur:

    Spoiler anzeigen
    [autoit]

    Local $tRECT = DllStructCreate('int Left;int Top;int Right;int Bottom')

    [/autoit] [autoit][/autoit] [autoit]

    ; === Befüllen
    ConsoleWrite('=== Befüllen' & @CRLF)
    ConsoleWrite( _WinAPI_SetRect($tRECT, 20, 30, 200, 300) & @CRLF)
    _ConsoleWriteRECT($tRECT)

    [/autoit] [autoit][/autoit] [autoit]

    ; === Verschieben
    ConsoleWrite('=== Verschieben' & @CRLF)
    ConsoleWrite( _WinAPI_OffsetRect($tRECT, 5, 5) & @CRLF)
    _ConsoleWriteRECT($tRECT)

    [/autoit] [autoit][/autoit] [autoit]

    ; === Punkt innerhalb RECT?
    ConsoleWrite('=== Punkt innerhalb RECT?' & @CRLF)
    ConsoleWrite(_WinAPI_PointInRect($tRECT, 150, 35) & @CRLF)
    ConsoleWrite(_WinAPI_PointInRect($tRECT, 150, 25) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; === Leeren
    ConsoleWrite('=== Leeren' & @CRLF)
    ConsoleWrite( _WinAPI_SetRectEmpty($tRECT) & @CRLF)
    _ConsoleWriteRECT($tRECT)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ConsoleWriteRECT(ByRef $tRECT)
    For $i = 1 To 4
    ConsoleWrite(DllStructGetData($tRECT, $i) & @CRLF)
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
    ; Description: Befüllt eine RECT-Struktur in einem Aufruf mit Werten
    ; Parameter(s): $tRECT RECT-Struktur
    ; $X1, $Y1, $X2, $Y2 Werte des Rectangle
    ; Return Value(s): Erfolg <> 0
    ; Fehler 0 set @error
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
    Local $ret = DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($tRECT), 'long', $X1, 'long', $Y1, 'long', $X2, 'long', $Y2)
    If @error > 0 Then Return SetError(1,@error,0)
    Return $ret[0]
    EndFunc ;==>_WinAPI_SetRect

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _WinAPI_SetRectEmpty(ByRef $tRECT)
    ; Description: Leert alle Werte einer RECT-Struktur in einem Aufruf
    ; Parameter(s): $tRECT RECT-Struktur
    ; Return Value(s): Erfolg <> 0
    ; Fehler 0 set @error
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _WinAPI_SetRectEmpty(ByRef $tRECT)
    Local $ret = DllCall("user32", 'long', 'SetRectEmpty', 'ptr', DllStructGetPtr($tRECT))
    If @error > 0 Then Return SetError(1,@error,0)
    Return $ret[0]
    EndFunc ;==>_WinAPI_SetRectEmpty

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _WinAPI_OffsetRect(ByRef $tRECT, $X, $Y)
    ; Description: Verschiebt eine RECT-Struktur um die $X/$Y-Werte
    ; Parameter(s): $tRECT RECT-Struktur
    ; $X Wert horizontale Verschiebung
    ; $Y Wert vertikale Verschiebung
    ; Return Value(s): Erfolg <> 0
    ; Fehler 0 set @error
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _WinAPI_OffsetRect(ByRef $tRECT, $X, $Y)
    Local $ret = DllCall("user32", 'long', "OffsetRect", 'ptr', DllStructGetPtr($tRECT), 'long', $X, 'long', $Y)
    If @error > 0 Then Return SetError(1,@error,0)
    Return $ret[0]
    EndFunc ;==>_WinAPI_OffsetRect

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _WinAPI_PointInRect(ByRef $tRECT, $X, $Y)
    ; Description: Prüft ob ein Punkt innerhalb einer RECT-Struktur ist
    ; Parameter(s): $tRECT RECT-Struktur
    ; $X, $Y Koordinaten des Punktes
    ; Return Value(s): Erfolg Punkt innerhalb=True / außerhalb=False
    ; Fehler -1 set @error
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _WinAPI_PointInRect(ByRef $tRECT, $X, $Y)
    Local $ret = DllCall("user32", 'long', 'PtInRect', 'ptr', DllStructGetPtr($tRECT), 'long', $X, 'long', $Y)
    If @error > 0 Then Return SetError(1,@error,-1)
    If $ret[0] > 0 Then
    Return True
    Else
    Return False
    EndIf
    EndFunc ;==>_WinAPI_PointInRect

    [/autoit]

    Edit: Noch eine Funktion ergänzt.
    Edit2: Und genau die gibt es doch schon in der WinAPI.au3 (_WinAPI_PointInRect - dort: _WinAPI_PtInRect) :S

    Edit 17.09.2012
    Neue Funktion hinzugefügt, s. Post #2

    DL bisher: 52

    • Offizieller Beitrag

    Eine der meistgenutzten Strukturen ist die RECT-Struktur.
    Ich finde es immer lästig, 5 Zeilen Code zu schreiben um die Struktur zu erstellen und mit Werten zu befüllen.

    Ich habe jetzt eine Funktion erstellt (und in die WinAPI_more eingefügt), die folgendes ermöglicht:
    • Erstellen UND Befüllen einer RECT-Struktur gleichzeitig
    • Befüllen einer bestehenden RECT-Struktur
    • Übergabe RECT-Struktur ODER Pointer auf RECT-Struktur
    • Werte einzeln ODER als 4-Elemente Array übergeben
    • Aufruf der RECT-Struktur ohne Werte (Defaultwerte "-1" werden verwendet) leert die Struktur

    Funktion _WinAPI_DllStructRECT_Set
    [autoit]


    ;===============================================================================
    ; Function Name..: _WinAPI_DllStructRECT_Set()
    ; Description....: Erstellt und/oder füllt eine RECT-Struktur, optional Leeren eines RECT
    ; Parameter(s)...: $_tRECT Leere Variable zur Aufnahme der RECT-Strukt oder Variable m. RECT-Strukt oder Pointer auf eine RECT-Strukt
    ; ...............: $_iLeft RECT left ODER Array mit allen 4 RECT-Werten (top, right, bottom werden dann ignoriert)!
    ; ...............: $_iTop RECT top
    ; ...............: $_iRight RECT right
    ; ...............: $_iBottom RECT bottom
    ; ...............: Mit "-1" für alle 4 RECT-Werte (Standard) wird die übergebene Struktur geleert
    ; Return Value(s): Erfolg 1
    ; Fehler 0 set @error = Errorwert aus DllCall oder "-1" = Wertearray übergeben mit falscher Dimensionsgröße
    ; Author(s)......: BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _WinAPI_DllStructRECT_Set(ByRef $_tRECT, $_iLeft=-1, $_iTop=-1, $_iRight=-1, $_iBottom=-1)
    Local $fSetEmpty = False, $fNewStruct = False
    If IsArray($_iLeft) Then
    If UBound($_iLeft) <> 4 Or UBound($_iLeft,0) > 1 Then Return SetError(-1,0,0)
    $_iTop = $_iLeft[1]
    $_iRight = $_iLeft[2]
    $_iBottom = $_iLeft[3]
    $_iLeft = $_iLeft[0]
    EndIf
    If $_iLeft = -1 And $_iTop = -1 And $_iRight = -1 And $_iBottom = -1 Then $fSetEmpty = True
    If Not IsPtr($_tRECT) Then
    If Not IsDllStruct($_tRECT) Then
    $_tRECT = DllStructCreate("struct; long Left;long Top;long Right;long Bottom; endstruct")
    $fNewStruct = True
    EndIf
    If $fSetEmpty And (Not $fNewStruct) Then
    Local $ret = DllCall("user32", 'long', 'SetRectEmpty', 'ptr', DllStructGetPtr($_tRECT))
    If @error > 0 Then Return SetError(@error,0,0)
    Else
    Local $ret = DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($_tRECT), 'long', $_iLeft, 'long', $_iTop, 'long', $_iRight, 'long', $_iBottom)
    If @error > 0 Then Return SetError(@error,0,0)
    EndIf
    Else
    If $fSetEmpty Then
    Local $ret = DllCall("user32", 'long', 'SetRectEmpty', 'ptr',$_tRECT)
    If @error > 0 Then Return SetError(@error,0,0)
    Else
    Local $ret = DllCall("user32", 'long', 'SetRect', 'ptr', $_tRECT, 'long', $_iLeft, 'long', $_iTop, 'long', $_iRight, 'long', $_iBottom)
    If @error > 0 Then Return SetError(@error,0,0)
    EndIf
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_DllStructRECT_Set

    [/autoit]
    Bsp.
    [autoit]


    #include "WinAPI_more.au3"

    [/autoit] [autoit][/autoit] [autoit]

    ; == Test 1
    ; == Struktur Erstellen und gleichzeitig Befüllen
    ; == Übergabe leere Variable und Werte einzeln, mit denen die Struktur befüllt werden soll
    Local $tRectangle
    $ret = _WinAPI_DllStructRECT_Set($tRectangle, 10, 10, 110, 50)
    If Not $ret Then
    ConsoleWrite('Fehler: ' & @error & @CRLF)
    Else
    ConsoleWrite('!> Test 1 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; == Test 2
    ; == bestehenden Struktur Befüllen
    ; == Übergabe Strukturvariable existierender Struktur und Werte einzeln
    $ret = _WinAPI_DllStructRECT_Set($tRectangle, 20, 100, 200, 150)
    If Not $ret Then
    ConsoleWrite('Fehler: ' & @error & @CRLF)
    Else
    ConsoleWrite('!> Test 2 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; == Test 3
    ; == bestehenden Struktur Befüllen
    ; == Übergabe Strukturvariable existierender Struktur und Werte im Array
    Local $aValue1[4] = [300,100,500,200]
    $ret = _WinAPI_DllStructRECT_Set($tRectangle, $aValue1)
    If Not $ret Then
    ConsoleWrite('Fehler: ' & @error & @CRLF)
    Else
    ConsoleWrite('!> Test 3 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; == Test 4
    ; == bestehenden Struktur Befüllen
    ; == Übergabe Pointer auf Strukturvariable existierender Struktur und Werte im Array
    Local $pRectangle = DllStructGetPtr($tRectangle)
    Local $aValue2[4] = [330,110,550,220]
    $ret = _WinAPI_DllStructRECT_Set($pRectangle, $aValue2)
    If Not $ret Then
    ConsoleWrite('Fehler: ' & @error & @CRLF)
    Else
    ConsoleWrite('!> Test 4 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; == Test 5
    ; == bestehenden Struktur Entleeren
    ; == Übergabe Pointer auf Strukturvariable
    $ret = _WinAPI_DllStructRECT_Set($pRectangle)
    If Not $ret Then
    ConsoleWrite('Fehler: ' & @error & @CRLF)
    Else
    ConsoleWrite('!> Test 5 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
    EndIf

    [/autoit]


    Die neue Version der WinAPI_more.au3 habe ich in Post #1 aktualisiert