Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Genaue Position eines Icons auf dem Desktop errechnen


Palladin007 - Mi 11.11.15 02:33
Titel: Genaue Position eines Icons auf dem Desktop errechnen
Servus,

ich habe mal eine Frage, die vielleicht auch die Mathe-Begeisterten hier interessieren könnte.
Und zwar möchte ich in einer Anwendung alle Icons auf dem Desktop neu positionieren können - unabhängig von Auflösung und Icon-Größe.

Dazu möchte ich den Desktop in eine Art Matrix unterteilen, dessen Zellen ich dann über einen eindeutigen Index ansprechen kann.
Soweit kein Problem, ich habe die Auflösung und kann zählen, wie viele Icons in Höhe und breite auf den Desktop passen.
Simpel gerechnet weiß ich damit die Maße jeder Zelle und auch die Position.

Komplizierter wird es aber, wenn ich das Icon auch korrekt positionieren will.
Ich brauche also eine Formel, wie ich zuverlässig die Position jedes Icons anhand Raster-Quadrat-Indexes errechnen kann.

Dazu habe ich diese vom System ausgelesenen Maße (Höhe x Breite):
Icon: 32 x 32
Raster-Quadrat: 78 x 114
Diese Werte sind unabhängig von der Auflösung allgemeingültig und ich gehe davon aus, dass die Werte änderbar sind.
Und natürlich noch die
Auflösung: 1080 x 1920

Anhand dieser Daten möchte ich also aus X=3, Y=2 die Koordinaten X=396, Y=210 errechnen können.

Ich habe für ein paar Auflösungen eine Positionen-Tabelle erstellt.
Sie liegt als XLSX im Anhang.


Ich hoffe, es hat jemand eine gute Idee ^^


Beste Grüße


Mathematiker - Mi 11.11.15 08:14

Hallo,
ich hoffe, ich habe dich richtig verstanden. Wenn ja, macht es wohl

Quelltext
1:
2:
Xposition = x*114 +33
Yposition = y*107 +2

user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Anhand dieser Daten möchte ich also aus X=3, Y=2 die Koordinaten X=396, Y=210 errechnen können.

Allerdings gibt es z.B. in deiner Tabelle kein Y=210, sondern ein Y=216. X ist in der Tabelle 375, im Zitat 396?

Beste Grüße
Mathematiker


Palladin007 - Mi 11.11.15 10:16

Wie kommst Du auf die Zahlen?

Die Werte in der Tabelle habe ich mir automatisch auslesen und schreiben lassen.
Dafür habe ich jedes Raster-Quadrat auf meinem Desktop mit einer Datei belegt und dann alle Icons mit deren Position auslesen lassen.
Auf meinem Notebook sind das also exakt die Werte, die ich brauche.

Kann es sein, dass Du auf dem falschen Sheet bist? Kann sein, dass ich beim Speichern noch ein Anderes selektiert hatte.
Ich habe mehrere Tabellen in der Datei für die Auflösungen 1920x1080, 1600x900, 1280x800 und 800x600


Ralf Jansen - Mi 11.11.15 12:00

Du hast es jetzt auf einem bestimmten OS unter bestimmten Auflösungen probiert? Gibt es keine Win Api dafür? Ich vermute mal schwer das das konkrete Verhalten OS abhängig ist.
Oder ist dir das Windowsverhalten eher egal und du willst dein eigenes leidlich ähnliches drüber legen?

Zitat:
Und zwar möchte ich in einer Anwendung alle Icons auf dem Desktop neu positionieren können - unabhängig von Auflösung und Icon-Größe.


Ich denke du meinst abhängig von Auflösung und Icon-Größe ;)


Palladin007 - Mi 11.11.15 12:31

Die Anwendung soll unabhängig der Auflösung und Icon-Größe funktionieren, also muss ich die Koordinaten abhängig davon berechnen können.
So war das gemeint :D


Ob eine WinApi gibt, weiß ich nicht, gefunden habe ich Keine.
Was ich gefunden habe, waren eine ganze Reihe User32-Funktionen, mit denen ich die Icons auf Umwegen positionieren kann.
Da kann ich aber auch nur die Koordinaten in Pixeln angeben


Ich habe es auf Meinem Notebook mit Windows 10 getestet.
Ich kann die Koordinaten noch auf zwei weiteren Windows 10-Rechnern auslesen, ob das einen Unterschied macht, wage ich aber zu bezweifeln.


Ralf Jansen - Mi 11.11.15 13:05

Zitat:
Die Anwendung soll unabhängig der Auflösung und Icon-Größe funktionieren, also muss ich die Koordinaten abhängig davon berechnen können.
So war das gemeint :D

War auch ein reiner Nitpicker Kommentar von mir ;)
Zitat:
Ich kann die Koordinaten noch auf zwei weiteren Windows 10-Rechnern auslesen, ob das einen Unterschied macht, wage ich aber zu bezweifeln.

Das würde ich auch bezweifeln. Das Verhalten von 7, 8, 8.1 ist aber potentiell anders.
Aber ich habe noch nicht ganz verstanden was du vorhast. Windows hat ja bereits ein Raster das automatisch ausrichtet und kann den Desktop sortieren. Gehts dir um den Fall das das Raster ausgeschaltet ist, keine Sortierung vorhanden ist und du frei positionieren kannst nach einem eigenen Verfahren oder gehts dir um die Wiederherstellung der Desktoppositionen nach Auflösungsänderung einschließlich des Windows Rasters/Sortierung etc. etc.
Zitat:
Ob eine WinApi gibt, weiß ich nicht, gefunden habe ich Keine.

Der Desktop ist ein Control ähnlich ListView (Google sagt es ist ein SysListView32) heißt für mich du müßtest dir einen Handle auf diesen ListView besorgen (GetShellWindow [https://msdn.microsoft.com/en-us/library/windows/desktop/ms633512%28v=vs.85%29.aspx] oder GetDesktopWindow [https://msdn.microsoft.com/en-us/library/windows/desktop/ms633504%28v=vs.85%29.aspx]) und dem Control dann die passenden Window Messages senden um die Information was wo liegt zu bekommen oder zu setzen.


Palladin007 - Mi 11.11.15 14:45

Zitat:
Das würde ich auch bezweifeln. Das Verhalten von 7, 8, 8.1 ist aber potentiell anders.
Aber ich habe noch nicht ganz verstanden was du vorhast. Windows hat ja bereits ein Raster das automatisch ausrichtet und kann den Desktop sortieren. Gehts dir um den Fall das das Raster ausgeschaltet ist, keine Sortierung vorhanden ist und du frei positionieren kannst nach einem eigenen Verfahren oder gehts dir um die Wiederherstellung der Desktoppositionen nach Auflösungsänderung einschließlich des Windows Rasters/Sortierung etc. etc.


Ich möchte eine Möglichkeit schaffen, dass ich unabhängig von der Auflösung die Icons anordnen kann.
Dafür würde ich dann z.B. sagen, dass Icons ausgehend von der unteren Kante z.B. 3 Schritte nach Oben positioniert wird.
Oder ein Icon wird immer in der rechten unteren Ecke angeordnet.
Bei verschiedenen Auflösungen bedeutet das auch unterschiedliche Koordinaten.

Ich könnte zwar für jede potentielle Auflösung entsprechende Koordinaten vorbereiten, oder der Nutzer darf das für seine Anwendungsfälle machen.
Schön finde ich das aber nicht.

Zitat:
Der Desktop ist ein Control ähnlich ListView (Google sagt es ist ein SysListView32) heißt für mich du müßtest dir einen Handle auf diesen ListView besorgen (GetShellWindow oder GetDesktopWindow) und dem Control dann die passenden Window Messages senden um die Information was wo liegt zu bekommen oder zu setzen.


Genau das tue ich aktuell.
Wenn ich aber nicht das gewollte Raster-Quadrat mit den Koordinaten treffe, rutscht das Icon eins weiter. Das kann ich nur zuverlässig umgehen, wenn ich die Koordinaten genau berechne, wo Windows es auch hin schieben würde.


Ralf Jansen - Mi 11.11.15 15:03

Zitat:
Wenn ich aber nicht das gewollte Raster-Quadrat mit den Koordinaten treffe, rutscht das Icon eins weiter.

Denn Effekt des Verschiebens könnte man natürlich explizit ausnutzen aber das würde nur funktionieren wenn das Raster auch eingeschaltet ist.

Das mit dem Berechnen sehe ich aber immer noch kritisch da hängen vermutlich noch mehr Variablen dran als du im Moment zu berücksichtigen gedenkst.
DPI Einstellungen von Windows (wenn du den Zoom auf 150% stellst) kannst deine Werte einfach hochrechnen oder passiert da noch mehr?
Theming (hat das Theming auch Einfluß auf die Desktop Positionierung)?
OS Eigenheiten von 7,8,8.1,10?
etc.
Da hängt sicher ne Menge Try&Error dran wenn es keine von Windows zu benutzende Methode gibt sondern man es selbst so wie Windows berechnen will.


Martok - Mi 11.11.15 15:29

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Das mit dem Berechnen sehe ich aber immer noch kritisch da hängen vermutlich noch mehr Variablen dran als du im Moment zu berücksichtigen gedenkst.
DPI Einstellungen von Windows (wenn du den Zoom auf 150% stellst) kannst deine Werte einfach hochrechnen oder passiert da noch mehr?
Theming (hat das Theming auch Einfluß auf die Desktop Positionierung)?
OS Eigenheiten von 7,8,8.1,10?
Der Teil ist einfach, Suche im MSDN SYSTEMPARAMETERSINFO mit SPI_ICON{HORIZONTAL,VERTICAL}SPACING und SPI_ICONSPACING bzw. SPI_GETICONMETRICS sowie Suche im MSDN GETSYSTEMMETRICS mit SM_C{X,Y}ICON liefert dir diese Werte.

Irgendwo gibt es da noch einen Offset (die erste Zeile liegt seit dem neuen Desktop-Control nicht bei Y=0, sondern weiter unten), aber der Rest sollte sich normal zusammenmultiplizieren lassen wie das auch user profile iconMathematiker schon schrieb :gruebel:


Palladin007 - Mi 11.11.15 15:42

Es gibt auch Klassen, die das können:
SystemInformation [https://msdn.microsoft.com/de-de/library/system.windows.forms.systeminformation%28v=vs.110%29.aspx]
Screen [https://msdn.microsoft.com/de-de/library/system.windows.forms.screen%28v=vs.110%29.aspx]

Ich hab mir mal bei 150% die gleichen Werte wie vorher raus gesucht:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Icon Height:         32
Icon Width:          32

Icon Spacing Height: 114
Icon Spacing Width:  114

Screen Height:       617
Screen Width:        1097


IconMetrics habe ich da noch nicht mit drin.


Das da ein großes Risiko dran hängt, dass ich etwas übersehe, ist mir klar.
Da ich aber Keine gefunden habe, muss ich diesen Umweg verwenden.