2011-01-05 24 views
93

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 puedes usar la propiedad de inicio de la posición, pero no puedo encontrar una manera de usarlo más que cuando la aplicación se inicia por primera vez. Entonces, ¿cómo centrar el formulario en la pantalla?¿Cómo centro una ventana en la pantalla en C#?

+0

supongo que el uso de formas de ganar? –

+0

Sí, eso es correcto – Sean

+7

No use Form.CenterToScreen. Ver [esta publicación] (http://stackoverflow.com/questions/6837463/how-come-centertoscreen-method-centers-the-form-on-the-screen-where-the-cursor-i/6837499#6837499) para detalles. – Artemix

Respuesta

149

Uso Form.CenterToScreen() método.

+7

Wow, ¿me estás tomando el pelo? Todos los demás saltamos a través de los aros tratando de descubrirlo. Esto funcionó perfecto. ¡Gracias! – Sean

+9

@Sean: siempre conozca su biblioteca. Hay una razón por la que llevas todo ese equipaje. ;-) –

+3

En el sistema con dos monitores, el formulario se centrará en uno que actualmente tenga el cursor. Entonces, la forma puede repentinamente saltar a otro monitor. Ver la publicación [aquí] (http://stackoverflow.com/questions/6837463/how-come-centertoscreen-method-centers-the-form-on-the-screen-where-the-cursor-i/6837499#6837499) – Artemix

1

Puede usar el Screen.PrimaryScreen.Bounds para recuperar el tamaño del monitor principal (o inspeccionar el objeto Screen para recuperar todos los monitores). Use aquellos con MyForms.Bounds para averiguar dónde colocar su formulario.

2

Utilice la propiedad Ubicación del formulario. Ajuste a la parte superior punto deseado izquierda

deseada x = (desktop_width - form_witdh)/2

deseada y = (desktop_height - from_height)/2

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

Centros cualquier ventana se puede obtener el identificador de

25

Una sola línea:

this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width)/2, 
          (Screen.PrimaryScreen.WorkingArea.Height - this.Height)/2); 
+0

Esto muestra una buena forma de obtener el centro * de * la 'x' o la 'y' manualmente. Necesitaba 'pantalla central', pero solo para la coordenada 'y'. – atconway

+6

¿Por qué Screen.PrimaryScreen? ¿Qué pasa si el formulario está en 'SecondaryScreen'? Debería usar 'Pantalla de pantalla = Pantalla.DesdeControl (esto); 'aquí. – Artemix

+0

Utilizo estas técnicas primitivas simplemente porque funciona en ** .NET Compact Framework 3.5 **, y esto también explica por qué no uso 'Screen.FromControl (this)' pero lo mantengo en 'PrimaryScreen'. (Estoy desarrollando una aplicación bajo restricción de hardware) :-) – Yeo

22

En Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen; 

En WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen; 

Eso es todo lo que tiene que hacer ...

+0

Perfecto mi amigo. –

+0

La mejor respuesta para la situación. No quería establecer la posición, pero para que se restablezca una vez que regrese al formulario. Esto es perfecto. – KangarooRIOT

14

Si desea centrar las ventanas durante el tiempo de ejecución de un código a continuación, copiarlo 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 llamamos al método anterior para obtener que trabajo:

ReallyCenterToScreen(); 
93
  1. Uso de la propiedad ventana

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

    "

  2. programación

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

    Nota: No llame directamente a Form.CenterToScreen() desde su código. Lee here.

+2

Esta debería ser la respuesta aceptada. – user2481095

7

  Centrar una forma en tiempo de ejecución

1.Establecer siguiente propiedad de la Forma:
      -> StartPosition: CenterScreen
      -> WindowState: Largo

Esto centrará el formulario en tiempo de ejecución, pero si el tamaño de la forma es más grande de lo esperado, lo segundo paso.

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

public Form1() 
{ 
    InitializeComponent(); 
    this.Size = new Size(800, 600); 
} 
+0

Es bueno que mencione WindowState Normal. Gracias. –

1

Utilice esta:

this.CenterToScreen(); // This will take care of the current form 
+1

-100. "** No ** llame a CenterToScreen() directamente desde su código. En su lugar, establezca la propiedad StartPosition en CenterScreen." http://msdn.microsoft.com/en-us/library/system.windows.forms.form.centertoscreen.aspx – A876

Cuestiones relacionadas