it-swarm.dev

Come posso centrare una finestra sullo schermo in C #?

Ho bisogno di un modo per centrare la finestra corrente. Ad esempio, se un utente preme un pulsante, voglio che la finestra si concentri sullo schermo. So che è possibile utilizzare la proprietà di avvio, ma non riesco a capire un modo per usarlo diverso da quando l'applicazione si avvia per la prima volta. Quindi come posso centrare il modulo sullo schermo?

109
Sean

Utilizzare Form.CenterToScreen () metodo.

180
dzendras
  1. Uso della finestra Proprietà

    Seleziona modulo → vai alla finestra delle proprietà → seleziona "start position" → seleziona il luogo che desideri.

    "

  2. Programmazione

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

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

125

Una singola riga:

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

In Windows Form:

this.StartPosition = FormStartPosition.CenterScreen;

In WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Questo è tutto quello che devi fare ...

26
Saimon

Se vuoi centrare le finestre 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();
15
Sarsur.A

Centrare un modulo in runtime

1.Impostare le seguenti proprietà di Form:
-> StartPosition: CenterScreen
-> WindowState: Normal

Questo centrerà il modulo in fase di runtime, ma se la dimensione del modulo è maggiore di quanto previsto, fai il secondo passo.

2. Aggiungi dimensioni personalizzate dopo InitializeComponent ();

public Form1()
{
    InitializeComponent();
    this.Size = new Size(800, 600);
}
8
Faiz Siddiqui
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 che puoi ottenere

6
Rob

Usa questo:

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

Usa 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

2
Sarwar Erfan

È possibile utilizzare Screen.PrimaryScreen.Bounds per recuperare la dimensione del monitor principale (o ispezionare l'oggetto Screen per recuperare tutti i monitor). Usa quelli con MyForms.Bounds per capire dove posizionare il tuo modulo.

1
C.Evenhuis

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

Centro schermo non del lavoro di cui sopra per me. Il motivo era che stavo aggiungendo controlli dinamicamente al modulo. Tecnicamente quando centrato era corretto, basato sul 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 Height/Width. La dimensione preferita manterrà il valore del modulo dopo aver aggiunto i controlli. Dove Altezza/Larghezza no. 

Spero che questo aiuti qualcuno. 

Saluti 

0
De Wet Ellis

In caso di monitor multi e Se preferisci centrare sul monitor/schermo corretto, potresti 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;
0
V.7