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 |
Palladin007 hat folgendes geschrieben : |
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
Ralf Jansen hat folgendes geschrieben : |
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,
SYSTEMPARAMETERSINFO mit SPI_ICON{HORIZONTAL,VERTICAL}SPACING und SPI_ICONSPACING bzw. SPI_GETICONMETRICS sowie
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
Mathematiker schon schrieb :gruebel:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!