Como centralizo uma janela na tela em C #?

129

Eu preciso de uma maneira de centralizar a janela atual. Por exemplo, se um usuário aperta um botão, quero que a janela se centralize na tela. Sei que você pode usar a propriedade startposition, mas não consigo descobrir uma maneira de usá-la, exceto quando o aplicativo é iniciado pela primeira vez. Então, como centralizo o formulário na tela?

Sean
fonte
Suponho que você está usando formulários de vitória?
Andrew Orsich
8
Não use Form.CenterToScreen. Veja este post para detalhes.
Artemix
use o método CenterToScreen () no construtor da classe de formulário.
WebMac 28/0318

Respostas:

202

Use o método Form.CenterToScreen () .

dzendras
fonte
7
No sistema com dois monitores, o formulário será centralizado em um que atualmente tenha o cursor. Portanto, o formulário pode saltar repentinamente para outro monitor. Veja o post aqui .
Artemix
6
A documentação que você faz referência diz "Não chame isso diretamente do seu código". embora não diga o porquê.
Stephen Turner
4
A documentação diz que use a propriedade StartPosition do formulário para centralizá-lo. Funcionou para mim.
precisa saber é o seguinte
Isso funciona, eu apenas tive que instanciar: this.CenterToScreen ();
Laki Politis
Também gostaria de saber por que a documentação diz "Não chame isso diretamente do seu código".
Pete
153
  1. Usando a janela Propriedade

    Selecione o formulário → vá para a janela de propriedades → selecione "posição inicial" → selecione o local que desejar.

    "

  2. Programaticamente

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

    Nota: Não chame diretamente Form.CenterToScreen () a partir do seu código. Leia aqui .

Nayana Adassuriya
fonte
34

Uma única linha:

this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2,
                          (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2);
Harveyt
fonte
Isso mostra uma boa maneira de obter o centro de ambos o 'x' ou 'y' manualmente. Eu precisava da 'tela central', mas apenas para a coordenada 'y'.
atconway
9
Por que Screen.PrimaryScreen? E se o formulário estiver em 'SecondaryScreen'? Você deve usar Screen screen = Screen.FromControl(this);aqui.
Artemix
Eu uso essas técnicas primitivas simplesmente porque funciona no .NET Compact Framework 3.5 e isso também explica por que não uso, Screen.FromControl(this)mas continuo usando PrimaryScreen. (Eu estou desenvolvendo uma aplicação sob restrição hardware) :-)
Yeo
Esse método está ok se você estiver usando apenas uma tela. No entanto, se você tiver vários monitores e clicar em um atalho aqui no monitor esquerdo, não deseja que ele seja aberto no caminho certo. A propriedade StartPosition lida com isso para você.
Trevor_G
Isso não é [por monitor com reconhecimento de DPI].
vt.
28

No Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen;

No WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

É tudo o que você precisa fazer ...

Saimon
fonte
Melhor resposta para a situação. Eu não queria definir a posição, mas redefini-la quando voltasse ao formulário. Isto é perfeito.
KangarooRIOT
16

Se você deseja centralizar suas janelas durante o tempo de execução, use o código abaixo, copie-o para o seu aplicativo:

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, finalmente, chame o método acima para fazê-lo funcionar:

ReallyCenterToScreen();
Sarsur.A
fonte
Isso funciona melhor, pois funcionará mesmo que você execute this.Location = Screen.AllScreens[0].WorkingArea.Location;antes. Outras respostas não funcionam no caso de mover o aplicativo ao usar várias telas.
TK-421
8

 Centralizando um formulário no tempo de execução    1. Defina a

seguinte propriedade do Form:
-> StartPosition: CenterScreen
   -> WindowState: Normal

Isso centralizará o formulário no tempo de execução, mas se o tamanho do formulário for maior que o esperado, execute o segundo passo.

2. Adicione tamanho personalizado após InitializeComponent ();

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

Centraliza qualquer janela na qual você possa controlar

Rob
fonte
3

Usa isto:

this.CenterToScreen();  // This will take care of the current form
UJS
fonte
1
-100. " Não chame CenterToScreen () diretamente do seu código. Em vez disso, defina a propriedade StartPosition como CenterScreen." msdn.microsoft.com/en-us/library/…
A876
2

Use a propriedade Location do formulário. Coloque-o no ponto superior esquerdo desejado

x desejado (largura da área de trabalho - form_witdh) / 2

desejado y = (altura da mesa - da altura) / 2

Sarwar Erfan
fonte
1

Você pode usar o Screen.PrimaryScreen.Boundspara recuperar o tamanho do monitor primário (ou inspecionar o Screenobjeto para recuperar todos os monitores). Use aqueles com MyForms.Boundspara descobrir onde colocar seu formulário.

C.Evenhuis
fonte
1

Pode não ser completamente relevante para a questão. Mas talvez possa ajudar alguém.

A tela central não funciona acima para mim. A razão era que eu estava adicionando controles dinamicamente ao formulário. Tecnicamente, quando centralizado, estava correto, com base no formulário antes de adicionar os controles.

Então aqui estava a minha solução. (Deve funcionar com os dois cenários)

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

Então, você notará que estou usando "PreferredSize" em vez de apenas Altura / Largura. O tamanho preferencial manterá o valor do formulário após adicionar os controles. Onde Altura / Largura não.

Espero que isso ajude alguém.

Felicidades

De Wet Ellis
fonte
0

No caso de vários monitores e Se você preferir centrar-se no monitor / tela correto, poderá tentar estas linhas:

// 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
fonte