Unterschiedliche Minimal-/Maximal-Festlegungen für unterschiedliche Fenster

  • Hallo,

    durch Eure Hilfe bin ich um einiges weitergekommen! Danke dafür.

    Um meine neue Frage zu veranschaulichen, erst einmal das Ausgangs-Script:

    Spoiler anzeigen
    [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")
    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")
    GUISetState(@SW_SHOW, $GUI1)

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

    $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)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func _GUI_EVENT_CLOSE()
    Exit
    EndFunc

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

    Func MY_WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    $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
    EndFunc

    [/autoit]

    Mit der Funktion MY_WM_GETMAXINFO() setze ich dank einer Lösung von Xenobiologist die minimale und die maximale Höhe und Breite eines Fensters beim Ziehen (7, 8, 9, 10), sowie die maximale Breite und Höhe sowie die Position des Fensters beim Maximieren (3, 4, 5, 6).

    Soweit, so gut - diese Funktion gilt für alle erstellten GUI's.

    Jetzt will ich erreichen, dass für das zweite Fenster $GUI2 andere MinMax-Einstellungen gelten, als für die erste $GUI1.

    Doch egal, was ich anstelle - sobald das zweite Fenster auftaucht, werden die gewünschten Einstellungen für das erste Fenster überschrieben.

    Ich habe bereits versucht, zwei unterschiedliche Funktionen, GUI1_WM_MESSAGE() und GUI2_WM_MESSAGE() mit jeweils unterschiedlichen Variablen zu etablieren,

    Ich habe bereits IF- und CASE- Bedingungen festgelegt - die nur für ein Fenster gelten.

    Es ist und bleibt immer das selbe - sobald die GUIRegisterMsg($WM_GETMINMAXINFO, ...) - Funktion genutzt wird, verliert eines der Fenster seine Einstellungen, und übernimmt die Einstellungen des zweiten Fensters.

    Ich möchte jetzt also, dass jedes Fenster unterschiedliche Einstellungen hat, und zwar

    a) jeweils für minimale und maximale Breite und Höhe beim Ziehen,
    b) jeweils für Position und maximale Breite beim Maximieren-Button.

    Ist das überhaupt möglich?

    Ich Dank Euch bereits jetzt für jeden Hinweis.

    Einmal editiert, zuletzt von Argonaut (13. Oktober 2007 um 12:32)

    • Offizieller Beitrag

    HI,

    Spoiler anzeigen
    [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")
    GUIRegisterMsg($WM_GETMINMAXINFO, "MY_WM_GETMINMAXINFO")
    GUISetState(@SW_SHOW, $GUI1)

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

    $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)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func _GUI_EVENT_CLOSE()
    Exit
    EndFunc ;==>_GUI_EVENT_CLOSE

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

    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

    [/autoit]

    So long,

    Mega

  • Danke @ Xenobiologist,

    easy... 8)

    Vielleicht kennt auch noch jemand den Grund für dieses Fensterverhalten:

    Im vorstehenden Beispiel definiere ich zwei GUI's mit jeweils einer Breite von 200.

    Dank Xenobiologists Lösung kann ich beiden Fenstern eine Minimalbreite und eine Maximalbreite von jeweils 200 zuweisen.

    Klicke ich jetzt auf den Maximieren-Button eines der Fenster, dann wird das mit einer Breite von 200 bereits definierte Fenster jedoch noch mal ein paar Pixel schmaler. Nach meinem Verständnis sollte es jedoch genau so breit bleiben, wie ich es festgelegt habe.

    Was stimmt da nicht?