Comment centrer une fenêtre à l'écran en C #?

129

J'ai besoin d'un moyen de centrer la fenêtre actuelle. Ainsi, par exemple, si un utilisateur appuie sur un bouton, je veux que la fenêtre se centre à l'écran. Je sais que vous pouvez utiliser la propriété startposition, mais je ne peux pas trouver un moyen de l'utiliser autre que lorsque l'application démarre pour la première fois. Alors, comment centrer le formulaire sur l'écran?

Sean
la source
Je suppose que vous utilisez des formulaires gagnants?
Andrew Orsich
8
N'utilisez pas Form.CenterToScreen. Voir cet article pour plus de détails.
Artemix
utilisez la méthode CenterToScreen () dans le constructeur de la classe de formulaire.
webMac

Réponses:

202

Utilisez la méthode Form.CenterToScreen () .

dzendras
la source
7
Sur un système avec deux moniteurs, le formulaire sera centré sur celui qui a actuellement le curseur. Ainsi, le formulaire peut soudainement passer à un autre moniteur. Voir le message ici .
Artemix
6
La documentation à laquelle vous faites référence dit "Ne l'appelez pas directement à partir de votre code". bien qu'il ne dise pas pourquoi.
Stephen Turner
4
La documentation dit utiliser la propriété StartPosition du formulaire pour le centrer. Cela a fonctionné pour moi.
John Kroetch
Cela fonctionne, je devais juste l'instancier: this.CenterToScreen ();
Laki Politis
J'aimerais également savoir pourquoi la documentation dit "N'appelez pas cela directement à partir de votre code".
Pete
153
  1. Utilisation de la fenêtre Propriétés

    Sélectionnez le formulaire → allez dans la fenêtre des propriétés → sélectionnez "position de départ" → sélectionnez l'endroit que vous voulez.

    "

  2. Programmation

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

    Remarque: n'appelez pas directement Form.CenterToScreen () à partir de votre code. Lisez ici .

Nayana Adassuriya
la source
34

Une seule ligne:

this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2,
                          (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2);
Harveyt
la source
Cela montre un bon moyen d'obtenir le centre de soit le « x » ou « y » manuellement. J'avais besoin d'un «écran central», mais uniquement pour la coordonnée «y».
atconway
9
Pourquoi Screen.PrimaryScreen? Que faire si le formulaire est sur «SecondaryScreen»? Vous devriez utiliser Screen screen = Screen.FromControl(this);ici.
Artemix
J'utilise ces techniques primitives simplement parce qu'elles fonctionnent sur .NET Compact Framework 3.5 , et cela explique également pourquoi je ne les utilise pas Screen.FromControl(this)mais je les garde PrimaryScreen. (Je développe une application sous contrainte matérielle) :-)
Yeo
Cette méthode est correcte si vous n'utilisez qu'un seul écran. Cependant, si vous avez plusieurs moniteurs et cliquez sur un raccourci ici sur le moniteur de gauche, vous ne voulez pas vraiment qu'il s'ouvre sur celui de droite. La propriété StartPosition gère cela pour vous.
Trevor_G
Ce n'est pas [compatible DPI par moniteur].
vt.
28

Dans Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen;

Dans WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

C'est tout ce que vous avez à faire ...

Saimon
la source
Meilleure réponse à la situation. Je ne voulais pas définir la position mais la faire réinitialiser une fois que je suis revenu au formulaire. C'est parfait.
KangarooRIOT
16

Si vous souhaitez centrer vos fenêtres pendant l'exécution, utilisez le code ci-dessous, copiez-le dans votre application:

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

Et enfin, appelez la méthode ci-dessus pour la faire fonctionner:

ReallyCenterToScreen();
Sarsur.A
la source
Cela fonctionne mieux car cela fonctionnera même si vous exécutez this.Location = Screen.AllScreens[0].WorkingArea.Location;avant, les autres réponses ne fonctionnent pas dans le cas d'un déplacement d'application lors de l'utilisation de plusieurs écrans.
TK-421 du
8

 Centrage d'un formulaire au runtime

1.Définissez la propriété suivante de Form:
   -> StartPosition: CenterScreen
   -> WindowState: Normal

Cela centrera le formulaire au moment de l'exécution, mais si la taille du formulaire est plus grande que prévu, effectuez la deuxième étape.

2. Ajoutez une taille personnalisée après InitializeComponent ();

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

Centre toutes les fenêtres dont vous pouvez vous servir

Rob
la source
3

Utilisez ceci:

this.CenterToScreen();  // This will take care of the current form
UJS
la source
1
-100. « N'appelez pas CenterToScreen () directement à partir de votre code. À la place, définissez la propriété StartPosition sur CenterScreen.» msdn.microsoft.com/en-us/library/…
A876
2

Utilisez la propriété Location du formulaire. Réglez-le sur le point supérieur gauche souhaité

désiré x = (largeur_du_ bureau - form_witdh) / 2

souhaité y = (desktop_height - from_height) / 2

Sarwar Erfan
la source
1

Vous pouvez utiliser le Screen.PrimaryScreen.Boundspour récupérer la taille du moniteur principal (ou inspecter l' Screenobjet pour récupérer tous les moniteurs). Utilisez ceux avec MyForms.Boundspour savoir où placer votre formulaire.

C.Evenhuis
la source
1

Peut-être pas tout à fait pertinent pour la question. Mais peut-être peut aider quelqu'un.

L'écran central ne fonctionne pas pour moi. La raison était que j'ajoutais des contrôles dynamiquement au formulaire. Techniquement, quand il était centré, il était correct, basé sur le formulaire avant d'ajouter les contrôles.

Voici donc ma solution. (Devrait fonctionner avec les deux scénarios)

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

Vous remarquerez donc que j'utilise "PreferredSize" au lieu de simplement utiliser Hauteur / Largeur. La taille préférée contiendra la valeur du formulaire après l'ajout des contrôles. Là où la hauteur / largeur ne le sera pas.

J'espère que cela aide quelqu'un.

À votre santé

De Wet Ellis
la source
0

En cas de multi-moniteur et si vous préférez vous centrer sur le bon moniteur / écran, vous voudrez peut-être essayer ces lignes:

// 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
la source