Jak wyśrodkować okno na ekranie w C #?


132

Potrzebuję sposobu na wyśrodkowanie bieżącego okna. Na przykład, jeśli użytkownik naciśnie przycisk, chcę, aby okno wyśrodkowało się na ekranie. Wiem, że możesz użyć właściwości startposition, ale nie mogę znaleźć innego sposobu na jej użycie niż podczas pierwszego uruchomienia aplikacji. Jak więc wyśrodkować formularz na ekranie?


Przypuszczam, że używasz formularzy wygrywających?
Andrew Orsich,

8
Nie używaj Form.CenterToScreen. Zobacz ten post, aby uzyskać szczegółowe informacje.
Artemix,

użyj metody CenterToScreen () w konstruktorze klasy formularza.
webMac

Odpowiedzi:


207

Użyj metody Form.CenterToScreen () .


7
W systemie z dwoma monitorami formularz będzie wyśrodkowany na tym, na którym aktualnie znajduje się kursor. Tak więc formularz może nagle przejść do innego monitora. Zobacz post tutaj .
Artemix,

6
Dokumentacja, do której się odnosisz, mówi: „Nie wywołuj tego bezpośrednio z kodu”. chociaż nie mówi dlaczego.
Stephen Turner

4
Dokumentacja mówi, że do wyśrodkowania go należy użyć właściwości StartPosition formularza. U mnie to zadziałało.
John Kroetch

To działa, po prostu musiałem go utworzyć: this.CenterToScreen ();
Laki Politis

Chciałbym również wiedzieć, dlaczego w dokumentacji jest napisane „Nie wywołuj tego bezpośrednio z kodu”.
Pete

157
  1. Korzystanie z okna Właściwości

    Wybierz formularz → przejdź do okna właściwości → wybierz „pozycję początkową” → wybierz dowolne miejsce.

    "

  2. Programowo

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

    Uwaga: nie wywołuj Form.CenterToScreen () bezpośrednio z kodu. Przeczytaj tutaj .


37

Pojedyncza linia:

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

Wskazuje to dobry sposób na uzyskanie środka albo „X” lub „Y” ręcznie. Potrzebowałem „środkowego ekranu”, ale tylko dla współrzędnej „y”.
atconway

9
Dlaczego Screen.PrimaryScreen? A co, jeśli formularz jest na „SecondaryScreen”? Powinieneś użyć Screen screen = Screen.FromControl(this);tutaj.
Artemix,

Używam tej prymitywnej techniki tylko dlatego, że działa na .NET Compact Framework 3.5 , a to również wyjaśnia, dlaczego go nie używam, Screen.FromControl(this)ale trzymam PrimaryScreen. (Rozwijam aplikację pod ograniczeniami sprzętowymi) :-)
Yeo

Ta metoda jest dobra, jeśli używasz tylko jednego ekranu. Jeśli jednak masz wiele monitorów i klikniesz skrót tutaj na lewym monitorze, tak naprawdę nie chcesz, aby otwierał się na prawym. Właściwość StartPosition obsługuje to za Ciebie.
Trevor_G,

To nie jest [zależne od DPI monitora].
.

29

W Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen;

W WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

To wszystko, co musisz zrobić ...


Najlepsza odpowiedź na tę sytuację. Nie chciałem ustawiać pozycji, ale żeby ją zresetować po powrocie do formy. To jest doskonałe.
KangarooRIOT

16

Jeśli chcesz wyśrodkować okna podczas działania, użyj poniższego kodu, skopiuj go do swojej aplikacji:

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

Na koniec wywołaj powyższą metodę, aby działała:

ReallyCenterToScreen();

Działa to najlepiej, ponieważ zadziała nawet jeśli uruchomisz this.Location = Screen.AllScreens[0].WorkingArea.Location;go wcześniej, inne odpowiedzi nie działają w przypadku przenoszenia aplikacji podczas korzystania z wielu ekranów.
TK-421

8

 Wyśrodkowanie formularza w środowisku wykonawczym 1.

Ustaw następującą właściwość Form:
   -> StartPosition: CenterScreen
   -> WindowState: Normal

Spowoduje to wyśrodkowanie formularza w czasie wykonywania, ale jeśli rozmiar formularza jest większy niż oczekiwany, wykonaj drugi krok.

2. Dodaj rozmiar niestandardowy po 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;
        }
    }
}

Centruje każde okno, do którego można dostać klamkę



2

Użyj właściwości Location formularza. Ustaw go w żądanym lewym górnym punkcie

pożądane x = (szerokość_pulpitu - form_witdh) / 2

pożądany y = (wysokość_bloku - wysokość_z_) / 2


1

Możesz użyć, Screen.PrimaryScreen.Boundsaby pobrać rozmiar monitora podstawowego (lub sprawdzić Screenobiekt, aby pobrać wszystkie monitory). Użyj tych z, MyForms.Boundsaby dowiedzieć się, gdzie umieścić formularz.


1

Może nie być całkowicie adekwatne do pytania. Ale może może komuś pomóc.

Środkowy ekran nie działa dla mnie. Powodem było to, że dynamicznie dodawałem kontrolki do formularza. Technicznie rzecz biorąc, kiedy to wyśrodkowane, było poprawne, na podstawie formularza przed dodaniem kontrolek.

Oto moje rozwiązanie. (Powinien działać w obu scenariuszach)

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

Zauważysz więc, że używam „PreferredSize” zamiast tylko wysokości / szerokości. Preferowany rozmiar będzie przechowywał wartość formularza po dodaniu kontrolek. Gdzie nie ma wysokości / szerokości.

Mam nadzieję, że to komuś pomoże.

Twoje zdrowie


0

W przypadku wielu monitorów i jeśli wolisz wyśrodkować na odpowiednim monitorze / ekranie, możesz wypróbować następujące linie:

// 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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.