redimensionar - resize form c#
Determinar si un formulario está completamente fuera de pantalla (6)
Estoy desarrollando una aplicación que recuerda las preferencias del usuario en cuanto a dónde se ubicó el formulario por última vez en la pantalla. En algunos casos, el usuario lo tendrá en una pantalla secundaria y luego activará la aplicación más tarde sin la segunda pantalla (a veces el formulario aparece fuera de la pantalla). Otras veces, el usuario cambiará su resolución y obtendrá un efecto similar.
Esperaba hacer esta comprobación en el controlador de eventos Form_Shown. Básicamente, quiero determinar si el formulario está completamente fuera de la pantalla para poder reubicarlo.
¿Algún consejo?
La combinación de todas las soluciones anteriores con el "IntersectsWith" -method y LINQ-extensions nos resumen:
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));
}
Para WPF (basado en la respuesta de Matthias Loerkes)
Agregue una referencia a System.Windows.Forms y 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));
}
Solución completa aquí (en base a todas las respuestas). He agregado un parámetro MinPercentOnScreen
donde al menos este% de píxeles debe estar visible en todas las pantallas / pantallas. Por lo tanto, si esto devuelve false
, deberá mover la posición de la ventana a la predeterminada.
// 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;
}
Implementación:
return IsOnScreen(this.Location, this.Size);
Verifique con esta función si el Formulario está completamente en pantalla :
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;
}
Verificando solo el punto superior izquierdo si esta en la pantalla:
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;
}
Verifique la resolución de las pantallas antes de colocar la ventana. Eso le permitirá averiguar si lo colocaría fuera de los límites de la resolución antes de hacerlo.
Viejo hilo, pero sigue siendo útil! Cody y Andrija, gracias por el código. Tuve que hacer un par de ajustes menores: en lugar de screen.WorkingArea.Intersect (formRectangle); Utilicé formRectangle.Intersect (screen.WorkingArea); ya que Intersect () reemplaza su objeto con la intersección. Si el formulario está completamente fuera de la pantalla, formRectangle después de la intersección es (0,0,0,0) y Contains () devuelve verdadero. Así que también verifico si formRectangle Top, Left, Width y Height no son todos 0 antes de devolver el valor verdadero. Ahora el código devuelve verdadero si alguna parte del formulario está en la pantalla, y falso si no hay ninguna parte en la pantalla.