Form positionieren

12/01/2011 - 13:43 von Michael Voß | Report spam
Hallo zusammen!

Ich möchte ein Form so auf dem Desktop positionieren, dass es mit keinem
anderen Fenster (einer bestimmten Klasse) überlappt und dabei möglichst weit
rechts oben sitzt. Die Positionen der anderen Fenster (mit denen das neue
nicht überlappen soll) zu finden ist nicht problematisch (EnumWindows und
GetWindowRect), ich suche aber einen effektiven Algorithmus, um eine freie
Stelle zu finden, in die mein neues Fenster passt. Hat da jemand auf Anhieb
eine Idee ? Das ist jetzt zwar nicht unbedingt ein .NET- oder C#-Problem,
aber da das ganze in C# entwickelt wird...

Danke!
Michael
 

Lesen sie die antworten

#1 Yoon Soo
21/01/2011 - 22:20 | Warnen spam
Am 12.01.2011 13:43, schrieb Michael Voß:
Hallo zusammen!

Ich möchte ein Form so auf dem Desktop positionieren, dass es mit keinem
anderen Fenster (einer bestimmten Klasse) überlappt und dabei möglichst weit
rechts oben sitzt. Die Positionen der anderen Fenster (mit denen das neue
nicht überlappen soll) zu finden ist nicht problematisch (EnumWindows und
GetWindowRect), ich suche aber einen effektiven Algorithmus, um eine freie
Stelle zu finden, in die mein neues Fenster passt. Hat da jemand auf Anhieb
eine Idee ? Das ist jetzt zwar nicht unbedingt ein .NET- oder C#-Problem,
aber da das ganze in C# entwickelt wird...

Danke!
Michael





habe mal nachgedacht. Im gegensatz zum ersten gedankengang denke ich
mittlerweile, dass du gar nicht um eine (komplette) Breitensuche
herumkommst, wenn du wirklich immer die 'beste' Lösung haben möchtest.
Wenn du zu früh abbrichst, hat man schon mal nur eine gute Lösung..

Ansatz: Rechtsobere Ecke deines Fensters oben rechts am Bildschirm
positionieren und auf Überschneidung mit anderen Fenstern testen (könnte
auf viele Weise geschehen[1]). falls Überschneidung, hast du im Grunde
zwei Möglichkeiten. Du verschiebst es nach links, bis das störende
Fenster aus dem Weg ist, oder nach unten, dann schaust du weiter.
Problemeatisch wird es, weil du spàter mehr Freiheitsgrade hast und eine
Lösung 'tiefer' durchaus je nach Anordnung und Dimensionen der anderen
Fenster die optimalere Lösung sein kann. (zumindest konnte ich mir
solche Fàlle zusammenbasteln)

Also entweder vollstàndige Breitensuche und Vergleich der Lösungen, oder
Breitensuche bis erste Lösung gefunden wird und abbrechen (und in Kauf
nehmen, dass es nicht unbedingt die optimale Lösung ist) oder du kannst
das ganze etwas einschrànken, indem du geeignete Annahmen über andere
fenster und Anordnungen treffen kannst..

[1] zb. fenster und Bildschirm als Matrizen abbilden und beide Matrizen
Und-Verknüpfen -> Nullmatrix -> keine Überschneidung (richtig effektiv
mit Hilfe der GPU, natürlich nicht jeden Pixel unbedingt als ein feld
der Matrix, sondern erst mal grobkörnig abbilden und bei Bedarf feiner
werden..)..oder eine zigfache verschachtelte 'intelligente' Anordnung
von ifAbfragen...


Ich lasse mich aber auch gerne eines Besseren belehren, falls es da doch
eine effektivere Lösung gibt.

Ähnliche fragen