Entwickler-Ecke
WinForms - Fenster über mehrere Bildschirme
I.c.h - Mo 04.07.11 17:51
Titel: Fenster über mehrere Bildschirme
Servus zusammen,
ich bin neu hier also bitte nicht gleich verschlagen wenn ich was falsch mache :wink: .
Ich habe zur Zeit folgendes Problem:
Meine C#-Anwendung (.Net 4.0) soll alle vorhanden Bildschirme ausnutzen. Ich benutze z.B. meinen rechten Bildschirm als Hauptbildschirm und meinen linken dann eben als sekundären Bildschirm.
Mein Ansatz war, die kleinste "Boundspunkt" im Screen.AllScreens-Array als Locationpunkt meiner Form zu verwenden und mein Fenster dann zu strecken.
Das funktioniert aber nicht! Habt ihr einen besseren Ansatz oder wisst warum mein Gedanke nicht funktioniert?
Hier noch die entspr. Codeausschnitte:
Methode zur Ermittlung des Boundspunktes
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public static Point LeftmostPoint() { Point p = new Point();
for (int i = 0; i < Screen.AllScreens.Length; i++) { if (Screen.AllScreens[i].Bounds.X < p.X) { p.X = Screen.AllScreens[i].Bounds.X; p.Y = Screen.AllScreens[i].Bounds.Y; } }
return p; } |
Methode zur Fensterpositionierung:
C#-Quelltext
1:
| this.Location = Tools.LeftmostPoint(); |
Thx schon mal
Grüße
I.c.h
Th69 - Mo 04.07.11 18:22
Hallo I.c.h (bzw. D.u ;-)) und :welcome:
deine Bedingung in der Schleife wird niemals ausgeführt, da du den Point p standard-initialisierst hast (d.h. x=0 und y=0). Du mußt also diesen Startpunkt auf z.B. Int32.Max setzen.
Nichtsdestotrotz sollte deine bisherige Methode trotzdem ja (0, 0) zurückgeben (und das willst du doch, oder?). Daher ist deine Methode bisher ein bißchen sinnlos, denn es wird ja immer (0, 0) herauskommen...
I.c.h - Mo 04.07.11 18:30
Argh. Stimmt funktioniert aber immer noch nicht :(
Mein Code sieht jetzt so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| public static Point LeftmostPoint() { Point p = new Point();
p.X = Int32.MaxValue; p.Y = Int32.MaxValue;
for (int i = 0; i < Screen.AllScreens.Length; i++) { if (Screen.AllScreens[i].Bounds.X < p.X) { p.X = Screen.AllScreens[i].Bounds.X; p.Y = Screen.AllScreens[i].Bounds.Y; } }
return p; } |
Ralf Jansen - Mo 04.07.11 18:39
Wann rufst du denn den Code auf? Wenn du das als erstes im Constructor der Form machst wäre das zu früh. Geeignet wären der Load oder Shown Event.
Folgenden Code vom Load Event aus aufgerufen scheint zu gehen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public static Point LeftmostPoint() { Point p = Screen.PrimaryScreen.Bounds.Location; foreach (Screen screen in Screen.AllScreens) if (screen.Bounds.X < p.X) p = screen.Bounds.Location; return p; } |
Th69 - Mo 04.07.11 18:58
Aber sollte für den linkesten virtuellen Bildschirm nicht sowieso immer (0, 0) rauskommen?
Also
C#-Quelltext
1: 2: 3: 4:
| public static Point LeftmostPoint() { return new Point(0, 0); } |
:lol:
Ralf Jansen - Mo 04.07.11 19:01
Die 0er-Koordinaten gehören zum primären Monitor. Ist noch einer weiter Links hat der negative Koordinaten.
Th69 - Di 05.07.11 09:19
Hallo Ralf,
danke für diesen Hinweis, das wusste ich nicht.
Jedoch frage ich mich dann warum der Originalcode nicht dieses Ergebnis geliefert hat (ich habe leider hier keine 2 Bildschirme um das selber auszuprobieren).
norman2306 - Di 05.07.11 11:01
Der Code funktioniert. Er wird die Positionierung im Konstruktor vorgenommen haben, bevor das Fenster aufgebaut ist. Deshalb ging es nicht.
I.c.h - Di 05.07.11 13:01
Jab, die Sache mit dem Konstuktor war's! Packe ich den Code in das Load-Event funktioniert es wie es soll.
Danke nochmal.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!