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?

Sean
źródło
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 () .

dzendras
źródło
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 .

Nayana Adassuriya
źródło
37

Pojedyncza linia:

this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2,
                          (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2);
harveyt
źródło
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ć ...

Saimon
źródło
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();
Sarsur.A.
źródło
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);
}
Faiz Siddiqui
źródło
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ę

Rob
źródło
3

Użyj tego:

this.CenterToScreen();  // This will take care of the current form
UJS
źródło
1
-100. „ Nie wywołuj CenterToScreen () bezpośrednio z kodu. Zamiast tego ustaw właściwość StartPosition na CenterScreen”. msdn.microsoft.com/en-us/library/ ...
A876
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

Sarwar Erfan
źródło
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.

C.Evenhuis
źródło
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

De Wet Ellis
źródło
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;
F8ER
źródło