Container für Controls

  • Thread zu meiner Frage in der Shoutbox:

    Zitat

    Gibt es in AutoIt3 einen Container für Controls (außer Child-GUI)? Also quasi ein Ober-Control, in das man andere Controls setzt, und wenn man das Ober-Ctrl verschiebt, verschieben sich die Unter-Ctrls mit.

    In meinem CallTipViewer laufen (für mich) recht komplizierte Sachen ab, um den CallTip selbst und darin wiederum die enthaltenen Controls zu platzieren. Nun sollen die Haupt-Labels verschoben werden, in einer Art horizontalem Scrollen.

    Einfacher gesagt, im CallTipWin gibts Labels, die die Syntax und die Desription anzeigen. Der CallTip wird an die Breite der Labels angepasst. Wenn nun die Labels so breit sind, dass sie nicht mehr auf den Bildschirm passen, wird der CallTip "zurückgepfiffen", also max. auf die Bildschirmbreite gesetzt. Damit man die langen Texte der Labels lesen kann, sollen sie per Buttons gescrollt werden können (horizontal).

    Das Anzeigen des CallTips benötigt präzise Berechnungen und komplizierte Abfragen für verschiedene Umstände. Ich will nicht zu detailiert auf alle Einzelheiten eingehen, aber das Ganze ist recht fragil. Hier ein Offset zuviel, da ein Margin zu wenig, und das Ding hängt schief, oder wird nicht angezeigt.

    Da bis hierhin alles sehr gut läuft und richtig stabil ist, will ich das bisher Erreichte nicht gefährden. Deshalb soll das oben genannte horizontale Scrollen mithilfe eines Containers durchgeführt werden. Zum Scrollen würde nur der Container verschoben und alle bisherigen Funktionen, Positionierungen und Berechnungen bleiben wie sie sind.

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • BugFix In der Shoutbox hast du schon geschrieben, dass es in AutoIt kein solches Container-Control gibt. Das ist zwar schade, aber so habe ich schonmal Gewissheit darüber. Vielen Dank dafür! :)

    Meine Bedenken davor, ein Child-GUI einzusetzen, rühren daher, weil es damit am Anfang viele Probleme gab, dass das CallTipWin nie den Fokus erhalten darf ($WS_EX_NOACTIVATE). Das mit dem Child-Win scheint mir aber die einzige verbleibende Möglichkeit zu sein. => Neue Test folgen. :saint:

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Im Haupt-Fenster befinden sich nun 4 Labels mit Pfeil-Symbolen (Arrow-Labels) und das ChildGUI. Beim Klicken auf die Left/Right Arrow-Labels wird das ChildGUI nach links oder nach rechts verschoben. Das klappt schon mal soweit, allerdings schiebt sich das ChildGUI in der Z-Order über die Arrow-Labels, mit denen man das ChildGUI verschieben kann.

    Beim Erstellen der Controlls habe ich darauf geachtet, die Arrow-Labels NACH dem ChildGUI zu erstellen. Bei einem normalen Control würde das die Arrow-Labels in der Z-Order vor dem Control positionieren.

    Wie kann ich denn erreichen, dass die Arrow-Labels in der Z-Ordern vor dem ChildGUI bleiben?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Interessant! Es ist immer wieder gut, mit jemandem zu "reden". :)

    Ich hatte schon einige Tipps aus den Foren durchexerziert, darunter auch _WinAPI_SetWindowPos. Nichts hat funktioniert.

    Nach deinem Tipp habe ich realisiert, dass diese Funktion auch auf Child-Wins anwendbar ist. :thumbup: Irgendwie habe ich das vorher nicht erkannt, und habe z. B. beim Erstellen des Child-Wins versucht, einen BottomMost Parameter mitzugeben, oder ich habe alle Arrow-Labels TopMost gesetzt und, und, und. Jetzt habe ich _WinAPI_SetWindowPos auf das ChildWin angewendet und es scheint zu funktionieren.

    Ist mein Aufruf so richtig, oder müssen noch andere Parameter dazu?

    Außer der Z-Order soll nur die X-Position geändert werden, alles andere soll bleiben, wie es ist. Das Haupt-Win und das Child-Win wurden mit $WS_EX_NOACTIVATE erstellt. Muss dann hier noch $SWP_NOACTIVATE, oder $SWP_NOOWNERZORDER dazu?

    AutoIt
    _WinAPI_SetWindowPos($g_hChildGui, $HWND_BOTTOM, $iScrollPosX, 0, Default, Default, $SWP_NOSIZE)

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    Einmal editiert, zuletzt von Professor Bernd (11. April 2020 um 08:39)

    • Offizieller Beitrag

    Da hilft eigentlich nur Ausprobieren. Allein aus der Parameterbeschreibung ergibt sich nicht unbedingt das Verhalten im aktuellen Fall.

    Eventuell solltest du auch den Clientbereich verwerfen.

    AutoIt
    _WinAPI_SetWindowPos($g_hChildGui, $HWND_BOTTOM, $iScrollPosX, 0, Default, Default, BOr($SWP_NOSIZE, $SWP_NOCOPYBITS))

    Wie gesagt, muss man probieren.