Bei GUI_EVENT_MAXIMIZE in $GUI1 soll $GUI2 das gleiche machen.

  • Hallo,

    ich danke allen, die mir bisher geholfen haben (i. d. R. peethebee, Xenobiologist, Carsten, daksideofsanta, gtaspider, oliverh, BugFix, AspirinJunkie, Alina <- das bau ich als "Credits" ein!). Wenn ich irgendwie dieses Forum unterstützen kann, sagt mir bitte wie. Ohne Eure Hilfe wäre ich mit AutoIt nicht so weit, wie ich es bin! (Ernsthaft, kein Geschleime!)

    Es gibt jedoch noch die ein oder andere Verständnisfrage zur Logik. Zu meiner nächsten Frage erst einmal das Ausgangsscript:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>

    Opt("GUIOnEventMode", 1)

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

    $GUI2 = GUICreate("GUI2", 200, 200, 300, 0, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_EVENT_CLOSE")
    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")
    GUISetState(@SW_SHOW, $GUI2)

    While 1
    Sleep(1000)
    WEnd

    Func _GUI_EVENT_CLOSE()
    Exit
    EndFunc ;==>_GUI_EVENT_CLOSE

    Func MY_WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    If $hWnd = $GUI1 Then
    $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 3, 300) ; width
    DllStructSetData($minmaxinfo, 4, @DesktopHeight) ; height
    DllStructSetData($minmaxinfo, 5, 0) ; left
    DllStructSetData($minmaxinfo, 6, 0) ; top
    DllStructSetData($minmaxinfo, 7, 200) ; min X
    DllStructSetData($minmaxinfo, 8, 200) ; min Y
    DllStructSetData($minmaxinfo, 9, 200) ; max X
    DllStructSetData($minmaxinfo, 10, @DesktopHeight) ; max Y
    Return 0
    Else
    $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 3, 500) ; width
    DllStructSetData($minmaxinfo, 4, @DesktopHeight) ; height
    DllStructSetData($minmaxinfo, 5, 0) ; left
    DllStructSetData($minmaxinfo, 6, 0) ; top
    DllStructSetData($minmaxinfo, 7, 100) ; min X
    DllStructSetData($minmaxinfo, 8, 100) ; min Y
    DllStructSetData($minmaxinfo, 9, 200) ; max X
    DllStructSetData($minmaxinfo, 10, 400) ; max Y
    Return 0
    EndIf
    EndFunc ;==>MY_WM_GETMINMAXINFO (Thx@Xenobiologist)

    [/autoit]

    Die GUI's laufen im OnEvent_Modus - dass ist jedoch mein Problem, weil ich im MessageLoop-Modus mein Problem durch GUIGetMsg() selber lösen könnte. Der OnEvent-Modus ist jedoch aus Gründen der Messgenauigkeit leider notwendig, da die Verzögerung der GUI_EVENT-Abfrage-Schleife im Message-Loop-Modus bei den Messungen stören könnten (siehe dieser Thread).

    Mein Problem: Wenn ich in $GUI1 den Maximize-Button anklicke, sollen $GUI1 und $GUI2 maximiert werden.

    Hierzu füge ich in das Script selbstverständlich eine UD-Funktion ein, und lasse beide GUI's beim Klick auf den Maximize-Button diese Funktion ausführen - es ist gewünscht, dass beide GUI's bei einem Klick auf den jeweiligen MAXIMIZE-Button das gleiche tun

    Spoiler anzeigen
    [autoit]


    ...

    [/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")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "_GUI_EVENT_MAXIMIZE")
    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")
    GUISetState(@SW_SHOW, $GUI1)

    $GUI2 = GUICreate("GUI2", 200, 200, 300, 0, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_EVENT_CLOSE")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "_GUI_EVENT_MAXIMIZE")
    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")
    GUISetState(@SW_SHOW, $GUI2)

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

    ...

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

    Func _GUI_EVENT_MAXIMIZE()

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

    ...

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

    EndFunc;

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

    Jetzt möchte ich erreichen, dass bei einem Klick auf den MAXIMIZE-Button

    a) die GUI maximiert wird, deren Maximize-Button angeklickt wurde, und
    b) die andere GUI ebenfalls maximiert wird.

    Wie stelle ich das an? Irgendwie muss ich dem jeweils anderen Fenster ja onevent eine Nachricht übermitteln - ich kenne leider entweder (noch) nicht die richtige Funktion dafür, oder die richtige Notierung.

    Wieder einmal Thx im Voraus!

    • Offizieller Beitrag

    Das ist im OnEvent-Mode viel einfacher als im GuiGetMsg-Mode.
    Du mußt nur den Ereignissen jeder GUI eigene Funktionen zuordnen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    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_1__EVENT_CLOSE")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "_GUI_1_EVENT_MAXIMIZE")
    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")
    GUISetState(@SW_SHOW, $GUI1)

    $GUI2 = GUICreate("GUI2", 200, 200, 300, 0, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    GUISetOnEvent($GUI_EVENT_CLOSE, "_GUI_2__EVENT_CLOSE")
    GUISetOnEvent($GUI_EVENT_MAXIMIZE, "_GUI_2_EVENT_MAXIMIZE")
    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")
    GUISetState(@SW_SHOW, $GUI2)

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

    While 1
    Sleep(100)
    WEnd

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

    Func _GUI_1__EVENT_CLOSE()
    Exit
    EndFunc

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

    Func _GUI_2__EVENT_CLOSE()
    GUISetState(@SW_HIDE, $GUI2)
    EndFunc

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

    Func _GUI_1_EVENT_MAXIMIZE()
    GUISetState(@SW_MAXIMIZE, $GUI2)
    EndFunc

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

    Func _GUI_2_EVENT_MAXIMIZE()
    GUISetState(@SW_MAXIMIZE, $GUI1)
    EndFunc

    [/autoit]
  • BugFix ,

    okay, es ist wieder einmal so simpel, wie es sich anhört =)

    Um zu zeigen, dass ich es verstanden habe: Wenn im OnEvent-Modus jeder Button eine eigene Funktion zugewiesen bekommt, ist es wesentlich leichter festzulegen, wie sich was verhalten soll ...

    Ich hatte übrigens total außer Acht gelassen, die Funktion GUISetState(...) für meine Zwecke zu nutzen.

    Danke einmal wieder!