¿Cómo centro una ventana en pantalla en C #?

129

Necesito una forma de centrar la ventana actual. Entonces, por ejemplo, si un usuario presiona un botón, quiero que la ventana se centre en la pantalla. Sé que puede usar la propiedad startposition, pero no puedo encontrar una manera de usarla que no sea cuando la aplicación se inicia por primera vez. Entonces, ¿cómo puedo centrar el formulario en la pantalla?

Sean
fuente
¿Supongo que estás usando formularios de ganancias?
Andrew Orsich el
8
No use Form.CenterToScreen. Ver esta publicación para más detalles.
Artemix
use el método CenterToScreen () en el constructor de la clase de formulario.
webMac

Respuestas:

202

Utilice el método Form.CenterToScreen () .

dzendras
fuente
77
En el sistema con dos monitores, el formulario se centrará en uno que actualmente tenga el cursor. Entonces, el formulario puede saltar repentinamente a otro monitor. Mira la publicación aquí .
Artemix
66
La documentación a la que hace referencia dice "No llame a esto directamente desde su código". aunque no dice por qué.
Stephen Turner
44
La documentación dice usar la propiedad StartPosition del formulario para centrarlo. A mi me funciono.
John Kroetch
Esto funciona, solo tuve que instanciarlo: this.CenterToScreen ();
Laki Politis
También me gustaría saber por qué la documentación dice "No llame a esto directamente desde su código".
Pete
153
  1. Usando la propiedad ventana de

    Seleccione el formulario → vaya a la ventana de propiedades → seleccione "posición de inicio" → seleccione el lugar que desee.

    "

  2. Programáticamente

    Form form1 = new Form(); form1.StartPosition = FormStartPosition.CenterScreen; form1.ShowDialog();

    Nota: No llame directamente a Form.CenterToScreen () desde su código. Lea aquí .

Nayana Adassuriya
fuente
34

Una sola línea:

this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2,
                          (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2);
Harveyt
fuente
Esto demuestra una manera buena de conseguir el centro de ya sea el o 'y' 'x' de forma manual. Necesitaba 'pantalla central', pero solo para la coordenada 'y'.
atconway el
9
¿Por qué Screen.PrimaryScreen? ¿Qué pasa si el formulario está en 'SecondaryScreen'? Deberías usar Screen screen = Screen.FromControl(this);aquí.
Artemix
Utilizo estas técnicas primitivas simplemente porque funciona en .NET Compact Framework 3.5 , y esto también explica por qué no lo uso Screen.FromControl(this)pero lo mantengo PrimaryScreen. (Estoy desarrollando una aplicación bajo restricción de hardware) :-)
Yeo
Ese método está bien si solo está usando una pantalla. Sin embargo, si tiene varios monitores y hace clic en un acceso directo aquí en el monitor izquierdo, realmente no desea que se abra en el derecho. La propiedad StartPosition maneja eso por usted.
Trevor_G
Esto no es [por monitor DPI con conocimiento].
vt.
28

En formularios Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen;

En WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Eso es todo lo que tienes que hacer...

Saimon
fuente
La mejor respuesta para la situación. No quería establecer la posición, pero restablecerla una vez que volviera al formulario. Esto es perfecto.
KangarooRIOT
16

Si desea centrar sus ventanas durante el tiempo de ejecución, use el siguiente código, cópielo en su aplicación:

protected void ReallyCenterToScreen()
{
  Screen screen = Screen.FromControl(this);

  Rectangle workingArea = screen.WorkingArea;
  this.Location = new Point() {
    X = Math.Max(workingArea.X, workingArea.X + (workingArea.Width - this.Width) / 2),
    Y = Math.Max(workingArea.Y, workingArea.Y + (workingArea.Height - this.Height) / 2)};
}

Y finalmente llame al método anterior para que funcione:

ReallyCenterToScreen();
Sarsur.A
fuente
Esto funciona mejor ya que funcionará incluso si se ejecuta this.Location = Screen.AllScreens[0].WorkingArea.Location;antes, otras respuestas no funcionan en el caso de mover la aplicación cuando se usan varias pantallas.
TK-421
8

 Centrar un formulario en tiempo de ejecución

1. Establezca la siguiente propiedad del formulario:
   -> StartPosition: CenterScreen
   -> WindowState: Normal

Esto centrará el formulario en tiempo de ejecución, pero si el tamaño del formulario es mayor de lo esperado, realice el segundo paso.

2. Agregar tamaño personalizado después de InitializeComponent ();

public Form1()
{
    InitializeComponent();
    this.Size = new Size(800, 600);
}
Faiz Siddiqui
fuente
6
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace centrewindow
{
    public partial class Form1 : Form
    {
        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }

        [DllImport("user32.dll")]
        public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags);

        [DllImport("user32.dll")]
        public static extern bool GetWindowRect(HandleRef hwnd, out RECT lpRect);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CentreWindow(Handle, GetMonitorDimensions());
        }

        private void CentreWindow(IntPtr handle, Size monitorDimensions)
        {
            RECT rect;
            GetWindowRect(new HandleRef(this, handle), out rect);

            var x1Pos = monitorDimensions.Width/2 - (rect.Right - rect.Left)/2;
            var x2Pos = rect.Right - rect.Left;
            var y1Pos = monitorDimensions.Height/2 - (rect.Bottom - rect.Top)/2;
            var y2Pos = rect.Bottom - rect.Top;

            SetWindowPos(handle, 0, x1Pos, y1Pos, x2Pos, y2Pos, 0);
        }

        private Size GetMonitorDimensions()
        {
            return SystemInformation.PrimaryMonitorSize;
        }
    }
}

Centra cualquier ventana que pueda manejar

Rob
fuente
3

Utilizar este:

this.CenterToScreen();  // This will take care of the current form
UJS
fuente
1
-100. " No llame a CenterToScreen () directamente desde su código. En su lugar, establezca la propiedad StartPosition en CenterScreen". msdn.microsoft.com/en-us/library/…
A876
2

Use la propiedad Ubicación del formulario. Ajústelo al punto superior izquierdo deseado

x = (desktop_width - form_witdh) / 2 deseado

deseado y = (desktop_height - from_height) / 2

Sarwar Erfan
fuente
1

Puede usar Screen.PrimaryScreen.Boundspara recuperar el tamaño del monitor principal (o inspeccionar el Screenobjeto para recuperar todos los monitores). Úselos con MyForms.Boundspara averiguar dónde colocar su formulario.

C.Evenhuis
fuente
1

Podría no ser completamente relevante para la pregunta. Pero tal vez pueda ayudar a alguien.

La pantalla central no funciona para mí. La razón fue que estaba agregando controles dinámicamente al formulario. Técnicamente cuando estaba centrado era correcto, basado en el formulario antes de agregar los controles.

Así que aquí estaba mi solución. (Debería funcionar con ambos escenarios)

int x = Screen.PrimaryScreen.Bounds.Width - this.PreferredSize.Width;
int y = Screen.PrimaryScreen.Bounds.Height - this.PreferredSize.Height;

this.Location = new Point(x / 2, y / 2);

Entonces notará que estoy usando "PreferredSize" en lugar de usar simplemente Altura / Ancho. El tamaño preferido mantendrá el valor del formulario después de agregar los controles. Donde la altura / ancho no lo harán.

Espero que esto ayude a alguien .

Salud

De Wet Ellis
fuente
0

En el caso de monitores múltiples y si prefiere centrarse en el monitor / pantalla correctos, puede probar estas líneas:

// Save values for future(for example, to center a form on next launch)
int screen_x = Screen.FromControl(Form).WorkingArea.X;
int screen_y = Screen.FromControl(Form).WorkingArea.Y;

// Move it and center using correct screen/monitor
Form.Left = screen_x;
Form.Top = screen_y;
Form.Left += (Screen.FromControl(Form).WorkingArea.Width - Form.Width) / 2;
Form.Top += (Screen.FromControl(Form).WorkingArea.Height - Form.Height) / 2;
F8ER
fuente