Wie zentriere ich ein Fenster auf dem Bildschirm in C #?


128

Ich brauche eine Möglichkeit, das aktuelle Fenster zu zentrieren. Wenn ein Benutzer beispielsweise eine Taste drückt, soll sich das Fenster auf dem Bildschirm zentrieren. Ich weiß, dass Sie die Eigenschaft startposition verwenden können, aber ich kann keine andere Möglichkeit finden, diese zu verwenden, als beim ersten Start der Anwendung. Wie zentriere ich das Formular auf dem Bildschirm?


Ich nehme an, Sie verwenden Gewinnformulare?
Andrew Orsich

8
Verwenden Sie Form.CenterToScreen nicht. Siehe diesen Beitrag für Details.
Artemix

Verwenden Sie die CenterToScreen () -Methode im Konstruktor der Formularklasse.
WebMac

Antworten:


201

Verwenden Sie die Form.CenterToScreen () -Methode.


7
Bei einem System mit zwei Monitoren wird das Formular auf einem zentriert, auf dem sich derzeit der Cursor befindet. Das Formular kann also plötzlich zu einem anderen Monitor springen. Siehe den Beitrag hier .
Artemix

6
In der Dokumentation, auf die Sie verweisen, heißt es: "Rufen Sie dies nicht direkt aus Ihrem Code auf." obwohl es nicht sagt warum.
Stephen Turner

4
In der Dokumentation heißt es, dass Sie die StartPosition-Eigenschaft des Formulars verwenden, um es zu zentrieren. Es hat bei mir funktioniert.
John Kroetch

Das funktioniert, ich musste es nur instanziieren: this.CenterToScreen ();
Laki Politis

Ich würde auch gerne wissen, warum in der Dokumentation steht "Rufen Sie dies nicht direkt aus Ihrem Code auf."
Pete

153
  1. Mit Hilfe der Objektfenster

    Wählen Sie das Formular aus → Gehen Sie zum Eigenschaftenfenster → Wählen Sie "Startposition" → Wählen Sie den gewünschten Ort aus.

    ""

  2. Programmatisch

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

    Hinweis: Rufen Sie Form.CenterToScreen () nicht direkt aus Ihrem Code auf. Lesen Sie hier .


34

Eine einzelne Zeile:

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

Dies zeigt eine gute Möglichkeit , das Zentrum des Erhaltens entweder das ‚x‘ oder ‚y‘ manuell. Ich brauchte 'Mittelbildschirm', aber nur für die 'y'-Koordinate.
Atconway

9
Warum Screen.PrimaryScreen? Was ist, wenn sich das Formular auf "SecondaryScreen" befindet? Sie sollten Screen screen = Screen.FromControl(this);hier verwenden.
Artemix

Ich verwende diese primitiven Techniken einfach, weil sie unter .NET Compact Framework 3.5 funktionieren , und dies erklärt auch, warum ich sie nicht verwende, Screen.FromControl(this)sondern behalte PrimaryScreen. (Ich entwickle eine Anwendung unter Hardware-Einschränkungen) :-)
Yeo

Diese Methode ist in Ordnung, wenn Sie nur einen Bildschirm verwenden. Wenn Sie jedoch mehrere Monitore haben und hier auf dem linken Monitor auf eine Verknüpfung klicken, möchten Sie nicht, dass diese auf dem rechten Monitor geöffnet wird. Die StartPosition-Eigenschaft übernimmt dies für Sie.
Trevor_G

Dies ist nicht [pro Monitor DPI-fähig].
vt.

28

In Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen;

In WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Das ist alles was du tun musst ...


Beste Antwort für die Situation. Ich wollte die Position nicht festlegen, sondern zurücksetzen lassen, sobald ich zum Formular zurückgekehrt bin. Dies ist perfekt.
KangarooRIOT

16

Wenn Sie Ihre Fenster zur Laufzeit zentrieren möchten, verwenden Sie den folgenden Code, und kopieren Sie ihn in Ihre Anwendung:

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

Und schließlich rufen Sie die obige Methode auf, um sie zum Laufen zu bringen:

ReallyCenterToScreen();

Dies funktioniert am besten, da es auch dann funktioniert, wenn Sie es this.Location = Screen.AllScreens[0].WorkingArea.Location;zuvor ausgeführt haben. Andere Antworten funktionieren in einem solchen Fall beim Verschieben der App bei Verwendung mehrerer Bildschirme nicht.
TK-421

8

 Zentrieren eines Formulars zur Laufzeit 1.

Legen Sie die folgende Eigenschaft von Form fest:
   -> StartPosition: CenterScreen
   -> WindowState: Normal

Dadurch wird das Formular zur Laufzeit zentriert. Wenn das Formular jedoch größer als erwartet ist, führen Sie den zweiten Schritt aus.

2. Fügen Sie nach InitializeComponent () eine benutzerdefinierte Größe hinzu.

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

Zentriert jedes Fenster, das Sie in den Griff bekommen können


3

Benutze das:

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

1
-100. „ Nicht anrufen CenterToScreen () direkt aus dem Code. Stattdessen die Startposition Eigenschaft auf Mittenschirm gesetzt.“ msdn.microsoft.com/en-us/library/…
A876

2

Verwenden Sie die Location-Eigenschaft des Formulars. Stellen Sie den gewünschten oberen linken Punkt ein

gewünschtes x = (desktop_width - form_witdh) / 2

gewünschtes y = (desktop_height - from_height) / 2


1

Mit können Sie Screen.PrimaryScreen.Boundsdie Größe des primären Monitors Screenabrufen (oder das Objekt untersuchen, um alle Monitore abzurufen). Verwenden Sie diese mit, MyForms.Boundsum herauszufinden, wo Sie Ihr Formular platzieren sollen.


1

Könnte für die Frage nicht vollständig relevant sein. Aber vielleicht kann jemand helfen.

Center Screen funktioniert nicht für mich. Grund war, dass ich dem Formular dynamisch Steuerelemente hinzufügte. Wenn es zentriert war, war es technisch korrekt, basierend auf dem Formular vor dem Hinzufügen der Steuerelemente.

Also hier war meine Lösung. (Sollte mit beiden Szenarien funktionieren)

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

Sie werden also feststellen, dass ich "PreferredSize" anstelle von "Höhe / Breite" verwende. Die bevorzugte Größe enthält den Wert des Formulars nach dem Hinzufügen der Steuerelemente. Wo Höhe / Breite nicht.

Hoffe das hilft jemandem.

Prost


0

Bei mehreren Monitoren und Wenn Sie sich lieber auf den richtigen Monitor / Bildschirm konzentrieren möchten, können Sie folgende Zeilen ausprobieren:

// 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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.