GUI Object größe in gui ermitteln

  • Hi @ all !

    Ich würde gerne wissen , wie ich aus einem ctrl Object die Werte für width , height , left, top ermitteln / auslesen kann.

    Ich würde das gerne in eine Funktion packen .. hier mein Ansatz

    Spoiler anzeigen
    [autoit]


    Func _renew(ByRef $Object, ByRef $Object_CTRL)

    $width = "die fehlende funktion"($Object_CTRL,"width")
    $height= "die fehlende funktion"($Object_CTRL,"height")
    $left= "die fehlende funktion"($Object_CTRL,"left")
    $top= "die fehlende funktion"($Object_CTRL,"$top")

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

    $Object = ObjCreate("........called...")
    $Object_CTRL= GUICtrlCreateObj($Object , $left-10, $top+50, $width*5, $height)

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

    EndFunc

    [/autoit]

    Ich hoffe ihr versteht was ich meine.

    Ich find einfach nix in der Hilfe...... ?(

  • mmm geht weder mit

    Spoiler anzeigen
    [autoit]


    $Varaible = ControlGetPos("","",$Object)
    _ArrayDisplay($Varaible)

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

    ;noch mit

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

    $Varaible = ControlGetPos("","",$Object_CTRL)
    _ArrayDisplay($Varaible)

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

    sind die Windows Managment - Controls nicht nur für Programme ? ... ich suche ja eine Abgrafe GUI intern .. ( in meiner eigenen GUI )

  • quatsch .. das IST doch meine GUI !! den Namen vergebe doch ich !!

    ABER in die GUI wird ein Object eingebunden ..... in ein Gui CTRL....
    dieses Gui CTRL bekommt ja bestimmte größen zugeteilt.

    d.h. meine Gui ( name - TEST ) hat eine fixe Größe von 500*500

    in der Gui befindet sich an Position 10/10 ein GuiCtrl ( welches ein Object beherbergt ) mit der größe 100*100

    wenn ich jetzt dieses GuiCtrl verändern will z.b. Pos: 33/33 Dim: 55*55

    müsste ich ja das Gui Ctrl NEU anlegen. ... wäre ja kein Problem soweit ABER ich will das Permanent wiederholend machen.
    Dies mit Hilfe einer Funktion.

    Anderst formuliert : Meine "TEST" Gui bleibt unverändert an einer Position im Bildschirm stehen / auch dessen Größe ist fix.

    nur mehrere Object in meiner "Test" Gui soll sich bewegen. deswegen kann ich auch die Position eines Objectes nicht irgend wo abspeichern und dann später einfach wieder holen,
    das ich die Funktion auf mehrere Objecte anwenden will ....

    Ich weis nicht wie ich mich anders ausdrücken soll. sorry :wacko:

  • Da es sich sowieso um deine eigene GUI handelt brauchst du das AutoIt Window Info Tool nicht, sondern kannst einfach das Handle benutzen (Rückgabewert von GUICreate).
    Das verwendest du als ersten Parameter bei ControlGetPos. Wie kommst du darauf den einfach weg zu lassen? :huh:

  • Hö? Eigentlich müsste dieser Code hier funktionieren:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    Opt('GUICloseOnESC', 0)
    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)

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

    Global Enum $iW, $iH, $iX, $iY
    Global $aiRandom[4], $oIE, $hGUI, $idObj, $aiPos

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

    $aiRandom[$iW] = Random(1, 800, 1)
    $aiRandom[$iH] = Random(1, 600, 1)
    $aiRandom[$iX] = Random(0, 800 - $aiRandom[$iW], 1)
    $aiRandom[$iY] = Random(0, 600 - $aiRandom[$iH], 1)

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

    $oIE = ObjCreate("Shell.Explorer.2")

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

    $hGUI = GUICreate('Example', 800, 600)
    $idObj = GUICtrlCreateObj($oIE, $aiRandom[$iX], $aiRandom[$iY], $aiRandom[$iW], $aiRandom[$iH])
    GUISetOnEvent($GUI_EVENT_CLOSE, '_GUI_EVENT_CLOSE')
    GUISetState()

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

    $aiPos = ControlGetPos($hGUI, '', $idObj)
    ; # Beachte diesen Codeblock <-- <-- <-- <-- <--
    If @error Then
    ConsoleWrite(@CRLF & '!> ERROR' & @CRLF & @CRLF)
    Exit
    EndIf
    ; # Beachte diesen Codeblock <-- <-- <-- <-- <--
    MsgBox(262144, 'Output:', 'X position' & @TAB & $aiRandom[$iX] & ' | ' & $aiPos[$iX] & @CRLF & _
    'Y position' & @TAB & $aiRandom[$iY] & ' | ' & $aiPos[$iY] & @CRLF & _
    'Width' & @TAB & $aiRandom[$iW] & ' | ' & $aiPos[$iW] & @CRLF & _
    'Height' & @TAB & $aiRandom[$iH] & ' | ' & $aiPos[$iH], 10, $hGUI)

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

    While Sleep(1000)
    WEnd

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

    Func _GUI_EVENT_CLOSE()
    Exit
    EndFunc

    [/autoit]

    Hmpf, ... Dabei wollte ich dir so ein schönes Beispiel schreiben :D
    Ist das zufällig das Problem was du hast?

  • Hi !

    leider nein, du speicherst ja die Coordinaten in einer Globalen Variablen

    hier mein kleines beispiel, um euch zu demonstrieren, was ich eigentlich will :D

    Ich hoffe mal, dass jeder einen Acrobat reader instaliert hat ..

    man muss nur noch die Variable -> Global $_Acro_UDF_firstLoad_File = @ScriptDir & "\LOAD.pdf" <- mit einem PDF file das man hat befüllen ..

    Spoiler anzeigen
    [autoit]


    HotKeySet("{ESC}", "Terminate")

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

    #include <GUIConstants.au3>

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

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode , damit gui protokoll anderst abgearbeitet wird ( mit funktionen , nicht case )

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

    Global $_Acro_UDF_firstLoad_File = @ScriptDir & "\LOAD.pdf"

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

    Global $mainwindow = GUICreate(@ScriptName, 500, 500, 0, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") ; wenn event $GUI_EVENT_CLOSE aktiviert wird, wird funktion "CLOSEClicked" aufgerufen
    Global $AcroObject1 = _Acro_UDF_initialization()
    Global $AcroObject2 = _Acro_UDF_initialization()
    Global $AcroOb1_Ctrl1 = _Acro_UDF_CreateCtrl($AcroObject1, 200, 200, 10, 10)
    Global $AcroOb1_Ctrl2 = _Acro_UDF_CreateCtrl($AcroObject2, 200, 200, 210, 210)

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

    GUISetState(@SW_SHOW) ; anzeigen des gui

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

    ; hier die Funktion die ich brauche

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

    For $i = 1 To 200 Step 1
    _Acro_UDF_reset($AcroObject1,$AcroOb1_Ctrl1, 0, 0, $i)
    _Acro_UDF_reset($AcroObject2,$AcroOb1_Ctrl2, 0, 0, 200-$i)
    sleep(200)
    Next

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

    While 1
    Sleep(400)
    WEnd

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

    Exit

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

    ;----------------------------------------------------------------

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

    Func _Acro_UDF_reset(ByRef $Object, ByRef $Obj_ctrl, $width = 0, $height = 0, $left = 0, $top = 0)

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

    GUICtrlSetState($Obj_ctrl, $GUI_HIDE)

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

    If $width = 0 Then
    ;$width = **GUICtrlGetPosition ** ($Obj_ctrl, "width")
    EndIf
    If $height = 0 Then
    ;$height = **GUICtrlGetPosition ** ($Obj_ctrl, "height")
    EndIf
    If $left = 0 Then
    ;$left = **GUICtrlGetPosition ** ($Obj_ctrl, "left")
    EndIf
    If $top = 0 Then
    ;$top = **GUICtrlGetPosition ** ($Obj_ctrl, "top")
    EndIf

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

    $Object = ObjCreate("AcroPDF.PDF.1")
    $Object.src = $_Acro_UDF_firstLoad_File

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

    $Obj_ctrl = GUICtrlCreateObj($Object, $left, $top, $width, $height)

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

    GUICtrlSetState($Object, $GUI_SHOW)

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

    EndFunc ;==>_Acro_UDF_reset

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

    Func CLOSEClicked()
    Terminate()
    EndFunc ;==>CLOSEClicked

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

    Func Terminate()
    Exit 0
    EndFunc ;==>Terminate

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

    ;----------------------------
    Func _Acro_UDF_initialization()
    $AcrobatObj = ObjCreate("AcroPDF.PDF.1")
    $AcrobatObj.src = $_Acro_UDF_firstLoad_File
    Return $AcrobatObj
    EndFunc ;==>_Acro_UDF_initialization

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

    Func _Acro_UDF_CreateCtrl($AcrobatObj, $width = 100, $height = 100, $left = 0, $top = 0)
    $AcrobatObj_ctrl = GUICtrlCreateObj($AcrobatObj, $left, $top, $width, $height)
    GUICtrlSetState($AcrobatObj_ctrl, $GUI_SHOW)
    Return $AcrobatObj_ctrl
    EndFunc ;==>_Acro_UDF_CreateCtrl

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

    Ihr seht, dass die 2 Obj_Ctrl 1/ 2

    Spoiler anzeigen
    [autoit]


    Global $AcroOb1_Ctrl1 = _Acro_UDF_CreateCtrl($AcroObject1, 200, 200, 10, 10)
    Global $AcroOb1_Ctrl2 = _Acro_UDF_CreateCtrl($AcroObject2, 200, 200, 210, 210)

    [/autoit]

    versetzt dargestellt werden .. gegenüberliegende kacheln.

    und ich diese in ihrer "top" position aber behalten möchte ..
    also Prinzipiell das obere wandert nach rechts das untere nach links

    Spoiler anzeigen
    [autoit]


    For $i = 1 To 200 Step 1
    _Acro_UDF_reset($AcroObject1,$AcroOb1_Ctrl1, 0, 0, $i)
    _Acro_UDF_reset($AcroObject2,$AcroOb1_Ctrl2, 0, 0, 200-$i)
    sleep(200)
    Next

    [/autoit]

    ist jetzt nur ein Beispiel. mir ist schon klar, dass ich die TOP position auch übergeben könnte.
    aber sinn einer Funktion sollte es ja sein, so modular wie möglich zu sein ..

    kann man es jetzt verstehen ?
    die funktion die ich suche ist

    Spoiler anzeigen
    [autoit]


    If $width = 0 Then
    ;$width = **GUICtrlGetPosition ** ($Obj_ctrl, "width")
    EndIf
    If $height = 0 Then
    ;$height = **GUICtrlGetPosition ** ($Obj_ctrl, "height")
    EndIf
    If $left = 0 Then
    ;$left = **GUICtrlGetPosition ** ($Obj_ctrl, "left")
    EndIf
    If $top = 0 Then
    ;$top = **GUICtrlGetPosition ** ($Obj_ctrl, "top")
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • also bei deinem script bekomme ich nur ein ERROR

    wenn ich meine Funktion entsprechend anpasse ->

    Spoiler anzeigen
    [autoit]


    HotKeySet("{ESC}", "Terminate")

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

    #include <GUIConstants.au3>
    #include <array.au3>

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

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode , damit gui protokoll anderst abgearbeitet wird ( mit funktionen , nicht case )

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

    Global $_Acro_UDF_firstLoad_File = @ScriptDir & "\LOAD.pdf"

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

    Global $mainwindow = GUICreate(@ScriptName, 500, 500, 0, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") ; wenn event $GUI_EVENT_CLOSE aktiviert wird, wird funktion "CLOSEClicked" aufgerufen
    Global $AcroObject1 = _Acro_UDF_initialization()
    Global $AcroObject2 = _Acro_UDF_initialization()
    Global $AcroOb1_Ctrl1 = _Acro_UDF_CreateCtrl($AcroObject1, 200, 200, 10, 10)
    Global $AcroOb1_Ctrl2 = _Acro_UDF_CreateCtrl($AcroObject2, 200, 200, 210, 210)

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

    GUISetState(@SW_SHOW) ; anzeigen des gui

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

    ; hier die Funktion die ich brauche

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

    For $i = 1 To 200 Step 1
    _Acro_UDF_reset($mainwindow,$AcroObject1,$AcroOb1_Ctrl1, 0, 0, $i)
    _Acro_UDF_reset($mainwindow,$AcroObject2,$AcroOb1_Ctrl2, 0, 0, 200-$i)
    sleep(200)
    Next

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

    While 1
    Sleep(400)
    WEnd

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

    Exit

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

    ;----------------------------------------------------------------

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

    Func _Acro_UDF_reset($hGUI,ByRef $Object, ByRef $Obj_ctrl, $width = 0, $height = 0, $left = 0, $top = 0)

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

    GUICtrlSetState($Obj_ctrl, $GUI_HIDE)

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

    $aiPos = ControlGetPos($hGUI, '', $Obj_ctrl)
    _ArrayDisplay($aiPos)

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

    If $width = 0 Then
    ;$width = **GUICtrlGetPosition ** ($Obj_ctrl, "width")
    EndIf
    If $height = 0 Then
    ;$height = **GUICtrlGetPosition ** ($Obj_ctrl, "height")
    EndIf
    If $left = 0 Then
    ;$left = **GUICtrlGetPosition ** ($Obj_ctrl, "left")
    EndIf
    If $top = 0 Then
    ;$top = **GUICtrlGetPosition ** ($Obj_ctrl, "top")
    EndIf

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

    $Object = ObjCreate("AcroPDF.PDF.1")
    $Object.src = $_Acro_UDF_firstLoad_File

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

    $Obj_ctrl = GUICtrlCreateObj($Object, $left, $top, $width, $height)

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

    GUICtrlSetState($Object, $GUI_SHOW)

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

    EndFunc ;==>_Acro_UDF_reset

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

    Func CLOSEClicked()
    Terminate()
    EndFunc ;==>CLOSEClicked

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

    Func Terminate()
    Exit 0
    EndFunc ;==>Terminate

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

    ;----------------------------
    Func _Acro_UDF_initialization()
    $AcrobatObj = ObjCreate("AcroPDF.PDF.1")
    $AcrobatObj.src = $_Acro_UDF_firstLoad_File
    Return $AcrobatObj
    EndFunc ;==>_Acro_UDF_initialization

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

    Func _Acro_UDF_CreateCtrl($AcrobatObj, $width = 100, $height = 100, $left = 0, $top = 0)
    $AcrobatObj_ctrl = GUICtrlCreateObj($AcrobatObj, $left, $top, $width, $height)
    GUICtrlSetState($AcrobatObj_ctrl, $GUI_SHOW)
    Return $AcrobatObj_ctrl
    EndFunc ;==>_Acro_UDF_CreateCtrl

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

    sollte ja eigentlich ein arrayDisplay kommen, wo mir -> 200, 200, 10, 10 <- oder 200, 200, 210, 210 anzeigt ... oder ?

    macht es aber nicht .. wird kein array definiert .. :cursing: