Verständnisproblem bei faktischer Breite einer GUI

  • Hallo Leuts,

    ich hatte mein Problem bereits in diesem Post einmal angerissen - gelöst hat es sich jedoch noch immer nicht, obwohl ich bis zum Hals in AutoIt-Doku stecke.

    Und hier das Script zu meinem Problem:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $GUI1 = GUICreate("GUI1", 200, 200, 0, 0, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_EVENT_CLOSE")
    GUISetState(@SW_SHOW, $GUI1)

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

    $WinGetPos = WinGetPos($GUI1)

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

    MsgBox(0, "WinGetPos", "Breite: " & $WinGetPos[2] & @CRLF & _
    "Höhe: " & $WinGetPos[3] & @CRLF & _
    "Position links: " & $WinGetPos[0] & @CRLF & _
    "Position oben: " & $WinGetPos[1])

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

    While 1
    Sleep(1000)
    WEnd

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

    Func _GUI_EVENT_CLOSE()
    Exit
    EndFunc

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

    Ich gebe meiner GUI-Box also eine Breite und eine Höhe von jeweils 200!

    Wenn ich daneben ein gleich großes Fenster aufmachen wollte, gab ich diesem die Koordinaten ...(200,200,200,0). Mir fiel jedoch auf, dass beide Fenster sich überlappten.

    Dann habe ich die Koordinatenabfrage mit WinGetPos() ausprobiert - und siehe da:

    Ein Fenster, dass die Maße 200x200 haben soll, ist tatsächlich 206x206 groß. Egal, welche Maße ich einem Fenster verpasse - die Ausgabe ist stets "+6" - wobei ich jedoch keine Ahnung habe, wo diese 6 herkommt.

    Störend ist besonders, dass Eure Hilfestellung, die ihr mir in diesem Thread zur Einstellung von Minimal- und Maximalbreite einer GUI geleistet habt, diese "6" nicht interessiert. Wenn ich vorher eine GUI mit 200x200 definiert habe, und dann per $WM_GETMINMAXINFO die weitere Verarbeitung mit einer minimal- und maximal- Breite x Höhe von je 200 bestimme, wird die Box jeweils um 6 verkleinert.

    Ich weiß, dass ich bestimmt etwas übersehen habe - aber bitte erklärt mir, wie es zu dieser Differenz zwischen beabsichtigter und tatsächlicher GUI-Größe kommt.

    Wo könnte ich darüber nachlesen? Lässt sich dieses Verhalten nur rechnerisch unter Kontrolle bekommen, oder kann der abweichende Wert von 6 in anderen Fällen sogar noch weiter variieren?

    Danke für Eure Antworten im Voraus

    Einmal editiert, zuletzt von Argonaut (15. Oktober 2007 um 17:28)

    • Offizieller Beitrag

    Hallo!

    Ich nehme mal an, dass du so die "ClientArea" des Fensters bestimmst, d.h. den Bereich, der dir wirklich zur Verfügung steht. Jedes Fenster hat darüberhinaus aber noch Elemente, die zur Breite beitragen, in diesem Fall der Rahmen (für den ausschließlich Windows verantwortlich ist). Daher könnte ich mir die Diskrepanz erklären. Unter verschiedenen Betriebssystemen und verschiedenen Designs wird dieser Wert höchstwahrscheinlich variieren.

    peethebee

  • @ peethebee,

    Danke für die Auskunft. Um eine Fensteranordnung zu erhalten, wie ich sie mir vorstelle, kann ich mir ja mit den Rückgabewerten von WinGetPos() arbeiten, dass macht mir das leben ein wenig leichter.

    Trotzdem: Wenn jemand weiß, wo ich mehr darüber erfahren kann, nur her mit dieser Info. Trotz fuffzichfacher Google-Suche mit hundertelfundzwanzig Stichwörtern komme ich zu keinem (befriedigenden) Ergebnis ;(

    Und daraus folgt auch: Gibt's in AutoIt eine Möglichkeit, diese Windows-Elemente, die eine GUI mitliefert, irgendwie zu beeinflussen?

    Das fände ich ja nun sehr interessant, und ich habe mich auch bereits in den AutoLib3-Dingen ein wenig informiert - aber 's ist (nach 14 Tagen AutoIt) schon noch 'ne komplexe Sache für mich.

  • @ peethebee,

    zum Thema Client-Area - die ist ja noch einmal kleiner als die Größe der definierten GUI:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    include <GUIConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $GUI1 = GUICreate("GUI1", 200, 200, 0, 0, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_EVENT_CLOSE")
    GUISetState(@SW_SHOW, $GUI1)

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

    $WinGetPos = WinGetPos($GUI1)

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

    MsgBox(0, "WinGetPos", "Breite: " & $WinGetPos[2] & @CRLF & _
    "Höhe: " & $WinGetPos[3] & @CRLF & _
    "Position links: " & $WinGetPos[0] & @CRLF & _
    "Position oben: " & $WinGetPos[1])

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

    $WinGetClientSize = WinGetClientSize($GUI1)
    MsgBox(0, "WinGetClientSize", "Breite: " & $WinGetClientSize[0] & @CRLF & _
    "Höhe: " & $WinGetClientSize[1])

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

    $GUI2 = GUICreate("GUI2", 200, 200, $WinGetPos[2], 0, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_EVENT_CLOSE")
    GUISetState(@SW_SHOW, $GUI2)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func _GUI_EVENT_CLOSE()
    Exit
    EndFunc

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

    Mit welcher Funktion definiere ich in AutoIt die Maße der Client-Area? Oder macht sich das alles automatisch in den 'GUIConstants.au3'?

    • Offizieller Beitrag

    Hi,

    ich denke, die Zahl wird weiter variieren, weil sie von OS und Style abhängt.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

    Opt("GUIOnEventMode", 1)

    $GUI1 = GUICreate("GUI1", 200, 200, 0, 0, $WS_POPUP)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_EVENT_CLOSE")
    GUISetState(@SW_SHOW, $GUI1)

    $WinGetPos = WinGetPos($GUI1)

    MsgBox(0, "WinGetPos", "Breite: " & $WinGetPos[2] & @CRLF & _
    "Höhe: " & $WinGetPos[3] & @CRLF & _
    "Position links: " & $WinGetPos[0] & @CRLF & _
    "Position oben: " & $WinGetPos[1])

    While 1
    Sleep(1000)
    WEnd

    Func _GUI_EVENT_CLOSE()
    Exit
    EndFunc

    [/autoit]

    So long,

    Mega