Question

Je développe une application qui rappelle les préférences de l'utilisateur à la forme où la dernière située sur l'écran. Dans certains cas, l'utilisateur aura sur un écran secondaire, puis tirer l'application plus tard, sans le second écran (ayant parfois la forme apparaît hors de l'écran). D'autres fois, l'utilisateur va changer leur résolution entraînant un effet similaire.

J'espérais faire cette vérification dans le gestionnaire d'événements Form_Shown. Fondamentalement, je veux savoir si la forme est complètement hors de l'écran pour que je puisse repositionner.

Un conseil?

Était-ce utile?

La solution

Vérifiez avec cette fonction si le formulaire est entièrement à l'écran :

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;
}

Vérification seul point en haut à gauche si elle est à l'écran:

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;
}

Autres conseils

La combinaison de toutes les solutions ci-dessus avec la "IntersectsWith" -method et LINQ-extensions nous donner en bref:

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));
}

Solution complète ici (en fonction de toutes les réponses). J'ai ajouté un paramètre MinPercentOnScreen où au moins cette% des pixels doit être visible sur tous les écrans / expositions. Donc, si ce rendement false vous devez déplacer la position de la fenêtre aux valeurs par défaut.

// 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;
}

Mise en œuvre:

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

fil vieux, mais toujours utile! merci pour le code Cody et Andrija-. Je devais faire quelques ajustements mineurs: Au lieu de screen.WorkingArea.Intersect (formRectangle); Je formRectangle.Intersect (screen.WorkingArea); depuis Intersection () remplace son objet à l'intersection. Si le formulaire est complètement hors de l'écran, formRectangle après l'intersection est (0,0,0,0), et contient () renvoie true. Donc, je vérifie également si formRectangle Haut, Gauche, largeur et la hauteur ne sont pas tous 0 avant de retourner vrai. Maintenant, le code renvoie true si une partie de la forme est à l'écran, et false si aucune partie est à l'écran.

WPF (fonction de la réponse Matthias Loerkes)

Ajoutez une référence à System.Windows.Forms et 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));
}

Aucune de ces travaux si un moniteur se trouve être éteint. La fonction Screen.AllScreens retournera toujours le nombre d'écrans, même si l'on est hors tension.

Vérifiez la résolution des écrans avant de positionner la fenêtre. Cela vous permettra de savoir si vous où va le placer en dehors des limites de la résolution, avant de faire réellement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top