GUI zerschießt sich beim Minimieren

  • Hallo zusammen!

    Ich habe folgendes Problem: Wenn ich mein Programm/Script starte, sieht das GUI wie folgt aus:

    Wenn ich dann auf "Minimieren" klicke, kommt nach dem Maximieren das GUI nur noch so an:

    Das GUI erstelle ich mit folgender Zeile:

    Code
    Const $hMainGUI = GUICreate( "", 600, 400, 0, 0, BitOR($WS_CHILD, $WS_VISIBLE), Default, $hGUI)

    (Das GUI ist ein GUI in einem GUI, da ich mehrere GUIs über mein Menü aufrufe. Ich bin so langsam fertig mit dem Programm/Script und möchte es natürlich sauber übergeben können :)

    Weiß jemand vlt. woran das liegen könnte? Und gibt es da Möglichkeiten, das zu verhindern?

    Achja, die GUI-Elemente werden alle mit einer XY-Koordinate angegeben, also scheint sich das komplette GUI zu verschieben und die XY-Koordinaten dann an der neuen Position zu orientieren, aber kA warum!

    VG

  • Ohne Code, keine hilfe möglich.

    Auch in diesem Beispiel tritt der Fehler auf. Scheint wohl was mit dem Aufbau der Unterfenster zutun zu haben.

  • In Deinem letzten Beitrag Tab-Menü über Schleife erstellen lassen hast Du

    Code
    Const $hRAWExportGUI = GUICreate( "", 600, 400, 0, 0, BitOR( $WS_POPUP, $WS_VISIBLE ), $WS_EX_MDICHILD, $hGUI)

    als Lösung vorgestellt. Benutzt Du das so in Deinem 'echten' Skript?

    ja, warum? Es funktioniert so, wie ich es mir vorgestellt hatte, bzw. die neuen Felder werden auf das GUI geschrieben, nicht drunter. Mit der richtigen Positionierung hab ich die Felder auf den weißen Bereich verschoben. Ist das falsch?

    Einmal editiert, zuletzt von JBO (11. Januar 2022 um 11:32)

  • Hier gibt es mit Deinem Testskript keine 'Verschiebungen', wenn man die Definition der 'Kindfenster' auf BitOR( $WS_POPUP, $WS_VISIBLE ), $WS_EX_MDICHILD umstellt. Ich vermute deshalb, dass in Deinem 'Echtskript' etwas anders läuft.

    Ohne Code, keine hilfe möglich.

  • Hier gibt es mit Deinem Testskript keine 'Verschiebungen', wenn man die Definition der 'Kindfenster' auf BitOR( $WS_POPUP, $WS_VISIBLE ), $WS_EX_MDICHILD umstellt. Ich vermute deshalb, dass in Deinem 'Echtskript' etwas anders läuft.

    Ich hab das jetzt mal an dem geposteten Beispiel ausprobiert. Das Minimize und Restore funktioniert dabei wunderbar, nur leider funktioniert das GUI nicht mehr, also die Buttons bleiben ohne Funktion. Ach, und bei "POPUP" ist das Fenster auch nicht mehr in dem Ursprünglichen Rahmen, so wie es eigentlich sein sollte.

  • Auch in diesem Beispiel tritt der Fehler auf. Scheint wohl was mit dem Aufbau der Unterfenster zutun zu haben.

    so, ich bin das Problem mit dem fehlerhaft dargestellten GUI nach Wiederherstellung jetzt umgangen:

    Code
    Const $hGUI = GUICreate( $sTitle, 600, 432, Default, Default, $WS_SIZEBOX, BitOR($WS_EX_COMPOSITED,$GUI_WS_EX_PARENTDRAG) )
       $Style = _WinAPI_GetWindowLong( $hWinGUI, $GWL_STYLE )
       If BitXOR( $Style, $WS_SIZEBOX ) <> BitOr( $Style, BitXOR( $Style, $WS_SIZEBOX ) ) Then _WinAPI_SetWindowLong( $hGUI,$GWL_STYLE,BitXOR( $Style, $WS_SIZEBOX ) )

    Das GUI wird als "Sizebox" angezeigt (Minimieren und Maximieren werden nicht mehr angezeigt, man kann nur noch mit Alt+Tab aus dem Programm raus gehen) und die "Resize-Funktion" ist deaktiviert.

    2 Mal editiert, zuletzt von JBO (11. Januar 2022 um 12:50)

  • so, ich bin das Problem mit dem fehlerhaft dargestellten GUI nach Wiederherstellung jetzt umgangen:

    Bemerkenswert! :Glaskugel:

    Mal der Reihe nach:

    1. Wir erstellen ein Fenster mit dem Stil $WS_SIZEBOX: 0x00040000. Damit ist sichergestellt, dass dieses Stilbit gesetzt ist, was immer auch sonst noch verwendet wird.
    2. Jetzt lesen wir die Stilbits aus. Das ergibt hier bei mir: 0x04CC0000
    3. Jetzt 'verxodern' wir die ausgelesenen Stilbits (0x04CC0000) mit $WS_SIZEBOX (0x00040000). Das ergibt hier: 0x04C80000
    4. Nun noch die ausgelesenen Stilbits (0x04CC0000) mit dem, was wir schon in 3. errechnet haben (0x04C80000), 'verodern'. Dabei kann nur der ursprünglich Wert der Stilbits entstehen (0x04CC0000).
    5. Die Werte aus 3. und 4. werden jetzt verglichen. Das Ergebnis ist immer 'ungleich'.
    6. Deshalb wird das Stilbit $WS_SIZEBOX per XOR aus entfernt: 0x04C80000. Diese neue Wert wird nun für das Fenster gesetzt.

    Auch wenn das Dein Problem umgeht. eine Lösung ist das meiner Meinung nach nicht.

    Übrigens: Bei meinem Test haben die Buttons und Menüeinträge im Testskript klaglos funktioniert.

  • Bemerkenswert! :Glaskugel:

    Mal der Reihe nach:

    1. Wir erstellen ein Fenster mit dem Stil $WS_SIZEBOX: 0x00040000. Damit ist sichergestellt, dass dieses Stilbit gesetzt ist, was immer auch sonst noch verwendet wird.
    2. Jetzt lesen wir die Stilbits aus. Das ergibt hier bei mir: 0x04CC0000
    3. Jetzt 'verxodern' wir die ausgelesenen Stilbits (0x04CC0000) mit $WS_SIZEBOX (0x00040000). Das ergibt hier: 0x04C80000
    4. Nun noch die ausgelesenen Stilbits (0x04CC0000) mit dem, was wir schon in 3. errechnet haben (0x04C80000), 'verodern'. Dabei kann nur der ursprünglich Wert der Stilbits entstehen (0x04CC0000).
    5. Die Werte aus 3. und 4. werden jetzt verglichen. Das Ergebnis ist immer 'ungleich'.
    6. Deshalb wird das Stilbit $WS_SIZEBOX per XOR aus entfernt: 0x04C80000. Diese neue Wert wird nun für das Fenster gesetzt.

    Auch wenn das Dein Problem umgeht. eine Lösung ist das meiner Meinung nach nicht.

    Übrigens: Bei meinem Test haben die Buttons und Menüeinträge im Testskript klaglos funktioniert.

    Danke, dass du das so ausführlich erklärt hast, leider fehlt mir da das Hintergrundwissen, um es nachvollziehen zu können :( Ich hab die "Lösung" im Internet gefunden und ausprobiert. Da es funktioniert hat, hab ich mich dann für diesen Weg entschieden und es in mein Script eingebaut.

    Zu "Übrigens": bei mir leider nicht. Ich benutze den mitgelieferten Editor von AutoIt, aber das dürfte ja wohl keinen Unterschied machen!?

  • Hallo,

    wenn es darum geht, ein Fenster ohne Minimize/Maximize-Icons zu erstellen, geht das auch so:

    Code
       Local $g_hGUI = GUICreate("GUI", 300, 217, 100, 100, BitAnd($GUI_SS_DEFAULT_GUI, BitNOT($WS_MINIMIZEBOX)))

    Und wenn man die Stilbits des Fensters auslesen oder verändern will, gibt es dafür die Funktionen GUIGetStyle() bzw. GUISetStale().

    Zum Thema "Übrigens": Was funktioniert an diesem Beispiel nicht korrekt?

    Ich benutze auch diesen Editor.

  • Zum Thema "Übrigens": Was funktioniert an diesem Beispiel nicht korrekt?

    Also bei mir hat dein Beispiel jetzt auch funktioniert. Mein GUI zerlegt sich, sobald ich das Fenster bewege. Ich probier mal deine Methode aus, um Minimieren und Maximieren auszublenden, vlt. hat es ja was mit meiner Methode zu tun!?

  • ... OK, habs ausprobiert, scheint von der Wirkung her keinen großen (sichtbaren) Unterschied zu machen, ist aber bestimmt die elegantere Lösung ;)

    Allerdings bleibt das Problem, dass sich das GUI beim verschieben des Fensters zerschießt und auch so bleibt, auch wenn ich ein anderes GUI aufrufe (Untermenü). Sowohl das UnterGUI, als auc das HauptGUI sind weg. Aber das ist jetzt nicht soooo furchbar wichtig, dann darf der Anwender das GUI eben nicht verschieben :D

  • Also, ich habe das Beispiel von Velted mal probiert und bei mir zerschießt sich die GUI nicht.

    Dann probier mal bitte meins:

  • Hier gibt es mit Deinem Testskript keine 'Verschiebungen', wenn man die Definition der 'Kindfenster' auf BitOR( $WS_POPUP, $WS_VISIBLE ), $WS_EX_MDICHILD umstellt. Ich vermute deshalb, dass in Deinem 'Echtskript' etwas anders läuft.

    Code
       ;GUI1
       Local $g_hGUI1 = GUICreate("GUI 1", 200, 200, 0, 0, BitOR( $WS_POPUP, $WS_VISIBLE ), $WS_EX_MDICHILD , $g_hGUI)
       ...
    
       ;GUI2
       $g_hGUI2 = GUICreate("GUI 2", 200, 200, 10, 10, BitOR($WS_CHILD, $WS_VISIBLE), -1, $g_hGUI)
       ...


    Dann probier mal bitte meins:

    Code
       ;GUI1
       $g_hGUI1 = GUICreate("GUI 1", 200, 200, 10, 10, BitOR($WS_CHILD, $WS_VISIBLE), -1, $g_hGUI)
       ...
    
       ;GUI2
       $g_hGUI2 = GUICreate("GUI 2", 200, 200, 10, 10, BitOR($WS_CHILD, $WS_VISIBLE), -1, $g_hGUI)
       ...

    Das das nicht funktioniert, ist schon seit ein paar Tagen klar.

  • Allerdings bleibt das Problem, dass sich das GUI beim verschieben des Fensters zerschießt und auch so bleibt, auch wenn ich ein anderes GUI aufrufe (Untermenü).

    Naja, der Ex-Style deiner Child-Windows ist falsch.

    So klappt es:

    (Vermeide Globale Variablen, wenn sie nicht zwingend erforderlich sind)

  • JBO 17. Januar 2022 um 13:17

    Hat das Label [ gelöst ] hinzugefügt.