2009-06-12 2 views
29

Ich entwickle eine Anwendung, die die Benutzereinstellungen speichert, wo das Formular zuletzt auf dem Bildschirm gefunden wurde. In einigen Fällen wird der Benutzer es auf einem zweiten Bildschirm haben und dann die App später ohne den zweiten Bildschirm auslösen (manchmal wird das Formular außerhalb des Bildschirms angezeigt). Andere Male wird der Benutzer seine Auflösung ändern, was zu einem ähnlichen Effekt führt.Ermitteln, ob ein Formular vollständig ausgeblendet ist

Ich hatte gehofft, diese Überprüfung in der Form_Shown Event-Handler zu tun. Grundsätzlich möchte ich feststellen, ob das Formular vollständig außerhalb des Bildschirms ist, damit ich es neu positionieren kann.

Irgendwelche Ratschläge?

+0

Ich sollte erwähnen, dass ich weiß ich, indem sie die Bildschirmauflösung, Größe und Position des Formulars einige knifflige Logik durchführen können, jedoch war ich für etwas Hoffnung, ein wenig eleganter. – Cody

+0

Sie denken wirklich, dass es eleganter ist, das Formular zu positionieren, zu überprüfen, ob es außerhalb der Auflösung/Größe ist, und es dann neu zu positionieren? Eine elegantere Lösung wäre, zu überprüfen, ob Sie es von dem Bildschirm positionieren, bevor Sie tun. –

Antwort

49

prüfen Mit dieser Funktion, wenn Formular vollständig auf dem Bildschirm ist:

public bool IsOnScreen(Form form) 
{ 
    Screen[] screens = Screen.AllScreens; 
    foreach(Screen screen in screens) 
    { 
     Rectangle formRectangle = new Rectangle(form.Left, form.Top, 
               form.Width, form.Height); 

     if(screen.WorkingArea.Contains(formRectangle)) 
     { 
     return true; 
     } 
    } 

    return false; 
} 

prüfen nur oben links Punkt, wenn es auf dem Bildschirm ist:

public bool IsOnScreen(Form form) 
{ 
    Screen[] screens = Screen.AllScreens; 
    foreach(Screen screen in screens) 
    { 
     Point formTopLeft = new Point(form.Left, form.Top); 

     if(screen.WorkingArea.Contains(formTopLeft)) 
     { 
     return true; 
     } 
    } 

    return false; 
} 
+0

Ich habe vergessen, wie Form rechtwinklig andere Art und Weise zu umgehen, aber ich hoffe, dass dies hilft –

+0

Das ist wirklich ordentlich aussieht, und ich wusste nicht, dass Funktionalität existierte. Eine Frage: Wird das nicht immer falsch sein, wenn das Fenster nur teilweise vom Bildschirm verschwindet? Die Frage wird komplett außerhalb des Bildschirms abgefragt. –

+0

ja es tatsächlich ... –

0

die Bildschirme überprüfen Auflösung, bevor Sie Position das Fenster. Dadurch können Sie herausfinden, ob Sie es außerhalb der Grenzen der Auflösung platzieren, bevor Sie es tatsächlich tun.

3

Alter Thread, aber immer noch hilfreich! Cody und Andrija - danke für den Code. Ich musste ein paar kleinere Anpassungen vornehmen: Statt screen.WorkingArea.Intersect (formRectangle); Ich habe formRectangle.Intersect (screen.WorkingArea); seit Intersect() ersetzt sein Objekt durch den Schnittpunkt. Wenn das Formular vollständig ausgeblendet ist, lautet formRectangle nach dem Schnittpunkt (0,0,0,0) und Contains() gibt true zurück. So überprüfe ich auch, ob formRectangle oben, links, Breite und Höhe nicht alle 0 sind, bevor sie wahr zurückgeben. Jetzt gibt der Code true zurück, wenn ein Teil des Formulars auf dem Bildschirm angezeigt wird, und false, wenn kein Teil auf dem Bildschirm angezeigt wird.

+1

Danke Sean! Können wir diese Antwort für eine vollständige Antwort in Andrijas aufnehmen? – Cody

12

alle Lösungen, die oben mit dem "IntersectsWith" -Methode und LINQ-Erweiterungen Kombination geben Sie uns kurz:

public bool IsOnScreen(Form form) 
{ 
    // Create rectangle 
    Rectangle formRectangle = new Rectangle(form.Left, form.Top, form.Width, form.Height); 

    // Test 
    return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(formRectangle)); 
} 
+0

Könnte dies nicht mehr werden auch vereinfacht mit [ 'Form.ClientRectangle'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.clientrectangle.aspx) – Carsten

+1

Es würde passen für die meisten Zwecke, obwohl es nicht das ganze Formular enthalten würde. Control.ClientRectangle in MSDN: "Der Client-Bereich eines Steuerelements sind die Grenzen des Steuerelements abzüglich der Nicht-Client-Elemente wie Bildlaufleisten, Rahmen, Titelleisten und Menüs." (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.clientrectangle.aspx) –

+1

Sie können [ 'Form.DesktopBounds'] (http://msdn.microsoft .com/de-de/library/system.windows.forms.form.desktopbounds (v = vs.110) .aspx) – Dan

1

Für WPF (basierend auf Matthias Loerkes Antwort)

Fügen Sie einen Verweis zu System.Windows.Forms und System.Drawing.

//using System.Windows.Forms; 

public bool IsOnScreen(Window window) 
{ 
    var windowRect = new System.Drawing.Rectangle((int)window.Left, (int)window.Top, (int)window.Width, (int)window.Height); 
    return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(windowRect)); 
} 
8

Komplette Lösung hier (basierend auf allen Antworten). Ich habe einen Parameter MinPercentOnScreen hinzugefügt, wo mindestens dieser Prozentsatz von Pixeln über alle Bildschirme/Displays hinweg sichtbar sein muss. Also, wenn dies false zurückgibt, müssen Sie die Position des Fensters zurück auf den Standardwert verschieben.

// Return True if a certain percent of a rectangle is shown across the total screen area of all monitors, otherwise return False. 
public bool IsOnScreen(System.Drawing.Point RecLocation, System.Drawing.Size RecSize, double MinPercentOnScreen = 0.2) 
{ 
    double PixelsVisible = 0; 
    System.Drawing.Rectangle Rec = new System.Drawing.Rectangle(RecLocation, RecSize); 

    foreach (Screen Scrn in Screen.AllScreens) 
    { 
     System.Drawing.Rectangle r = System.Drawing.Rectangle.Intersect(Rec, Scrn.WorkingArea); 
     // intersect rectangle with screen 
     if (r.Width != 0 & r.Height != 0) 
     { 
      PixelsVisible += (r.Width * r.Height); 
      // tally visible pixels 
     } 
    } 
    return PixelsVisible >= (Rec.Width * Rec.Height) * MinPercentOnScreen; 
} 

Umsetzung:

return IsOnScreen(this.Location, this.Size);