Autor Beitrag
I.c.h
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 20
Erhaltene Danke: 4

Win XP, Win 7
C# (VS 2010), Java, PHP
BeitragVerfasst: Mo 04.07.11 17:51 
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
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public static Point LeftmostPoint()                         // Koordinate der linken oberen Ecke des linkesten Bildschirms
{
    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:
ausblenden C#-Quelltext
1:
this.Location = Tools.LeftmostPoint();					


Thx schon mal

Grüße
I.c.h
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 20
Erhaltene Danke: 4

Win XP, Win 7
C# (VS 2010), Java, PHP
BeitragVerfasst: Mo 04.07.11 18:30 
Argh. Stimmt funktioniert aber immer noch nicht :(

Mein Code sieht jetzt so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
public static Point LeftmostPoint()                         // Koordinate der linken oberen Ecke des linkesten Bildschirms
{
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 04.07.11 18:58 
Aber sollte für den linkesten virtuellen Bildschirm nicht sowieso immer (0, 0) rauskommen?
Also
ausblenden C#-Quelltext
1:
2:
3:
4:
public static Point LeftmostPoint() // Koordinate der linken oberen Ecke des linkesten Bildschirms
{
    return new Point(00);
}

:lol:
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 20
Erhaltene Danke: 4

Win XP, Win 7
C# (VS 2010), Java, PHP
BeitragVerfasst: 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.