Seite 1 von 1

größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 0:06
von DelUser01
eine Denksportaufgabe?

Hallo

ich hänge an einem Problem...
Vorwort:
mit meinem Programm können beliebig viele zusammenhängene Fenster geöffnet werden.
Vor längerer Zeit habe ich Funktionen erstellt welche für jedes neue Fenster die bestmögliche Position errechnet.
Warum auch immer funktioniert das bei den heutigen 4k-Desktops nicht mehr, auf denen (eigentlich) ausreichend Platz für Programmfenster sein sollte.

ALSO suche/benötige ich eine Rechenroutine, welche für das nächste neu zu öffnende Programmfenster den größtmöglichen freien Platz auf dem Desktop herausfindet.
- der größtmögliche freie Platz bezieht sich ausschließlich auf durch Fenster meiner Programme belegen Fläche.
- Desktop-Fläche welche durch Fenster von Fremdprogrammen belegt sind werden ignoriert.
- Desktop-Flächen welche durch meine Programme belegt sind liegen vor.

Vielleicht eigentlich eine logische Denkaufgabe - ich stehe momentan vor einer Wand :banghead:

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 7:14
von AUGE_OHR
willst du meine Tetris Lösung haben ... sollte mal eine Demo zur "automatischen" Lösung werden ... :badgrin:

jetzt im Ernst : das zu "berechnen" könnte ziemlich lange dauern wenn du nicht mehr Einschränkungen machen kannst.
ausgehend von einer Position {0,0} und Grösse {x,y} des neuen Fenster müsste man "in Schritten" prüfen ob es ein anderes Fenster "trifft"

Code: Alles auswählen

      FOR x := 1 TO aDesk[1]-aNewSize[1] STEP nXstep
         FOR y := 1 TO aDesk[2]-aNewSize[2] STEP nYstep
            aNewPos := {x,y}

            FOR i := 1 TO LEN(aFenster)
               aPos[1]  := aFenster[i][xPos ]
               aPos[2]  := aFenster[i][yPos ]
               aSize[1] := aFenster[i][xSize]
               aSize[2] := aFenster[i][ySize]

               IF HitWindow(aNewPos,aNewSize, aPos,aSize)
ein "HitWindow" ist gegeben wenn einer der 4 neuen Ecken in einem anderen Fenster liegt.
wenn nun das neue Fenster grösser ist muss man anders herum prüfen ob das kleine in das grosse passt.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 8:26
von HaPe
Morgen Roland !
ALSO suche/benötige ich eine Rechenroutine, welche für das nächste neu zu öffnende Programmfenster den größtmöglichen freien Platz auf dem Desktop herausfindet.
Hast du einen Fenster-Manager im deinem Programm?
Ich frage deshalb weil ich den Eindruck habe dass man suchen muß; mit einem Fenster-Manager wird beim Öffnen und Schließen der Fenster dies protokolliert und man weiß im Vorfeld wo noch wie viel Platz ist.
Frage: Kann man die Größe der Fenster ändern, ist also ein Sizer vorhanden?

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 8:31
von brandelh
Ich denke es ist viel Einfacher vorher den Platz logisch z.B. für 4 oder 6 oder 9 Fenster zu planen und diese Größen zu berechnen.
Dann musst du nur wissen, ob Platz 4 z.B. belegt ist und den nächsten freien suchen ...
Die Position und Größe legt man mit SetPosAndSize() fest ...

Wenn es unabhängige Programme sind wird es komplexer ...

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 11:00
von DelUser01
  1. Es geht nur um bestimmte verbundene (gekoppelte) Fenster.
  2. Die Position und Größe der vorhandenen Fenster kann abgefragt werden bzw. ist zwischengespeichert.
  3. Die Fenster haben beliebige Größen.
  4. Meist sind es nur 2 bis 5 Fenster.
  5. Es gibt Fenster, da wird die Größe und Position automatisch gespeichert und sollen/müssen auch dort wieder angezeigt werden. Diese Fenster werden aber bei der Berechnung der Position neuer Fenster berücksichtigt.
  6. vorhandene Fenster werden nicht verschoben um das neue Fenster anzuzeigen
    (es gibt eine Funktion welche alle Fenster proportional verschiebt).
Im Grunde geht es "nur" darum, auf dem Desktop die größtmögliche rechteckige Fläche zu finden bei der am wenigsten Fläche der anderen zu berücksichtigenden Fenster überdeckt wird.
Dort wird dann das neue Fenster reingesetzt.
Für das nächste Fenster wird dann wieder gesucht.

Wenn einer einen großen Monitor hat ist das erst einmal die schnellste Lösung.
Ist die Desktopfläche zu klein bzw. geht der freie Platz aus kann man auch nichts machen.

Zum einen geht es darum, dass der User mit einem großen Monitor den höchstmöglichen automatischen Komfort hat. Zum anderen soll der User leichter die Möglichkeit haben zwischen den Fenstern mit der Maus hin und herzuspringen ohne das richtige Fenster auf der Taskleiste suchen zu müssen.

Ich hatte einen Fenster Manager, der funktionierrte aber nur richtig so lange alle Fenster die gleiche Größe hatten.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 11:05
von DelUser01
@Jimmy

ob "Tetris" ein passender Ansatz ist weiß ich nicht.
Es geht ja "nur" um rechteckige Fenster und keines wird verschoben.
Das neue Fenster soll ja entweder irgendwo vollständig reinpassen oder mit minimalsten Überschneidungen drübergelegt werden.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 11:25
von HaPe
Hallo Roland !

Zwei Fragen:
- Sind das Fenster in einer Applikation/EXE oder 1 Fenster je Applikation/EXE welche du platzieren möchtest.
- Du hast geschrieben "... so lange alle Fenster die gleiche Größe hatten." Das heißt die Fenster haben jetzt eine unterschiedliche Größe. Ist dessen Größe veränderbar bzw. hast du auch einen Font-Sizer?
Ein Weg könnte sein den Monitor nicht in Pixel sondern in etwas größere Bereiche (vermutlich wie bei Jimmys Tetris-Lösung) einzuteilen.
Dann in eine Tabelle/Array je Bereich schreiben ob bzw. wer diesen Bereich belegt.
Das wäre analog einer automatischen Lagerplatz-Findung mit Größenangabe oder einer CAM-Lösung zur optimalen Positionierung von Konturen bei einem Blech-Laser um den Platz auf einer großen Tafel optimal auszunutzen.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 11:37
von DelUser01
HaPe hat geschrieben: Sa, 24. Mär 2018 11:25Sind das Fenster in einer Applikation/EXE oder 1 Fenster je Applikation/EXE welche du platzieren möchtest.
Beides.
Es sind eigenständige EXE (XbpCrt) die aber "miteinander reden", und es können XbpDialog-Fenster innerhalb einer dieser EXE sein.
HaPe hat geschrieben: Sa, 24. Mär 2018 11:25Das heißt die Fenster haben jetzt eine unterschiedliche Größe
Ja - je nach Gusto des jeweiligen Users.
HaPe hat geschrieben: Sa, 24. Mär 2018 11:25Ist dessen Größe veränderbar bzw. hast du auch einen Font-Sizer?
Ja - aber beim Öffnen eines neuen Fensters sind die Start-Werte mir ja bekannt.
HaPe hat geschrieben: Sa, 24. Mär 2018 11:25Ein Weg könnte sein den Monitor nicht in Pixel sondern in etwas größere Bereiche (vermutlich wie bei Jimmys Tetris-Lösung) einzuteilen.
Dann in eine Tabelle/Array je Bereich schreiben ob bzw. wer diesen Bereich belegt. Das wäre analog einer automatischen Lagerplatz-Findung.
Meine bisherige Lösung basiert auf dem Ansatz den Desktop in Bereiche aufzuteilen und dort die neuen Fenster zu platzieren.
Ich habe auch Hilfsmittel mit denen mit einem Mausklick die neuen Fenster besser verteilt werden können. Das ist schon ein Klick zu viel für die Anwender...

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 11:48
von DelUser01
Zusatz:

Durch die individuell wählbare Schriftgröße der Fenster gibt es User, da passen gerade zwei Fenster auf einen 4k-Desktop (ein Schriftzeichen ca. 1cm hoch).
Ein anderer arbeitet mit mittelgroßer Schrift und kann locker einige Fenster unterbringen.
Der nächste arbeitet mit großem Hauptfenster, nutzt aber mittelgroße und kleine Schrift in den Hilfsfenstern.

Wenn man alle Fenster immer neu anordnen könnte wäre es einfacher - darf aber nicht gemacht werden.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 11:54
von HaPe
Hallo Roland !
Meine bisherige Lösung basiert auf dem Ansatz den Desktop in Bereiche aufzuteilen und dort die neuen Fenster zu platzieren.
Ich habe auch Hilfsmittel mit denen mit einem Mausklick die neuen Fenster besser verteilt werden können. Das ist schon ein Klick zu viel für die Anwender...
Deine Anwender sind ja ganz schön verwöhnt #-o

Ich wage es fast nicht zu fragen, aber wäre es nicht möglich dass sich der Anwender nur einmal einstellen muss wie die vielen Fenster optimal auf den Monitor passen und später diese Fenster wieder benutzerdefiniert genau an dieser Stelle geöffnet werden?
Im Moment kann ich mir nicht vorstellen dass ein Mitarbeiter/in mehr als 4 bis 6 Fenster von immer unterschiedlichen Applikationen/Bereichen im Programm zu öffnen hat sodaß ein hin- und wieder manuelles Anordnen diesen überfordert.

Der Fachbegriff in CAD/CAM heisst Verschachtelung.
Suche mal in Google/Bing/... mit "+verschachtelung +rechteck"

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 21:06
von DelUser01
HaPe hat geschrieben: Sa, 24. Mär 2018 11:54Deine Anwender sind ja ganz schön verwöhnt
Ja
HaPe hat geschrieben: Sa, 24. Mär 2018 11:54Ich wage es fast nicht zu fragen, aber wäre es nicht möglich dass sich der Anwender nur einmal einstellen muss wie die vielen Fenster optimal auf den Monitor passen und später diese Fenster wieder benutzerdefiniert genau an dieser Stelle geöffnet werden?
Im Prinzip ja - beißt sich aber mit ...ganz schön verwöhnt... :-)
HaPe hat geschrieben: Sa, 24. Mär 2018 11:54Im Moment kann ich mir nicht vorstellen dass ein Mitarbeiter/in mehr als 4 bis 6 Fenster von immer unterschiedlichen Applikationen/Bereichen im Programm zu öffnen hat sodaß ein hin- und wieder manuelles Anordnen diesen überfordert.
Dazu müsste ich Dir die Funktions-Philosophie meiner Programmsteuerung zeigen/erklären.
An allen Arbeitsplätzen machen die User täglich viele Hilfsfenster auf und wieder zu. Im Büro sind das täglich Umengen an Hilfs-Fenstern. Da sprechen wir nicht von kleinen Auswahlfenstern für Sortierung, Drucker o.ä. - das sind immer vollständige EXE-Fenster mit allen Funktionen.
Dazu kommen noch die permanent geöffneten Fenster der Dokumenten-/Belegverwaltung.
Da kommt schon was zusammen.

Die automatische Positionierung muss funktionieren, sonst wird das Fensterschieben schnell lästig.
(es geht nicht mehr richtig - es ist schon lästig...)

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 22:00
von HaPe
Hallo Roland !
An allen Arbeitsplätzen machen die User täglich viele Hilfsfenster auf und wieder zu.
Sind das modale Fenster?
Wenn nein, wäre es nicht möglich eine Taskleiste im Programm bzw. in einem Programm/Fenster-Manager zu haben?
Das heißt, er macht diese Fenster nicht zu sondern legt diese in die deine Taskleiste?

Ich habe das in meinen Programmen auch (aber nur eine EXE).
Guggst du hier:
slalomxxl.jpg
slalomxxl.jpg (187.52 KiB) 12356 mal betrachtet

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 22:54
von DelUser01
@Hans-Peter

am Ende des Tages hätte da mancher unüberschaubar viele Icons auf der Taskleiste :-)

Die "normalen" Auswahlfenster (Sortierung, Drucker, usw.) sind Modal.
Die (Slave-) EXEs jedoch sind vollständig eingene Programme, gekoppelt mit dem aufrufenden (Master-) EXE. Dieses Master-/Slave-Prinzip ist (fast) unbegrnzt nutzbar (1 zu X). Also solange der User noch durchblickt.
Sonst mach er das Hauptfenster zu und alles ist weg...
Das kann ich Dir mal per Remote zeigen.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 24. Mär 2018 22:58
von DelUser01
P.S.
würde mich den richtigen Berechnungsansatz auch was kosten lassen :thumbup:

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: So, 25. Mär 2018 8:57
von Wolfgang Ciriack
Ich denke, dem Anwender ist schon zuzumuten, dass er nach der Installation des Programms einmalig seine Fenster so positioniert, wie er sie haben möchte.
Dann merkt man sich die Positionen der Fenster und öffnet sie beim nächsten Mal wieder an derselben Stelle. Hätte auch den Vorteil, das die Fenster immer an der "gewohnten" Stelle geöffnet werden.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: So, 25. Mär 2018 9:44
von DelUser01
@Hans-Peter

Es gibt die Möglichkeit, die Hilfsfenster geöffnet zu lassen. Das habe ich inzwischen selbst schon vergessen. Das wird aber nichtmehr verwendet da es verschiedentlich durch Fehlbedinung zu Problemen führte und manche User verwirrt hat.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Mo, 26. Mär 2018 8:47
von Herbert
Ich mache es so, dass jedes Fenster wo es geöffnet ist/war mit dessen Position und Grösse festgehalten wird und an derselben Stelle später wiedererscheint.In diesem Fall musst du einfach schauen, ob an der neuen Stelle ein Fenster momentan vorhanden ist (Falls verschiedene EXE dies bewirken, musst du das neben der Positionsangaben zusätzlich extern in einer Tabelle festhalten), springst eine Position weiter und schaust, ob ein Fenster da ist.

Falls alle Fenster gleich gross sind: Teile deinen Bildschirm in eigens benannte Bereichsflächen auf. Loop durch alle Flächen, schauen ob frei und falls frei, dann aufgrund der Fläche die Position festlegen und einfügen. Dies ist das Verhalten eines Dashboards.
In dem Fall kannst das Ganze sogar verfeinern, indem beim Verschieben eines Fensters an einen andern Platz, das vermeintlich dahinter liegende Fenster wegschiebst, also mit dem zu Schiebenden vertauschst. Dasselbe beim Schliessen: könntest die Nachfolgenden nachrücken lassen.

Diese Aufgabe kann eine eigene Klasse lösen.

Aber da taucht ein anderer Gedanke auf: Wieso müssen alle Fenster nebeneinander liegen? Braucht der Benutzer alle Informationen parallel? Heute sind die Windowsanwender intuitiv genug und schieben ohne zu überlegen die Fenster umher, wie gerade benötigt.

Bei Hilfefenstern ohnehin sollen diese sogar überlagernd erscheinen, es soll ja etwas erklärt werden, anschliessend in der Regel wieder geschlossen oder weggeschoben.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Mo, 26. Mär 2018 10:42
von komnick
Hallo Roland,

du könntest die Aufgabe mit Rekursion lösen:
Wenn du n Fenster offen hast, dann betrachte das n-te Fenster: Der gesuchte Platz befindet sich über, unter, rechts oder links von diesem Fenster. Für jedes dieser vier kleineren Rechtecke musst du deine eigene Funktion rekursiv aufrufen. In diesen Aufrufen sucht deine Funktion den freien Platz unter Berücksichtigung der ersten (n-1) offenen Fenster.

Das wird bei vielen Fenstern langsam, wäre bei 2-6 Fenstern aber nicht so schlimm.

Lieben Gruß
Martin

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Mo, 26. Mär 2018 12:02
von DelUser01
Herbert hat geschrieben: Mo, 26. Mär 2018 8:47Ich mache es so, dass jedes Fenster wo es geöffnet ist/war mit dessen Position und Grösse festgehalten wird und an derselben Stelle später wiedererscheint...
So mache ich das mit bestimmten Fenstern auch.
Herbert hat geschrieben: Mo, 26. Mär 2018 8:47Bei Hilfefenstern ohnehin sollen diese sogar überlagernd erscheinen, es soll ja etwas erklärt werden, anschliessend in der Regel wieder geschlossen oder weggeschoben.
War ein Fehler von mir das pauschal "Hilfsfenster" zu nennen - Neben-/Zusazufenster würde das eher treffen. Der nachfolgene Punkt bringt hoffentlich eine Detaillierte Erklärung warum.
Herbert hat geschrieben: Mo, 26. Mär 2018 8:47Aber da taucht ein anderer Gedanke auf: Wieso müssen alle Fenster nebeneinander liegen? Braucht der Benutzer alle Informationen parallel?
Das ist der springende Punkt!
In den Zusatzfenstern können weitere Informationen angezeigt werden.
Z.B. um viel mehr Daten zu einem Artikel anzuzeigen wie in einem Hauptfenster möglich.
Z.B. um mehrstufige Auswertungen darzustellen, jede Stufe in einem eigenen Fenster.
Nun könnte man sagen, das kann ja mit jedem Programm gemacht werden, zig Fenster nebeneinander und in jedem eine andere Ansicht auf (z.B.) den Artikel.
Das Plus ist aber, dass die Fenster gekoppelt sind und die Daten überall synchron positioniert werden.

Praxisbeispiel:
1. Fenster: Artikel-Übersicht
2. Fenster: Artikel-Detailansicht 1 (abhängig von 1.)
3. Fenster: Lager-Disposition zum Artikel (abhängig von 1.)
4. Fenster: Kunden pro Artikel (abhängig von 1.)
5. Fenster: Kunden-Detailansicht 1 (abhängig von 4.)

Wird nun in Fenster 1 auf einen anderen Artikel positioniert werden die Daten in allen anderen Fenstern nachpositioniert.
Werden in Fenster 4 mehrere Adressen angezeigt kann man auch hier jetzt den Cursor bewegen und nur das Fenster 5 wird geändert.
Usw... solange man versteht was man da tut :-)
Der User muss sich nicht um die Kopplung kümmern.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Mo, 26. Mär 2018 13:01
von DelUser01
Hallo Martin
komnick hat geschrieben: Mo, 26. Mär 2018 10:42du könntest die Aufgabe mit Rekursion lösen:
Wenn du n Fenster offen hast, dann betrachte das n-te Fenster: Der gesuchte Platz befindet sich über, unter, rechts oder links von diesem Fenster. Für jedes dieser vier kleineren Rechtecke musst du deine eigene Funktion rekursiv aufrufen. In diesen Aufrufen sucht deine Funktion den freien Platz unter Berücksichtigung der ersten (n-1) offenen Fenster.
So ähnlich habe ich das in der Vergangenheit auch gemacht, bzw. so sollte es laufen. Warum auch immer geht das manchmal nicht mehr. Ausgerechnet beim ersten Zusatzfenster mach das Programm den Fehler - und manchmal klappt das prima.
Der Fenster-Verteilfunktion ist schon recht alt, da ist man noch nicht davon ausgegangen, dass mehr als 4 Fenster ohne Überlagerung auf den Desktop passen :-)

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 21. Apr 2018 10:08
von UliTs
Hallo Roland,

hast Du inzwischen eine zufriedenstellende Routine dafür?

Uli

P.S. Du bist nicht in Dresden, oder?

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 21. Apr 2018 10:47
von DelUser01
Hallo Uli
UliTs hat geschrieben: Sa, 21. Apr 2018 10:08hast Du inzwischen eine zufriedenstellende Routine dafür?
Wie mann's nimmt. Wie schon geschrieben habe ich den Vorschlag von Martin aufgegriffen und eine ältere Berechnungsmethode wieder reaktiviert und verbessert, welche die freien Flächen um das Hauptfenster herum prüft und dort platziert. Ist aber noch nicht bis zuletzt durchgedacht.

Das ist aber nicht der "neue Ansatz" den ich mir vorgestellt hatte...
UliTs hat geschrieben: Sa, 21. Apr 2018 10:08P.S. Du bist nicht in Dresden, oder?
Nein - ich sitze bei dem schönen Wetter im Büro.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 21. Apr 2018 12:06
von UliTs
Ich habe mal ein paar Bilder zum besseren Verständnis gezeichnet Das rote Fenster ist ein bestehendes Fenster, welches nicht überlagert werden soll.
Die grünen Fenster (auch im nächsten Post) sind jeweils die größtmöglichen Fenster links, rechts, oben und unten vom bestehenden Fenster. In diesem Fall würdest Du also das neue Fenster entsprechend dem unteren grünen Fenster positionieren. Richtig?

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 21. Apr 2018 12:09
von UliTs
s.o.

Re: größte freie Desktop-Fläche für neue Fenster

Verfasst: Sa, 21. Apr 2018 13:52
von DelUser01
@Uli

Schritt 1)
Größtmögliche freie grüne Flächen suchen für weiteres rotes Fenster - soweit richtig.

Schritt 2)
Feststellen ob in die ermittelten grünen Flächen noch ein rotes Fenster vollständig reinpasst:
JA: Ganz unten ganz links (optimal?) platzieren. (in Deinem Beispiel)
(NEIN: siehe Schritt 4)

Schritt 3)
Selbiges Spiel für das dritte rote Fenster: Größtmögliche freie grüne Flächen suchen.

Schritt 4)
Feststellen ob in die ermittelten grünen Flächen noch ein rotes Fenster reinpasst:
JA: optimal platzieren
NEIN: größte grüne Fläche suchen welche die geringste Überlappung mit den vorhandenen roten Fenstern hat. Dort dann das nächste rote Fenster platzieren.

Schritt 5) usw...

- Optimal Platzieren soll heißen, dass das neue Fenster möglichst dort hingesetzt werden sollte bei der die übrigbleibende grüne Fläche nicht unnötig weiter zerteilt würde.
- Sind die Fenster groß und der Desktop klein würde man anders platzieren als bei großem Desktop und kleinen Fenstern.