Frage zu Gui

    • Offizieller Beitrag

    Hallo.

    Hab da wieder mal ein Problem, ich hoffe jemand weiß eine Antwort . Gibt es einen Befehl mit dem ich auslesen kann, welche Controls zu einer Gui gehören ? Oder gibt es einen Befehl damit sich alle Controls die zu einer Bestimmten Gui gehören auf HIDE setzen .

  • Hi

    Um die WinGetClassList - Liste verwenden zu können, muß man diese noch durchnumerieren.
    (Wenn man 2 Button hat, dann soll der erste Button1 und der zweite Button2 heißen...usw...)
    Dazu gibt es eine gute Funktion von ProgAndy, hab ich aber grad nicht gefunden und deshalb was eigenes geschrieben:

    [autoit]

    $hPid=Run("Sndrec32.exe")
    WinWait("[CLASS:SoundRec]", "", 5)
    If @error Then Exit
    $hWnd=WinGetHandle("[CLASS:SoundRec]")
    $sCList=WinGetClassList($hWnd)
    $aCtrl=_EnumCtrl($sCList)

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

    For $i=1 To $aCtrl[0]
    ControlHide($hWnd,"",$aCtrl[$i])
    Next

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

    Func _EnumCtrl($sList)
    Local $aList=StringSplit($sList,@CRLF)
    Local $iCnt, $aRet[1]=[0]
    For $i=1 To $aList[0]
    $iCnt=1
    If $aList[$i]="" Then ContinueLoop
    $aRet[0]+=1
    ReDim $aRet[$aRet[0]+1]
    $aRet[$aRet[0]]=$aList[$i] & $iCnt
    For $j=$i+1 To $aList[0]
    If $aList[$i]<>$aList[$j] Then
    ContinueLoop
    Else
    $iCnt+=1
    $aRet[0]+=1
    ReDim $aRet[$aRet[0]+1]
    $aRet[$aRet[0]]=$aList[$i]&$iCnt
    $aList[$j]=""
    EndIf
    Next
    $aList[$i]=""
    Next
    Return $aRet
    EndFunc

    [/autoit]


    lgE

    • Offizieller Beitrag

    Danke schon mal für eure Antworten. Ist aber nicht das was ich suche . Versuche das nochmal genauer zu erklären .
    Ich habe ein Prog mit mehreren GUIS . Ich will nun mit einem Befehl auslesen welche Controls zu den einzelnen Guis gehören. Der Hintergrund ist der, das Vista mit seiner AERO Oberfläche beim resizen und bei Effektspielereine rumzickt. Ich will bevor ich eine Gui verschiebe alle darin enthaltenen Controls verstecken damit die nicht rumflackern .

    • Offizieller Beitrag

    Ja, aber mit der Funktion bekommst Du doch alle Controls der GUI geliefert.

    eukalyptus: mit einem "Scripting.Dictionary"-Objekt wird es kürzer und ohne ReDim:

    [autoit]


    #include<Array.au3>
    Run('calc.exe')
    WinWait('Rechner', '')
    $aList = StringSplit(StringTrimRight(WinGetClassList('Rechner', ''), 1), @LF)
    _ArraySort($aList)
    $oDictTable = ObjCreate('Scripting.Dictionary')
    $oDictTable.CompareMode = 1
    $j = 1
    For $i = 1 To $aList[0]
    If Not $oDictTable.Exists($aList[$i]) Then
    $oDictTable.Add($aList[$i], $aList[$i])
    $j = 1
    Else
    If $j = 1 Then $aList[$i-1] &= $j
    $j += 1
    $aList[$i] &= $j
    EndIf
    Next
    _ArrayDisplay($aList)

    [/autoit]

    Edit: Da musste noch ein _ArraySort rein.

    • Offizieller Beitrag

    Versuch mal den Classnamen von Deiner GUI rauszukriegen, dann kannst Du das auch so lösen:

    Spoiler anzeigen
    [autoit]


    #include<Array.au3>
    Run('calc.exe')
    If Not WinWait('[CLASS:SciCalc]', '', 5) Then Exit MsgBox(0, 0, 'error') ; Nach "CLASS:" muss der Name Deiner GUI stehen
    $hwnd = WinGetHandle('[CLASS:SciCalc]', '')
    $aList = StringSplit(StringTrimRight(WinGetClassList($hwnd), 1), @LF)
    _ArraySort($aList)
    $oDictTable = ObjCreate('Scripting.Dictionary')
    $oDictTable.CompareMode = 1
    $j = 1
    For $i = 1 To $aList[0]
    If Not $oDictTable.Exists($aList[$i]) Then
    $oDictTable.Add($aList[$i], $aList[$i])
    $j = 1
    $aList[$i] &= $j
    Else
    $j += 1
    $aList[$i] &= $j
    EndIf
    Next
    ;~ _ArrayDisplay($aList)
    MsgBox(0, 0, 'Nach klick auf "ok" verschwinden die GUI-Elemente')
    For $i = 1 To $aList[0]
    ControlHide($hwnd, '', $aList[$i])
    Next

    [/autoit]
  • Danke schon mal für eure Antworten. Ist aber nicht das was ich suche . Versuche das nochmal genauer zu erklären .
    Ich habe ein Prog mit mehreren GUIS . Ich will nun mit einem Befehl auslesen welche Controls zu den einzelnen Guis gehören. Der Hintergrund ist der, das Vista mit seiner AERO Oberfläche beim resizen und bei Effektspielereine rumzickt. Ich will bevor ich eine Gui verschiebe alle darin enthaltenen Controls verstecken damit die nicht rumflackern .


    Wenn du die GUIs mit AutoIt erstellst:
    Das einfachste wäre warscheinlich, eine GUI als ChildGUI innerhalb deiner Haupt-GUI zu erstellen. Die kannst du dann verstecken und wieder anzeigen ;)
    $GUI = GUICreate(...)
    $ChildGUI = GUICreate(...,$WS_CHILD,0,$GUI)
    GUICtrlCreate(...)
    GUISetstate(@SW_HIDE,$ChildGUI)
    GUISetstate(@SW_SHOW,$ChildGUI)

    • Offizieller Beitrag

    Also habe mal ein Beispielscript.

    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form2 = GUICreate("Beispiel-GUI", 633, 447, 400, 400)
    $Input2 = GUICtrlCreateInput("Input1", 120, 32, 385, 21)
    $Buttonx = GUICtrlCreateButton("Bla", 16, 24, 73, 33, 0)
    $Buttony = GUICtrlCreateButton("Blub ", 16, 64, 73, 33, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Buttonz = GUICtrlCreateButton("BlaBla ", 16, 104, 73, 33, 0)
    $List1 = GUICtrlCreateList("", 528, 40, 81, 71)
    $Progress1 = GUICtrlCreateProgress(64, 320, 521, 49)
    $TreeView1 = GUICtrlCreateTreeView(24, 168, 73, 129)
    ;WinSetTrans($Form2, "", 200)
    GUISetState(@SW_Show)

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

    while 1
    $msg = GUIGetMsg()

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

    Select
    Case $msg = $GUI_EVENT_CLOSE ;Schließenbutton abfrage
    exit
    Case $msg = $Buttonx
    test()
    EndSelect
    wend

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

    Func Test()
    $aList = StringSplit(StringTrimRight(WinGetClassList('Beispiel-GUI', ''), 1), @LF)
    _ArraySort($aList)
    $oDictTable = ObjCreate('Scripting.Dictionary')
    $oDictTable.CompareMode = 1
    $j = 1
    For $i = 1 To $aList[0]
    If Not $oDictTable.Exists($aList[$i]) Then
    $oDictTable.Add($aList[$i], $aList[$i])
    $j = 1
    Else
    If $j = 1 Then $aList[$i-1] &= $j
    $j += 1
    $aList[$i] &= $j
    EndIf
    Next
    _ArrayDisplay($aList)
    For $i = 1 To $aList[0]
    ControlHide('Beispiel-GUI', '', $aList[$i])
    Next
    EndFunc

    [/autoit]


    Wenn man auf Button Bla Drückt bekommt man den Array angezeigt. Wenn ArrayDsiplay geschlossen wird dann werden nur die Buttons gehidet und micht die anderen Objekte.
    Oscar dein letzte Script werde ich mir morgen zu gemüte führen, mir qualmt so langsam der Schädel . Bin nicht mehr so wirklich Aufnahmefähig.
    @progandy das weiß ich ,aber wenn ich die Guis rein- und rausscrollen will dann hat sich das mit Hide und Show erledigt. Will eigentlich nur die Controls ausblenden damit sie nicht so dumm rumflackern wenn sich des Fenster bewegt. Ich kann nur sagen , scheiß AERO unter XP hab ich den Streß net.
    Danke euch allen aber für eure Mühe :thumbup:

    • Offizieller Beitrag

    Achso, das ist für eine eigene GUI!

    Bei dem ersten Beispiel von mir war noch ein Fehler drin: Alle GUI-Elemente müssen zu dem Classnamen noch eine Zahl bekommen, auch wenn es nur ein einziges davon gibt.

    So geht es jetzt mit Deinem Beispiel-Script:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form2 = GUICreate("Beispiel-GUI", 633, 447, 400, 400)
    $Input2 = GUICtrlCreateInput("Input1", 120, 32, 385, 21)
    $Buttonx = GUICtrlCreateButton("Bla", 16, 24, 73, 33, 0)
    $Buttony = GUICtrlCreateButton("Blub ", 16, 64, 73, 33, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Buttonz = GUICtrlCreateButton("BlaBla ", 16, 104, 73, 33, 0)
    $List1 = GUICtrlCreateList("", 528, 40, 81, 71)
    $Progress1 = GUICtrlCreateProgress(64, 320, 521, 49)
    $TreeView1 = GUICtrlCreateTreeView(24, 168, 73, 129)
    ;WinSetTrans($Form2, "", 200)
    GUISetState(@SW_SHOW)

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

    While 1
    $msg = GUIGetMsg()

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

    Select
    Case $msg = $GUI_EVENT_CLOSE ;Schließenbutton abfrage
    Exit
    Case $msg = $Buttonx
    Test()
    EndSelect
    WEnd

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

    Func Test()
    $aList = StringSplit(StringTrimRight(WinGetClassList($Form2), 1), @LF)
    _ArraySort($aList)
    $oDictTable = ObjCreate('Scripting.Dictionary')
    $oDictTable.CompareMode = 1
    $j = 1
    For $i = 1 To $aList[0]
    If Not $oDictTable.Exists($aList[$i]) Then
    $oDictTable.Add($aList[$i], '')
    $j = 1
    $aList[$i] &= $j
    Else
    $j += 1
    $aList[$i] &= $j
    EndIf
    Next
    ;~ _ArrayDisplay($aList)
    MsgBox(0, 0, 'Nach klick auf "ok" verschwinden die GUI-Elemente')
    For $i = 1 To $aList[0]
    ControlHide($Form2, '', $aList[$i])
    Next
    EndFunc ;==>Test

    [/autoit]
    • Offizieller Beitrag

    Habe schon deine vorletztes Post in mein Beispielscript integriert.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form2 = GUICreate("Beispiel-GUI", 633, 447, 400, 400)
    $Input2 = GUICtrlCreateInput("Input1", 120, 32, 385, 21)
    $Buttonx = GUICtrlCreateButton("Bla", 16, 24, 73, 33, 0)
    $Buttony = GUICtrlCreateButton("Blub ", 16, 64, 73, 33, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $Buttonz = GUICtrlCreateButton("BlaBla ", 16, 104, 73, 33, 0)
    $List1 = GUICtrlCreateList("", 528, 40, 81, 71)
    $Progress1 = GUICtrlCreateProgress(64, 320, 521, 49)
    $TreeView1 = GUICtrlCreateTreeView(24, 168, 73, 129)
    ;WinSetTrans($Form2, "", 200)
    GUISetState(@SW_Show)

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

    while 1
    $msg = GUIGetMsg()

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

    Select
    Case $msg = $GUI_EVENT_CLOSE ;Schließenbutton abfrage
    exit
    Case $msg = $Buttonx
    test()
    EndSelect
    wend

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

    Func Test()
    $hwnd = WinGetHandle('[CLASS:Beispiel-GUI]', '')
    $aList = StringSplit(StringTrimRight(WinGetClassList($hwnd), 1), @LF)
    _ArraySort($aList)
    $oDictTable = ObjCreate('Scripting.Dictionary')
    $oDictTable.CompareMode = 1
    $j = 1
    For $i = 1 To $aList[0]
    If Not $oDictTable.Exists($aList[$i]) Then
    $oDictTable.Add($aList[$i], $aList[$i])
    $j = 1
    $aList[$i] &= $j
    Else
    $j += 1
    $aList[$i] &= $j
    EndIf
    Next
    ;~ _ArrayDisplay($aList)
    MsgBox(0, 0, 'Nach klick auf "ok" verschwinden die GUI-Elemente')
    For $i = 1 To $aList[0]
    ControlHide($hwnd, '', $aList[$i])
    Next
    sleep(2000)
    For $i = 1 To $aList[0]
    ControlShow($hwnd, '', $aList[$i])
    Next

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

    EndFunc

    [/autoit]


    Funzt so wie ich es mir gedacht habe .Ebenso wie das Script aus deiner letzten Post . :thumbup::thumbup:
    Ich danke dir vielmals Oscar und allen andern auch . :thumbup:

    EDIT:Bei meinem nächsten Hilfegesuch werde ich mich versuchen besser auszudrücken. Muß mir mal angewöhnen statt mein Prog mein Script zu schreiben .Dann weiß man eher bescheid. :whistling: