Come posso centrare una finestra sullo schermo in C #?


129

Ho bisogno di un modo per centrare la finestra corrente. Ad esempio, se un utente preme un pulsante, voglio che la finestra si centri sullo schermo. So che puoi usare la proprietà startposition, ma non riesco a capire un modo per usarlo diverso da quando l'applicazione viene avviata per la prima volta. Quindi, come posso centrare il modulo sullo schermo?


Suppongo che tu usi i moduli di vincita?
Andrew Orsich,

8
Non utilizzare Form.CenterToScreen. Vedi questo post per i dettagli.
Artemix,

utilizzare il metodo CenterToScreen () nel costruttore della classe form.
webMac

Risposte:


202

Utilizzare il metodo Form.CenterToScreen () .


7
Sul sistema con due monitor il modulo sarà centrato su uno che ha attualmente il cursore. Pertanto, il modulo potrebbe improvvisamente passare ad un altro monitor. Vedi il post qui .
Artemix,

6
La documentazione a cui fai riferimento dice "Non chiamarlo direttamente dal tuo codice". anche se non dice perché.
Stephen Turner,

4
La documentazione dice che usa la proprietà StartPosition del modulo per centrarla. Ha funzionato per me.
John Kroetch,

Funziona, ho dovuto solo istanziarlo: this.CenterToScreen ();
Laki Politis,

Vorrei anche sapere perché la documentazione dice "Non chiamarlo direttamente dal tuo codice".
Pete

153
  1. Utilizzando la finestra Proprietà

    Seleziona il modulo → vai alla finestra delle proprietà → seleziona "posizione iniziale" → seleziona quello che desideri.

    "

  2. programmazione

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

    Nota: non chiamare direttamente Form.CenterToScreen () dal proprio codice. Leggi qui .


34

Una sola riga:

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

Questo mostra un buon modo di ottenere il centro sia la 'x' o 'y' manualmente. Avevo bisogno di "schermo centrale", ma solo per le coordinate "y".
atterraggio

9
Perché Screen.PrimaryScreen? Che cosa succede se il modulo è su "SecondaryScreen"? Dovresti usare Screen screen = Screen.FromControl(this);qui.
Artemix,

Uso queste tecniche primitive semplicemente perché funziona su .NET Compact Framework 3.5 , e questo spiega anche perché non lo uso Screen.FromControl(this)ma lo mantengo PrimaryScreen. (Sto sviluppando un'applicazione sotto vincolo hardware) :-)
Yeo,

Questo metodo è ok se stai usando solo una schermata. Tuttavia, se hai più monitor e fai clic su un collegamento qui sul monitor di sinistra, non vuoi che si apra su quello di destra. La proprietà StartPosition lo gestisce per te.
Trevor_G,

Questo non è [per DPI monitor a conoscenza].
vt.

28

In Windows Form:

this.StartPosition = FormStartPosition.CenterScreen;

Nel WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Questo è tutto ciò che devi fare ...


La migliore risposta per la situazione. Non volevo impostare la posizione ma ripristinarla una volta tornato al modulo. Questo è perfetto.
CanguroRIOT

16

Se vuoi centrare Windows durante il runtime usa il codice qui sotto, copialo nella tua applicazione:

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

E infine chiama il metodo sopra per farlo funzionare:

ReallyCenterToScreen();

Funziona meglio poiché funzionerà anche se lo esegui this.Location = Screen.AllScreens[0].WorkingArea.Location;prima, altre risposte non funzionano in questo caso di spostare l'app quando si utilizzano più schermi.
TK-421

8

 Centratura di un modulo in fase di esecuzione

1.Impostare la seguente proprietà di Modulo:
   -> StartPosition: CenterScreen
   -> WindowState: Normal

Ciò centrerà il modulo in fase di esecuzione ma se la dimensione del modulo è maggiore del previsto, eseguire il secondo passaggio.

2. Aggiungi dimensioni personalizzate dopo InitializeComponent ();

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

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 qualsiasi finestra di cui puoi occuparti


3

Usa questo:

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

1
-100. " Non chiamare CenterToScreen () direttamente dal tuo codice. Invece, imposta la proprietà StartPosition su CenterScreen." msdn.microsoft.com/en-us/library/...
A876

2

Utilizzare la proprietà Location del modulo. Impostalo sul punto in alto a sinistra desiderato

desiderato x = (desktop_width - form_witdh) / 2

desiderato y = (desktop_height - from_height) / 2


1

È possibile utilizzare il Screen.PrimaryScreen.Boundsper recuperare le dimensioni del monitor principale (o ispezionare l' Screenoggetto per recuperare tutti i monitor). Usa quelli con MyForms.Boundsper capire dove posizionare il modulo.


1

Potrebbe non essere completamente pertinente alla domanda. Ma forse può aiutare qualcuno.

Centro schermo non del lavoro sopra per me. Il motivo era che stavo aggiungendo i controlli in modo dinamico al modulo. Tecnicamente quando era centrato era corretto, in base al modulo prima di aggiungere i controlli.

Quindi ecco la mia soluzione. (Dovrebbe funzionare con entrambi gli scenari)

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

Quindi noterai che sto usando "PreferredSize" invece di usare solo Altezza / Larghezza. La dimensione preferita conterrà il valore del modulo dopo aver aggiunto i controlli. Dove altezza / larghezza non lo faranno.

Spero che questo aiuti qualcuno.

Saluti


0

In caso di multi monitor e Se si preferisce centrare il monitor / schermo corretto, è possibile provare queste linee:

// 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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.