Autor |
Beitrag |
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 11.11.15 02:33
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
Einloggen, um Attachments anzusehen!
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: 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
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Palladin007 
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
|
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 oder GetDesktopWindow) und dem Control dann die passenden Window Messages senden um die Information was wo liegt zu bekommen oder zu setzen.
|
|
Palladin007 
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Palladin007 
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 11.11.15 15:42
Es gibt auch Klassen, die das können:
SystemInformation
Screen
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.
|
|
|