Bagaimana cara memusatkan jendela pada layar di C #?

129

Saya perlu cara untuk memusatkan jendela saat ini. Jadi misalnya, jika pengguna menekan tombol, saya ingin jendela untuk memusatkan dirinya di layar. Saya tahu Anda bisa menggunakan properti startposition, tapi saya tidak bisa menemukan cara untuk menggunakannya selain ketika aplikasi pertama kali dinyalakan. Jadi bagaimana cara memusatkan formulir di layar?

Sean
sumber
Saya kira Anda menggunakan formulir menang?
Andrew Orsich
8
Jangan gunakan Form.CenterToScreen. Lihat posting ini untuk detailnya.
Artemix
menggunakan metode CenterToScreen () di konstruktor kelas bentuk.
webMac

Jawaban:

202

Gunakan metode Form.CenterToScreen () .

dzendras
sumber
7
Pada sistem dengan dua monitor, formulir akan dipusatkan pada satu yang saat ini memiliki kursor. Jadi, formulir itu mungkin tiba-tiba melompat ke monitor lain. Lihat posting di sini .
Artemix
6
Dokumentasi yang Anda referensi tidak mengatakan "Jangan panggil ini langsung dari kode Anda." meskipun itu tidak mengatakan mengapa.
Stephen Turner
4
Dokumentasi itu mengatakan menggunakan properti StartPosition formulir untuk pusatnya. Ini berhasil untuk saya.
John Kroetch
Ini berfungsi, saya hanya harus instantiate: this.CenterToScreen ();
Laki Politis
Saya juga ingin tahu mengapa dokumentasi mengatakan "Jangan panggil ini langsung dari kode Anda."
Pete
153
  1. Menggunakan jendela Properti

    Pilih formulir → pergi ke jendela properti → pilih "mulai posisi" → pilih apa pun tempat yang Anda inginkan.

    "

  2. Secara terprogram

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

    Catatan: Jangan langsung memanggil Form.CenterToScreen () dari kode Anda. Baca di sini .

Nayana Adassuriya
sumber
34

Satu baris:

this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2,
                          (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2);
Harveyt
sumber
Menunjukkan ini cara yang baik untuk mendapatkan pusat baik 'x' atau 'y' secara manual. Saya membutuhkan 'layar tengah', tetapi hanya untuk koordinat 'y'.
atconway
9
Mengapa Screen.PrimaryScreen? Bagaimana jika formulir ada di 'Layar Sekunder'? Anda harus menggunakannya di Screen screen = Screen.FromControl(this);sini.
Artemix
Saya menggunakan teknik primitif ini hanya karena bekerja pada .NET Compact Framework 3.5 , dan ini juga menjelaskan mengapa saya tidak menggunakan Screen.FromControl(this)tetapi tetap menggunakannya PrimaryScreen. (Saya sedang mengembangkan aplikasi di bawah batasan perangkat keras) :-)
Yeo
Metode itu ok jika Anda hanya menggunakan satu layar. Namun, jika Anda memiliki beberapa monitor dan mengklik pintasan di sini di monitor sebelah kiri, Anda tidak benar-benar ingin membuka di sebelah kanan. Properti StartPosition menanganinya untuk Anda.
Trevor_G
Ini bukan [per monitor DPI sadar].
vt.
28

Dalam Bentuk Windows:

this.StartPosition = FormStartPosition.CenterScreen;

Di WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Itu yang harus Anda lakukan ...

Saimon
sumber
Jawaban terbaik untuk situasi ini. Saya tidak ingin mengatur posisi tetapi untuk mengatur ulang setelah saya kembali ke formulir. Ini sempurna.
KangarooRIOT
16

Jika Anda ingin memusatkan windows Anda selama runtime gunakan kode di bawah ini, salin ke aplikasi Anda:

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

Dan akhirnya panggil metode di atas untuk membuatnya berfungsi:

ReallyCenterToScreen();
Sarsur.A
sumber
Ini berfungsi dengan baik karena akan berfungsi bahkan jika Anda menjalankannya this.Location = Screen.AllScreens[0].WorkingArea.Location;sebelumnya, jawaban lain tidak berfungsi dalam kasus memindahkan aplikasi saat menggunakan beberapa layar.
TK-421
8

 Memusatkan formulir dalam runtime 1.

Set properti properti berikut:
   -> StartPosition: CenterScreen
   -> WindowState: Normal

Ini akan memusatkan formulir saat runtime tetapi jika ukuran formulir lebih besar dari yang diharapkan, lakukan langkah kedua.

2. Tambahkan Ukuran Khusus setelah InitializeComponent ();

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

Pusatkan jendela apa pun yang bisa Anda tangani

Rob
sumber
3

Gunakan ini:

this.CenterToScreen();  // This will take care of the current form
UJS
sumber
1
-100. " Jangan panggil CenterToScreen () langsung dari kode Anda. Sebagai gantinya, atur properti StartPosition ke CenterScreen." msdn.microsoft.com/en-us/library/…
A876
2

Gunakan properti Lokasi dari formulir. Atur ke titik kiri atas yang diinginkan

diinginkan x = (desktop_width - form_witdh) / 2

diinginkan y = (desktop_height - from_height) / 2

Sarwar Erfan
sumber
1

Anda dapat menggunakan Screen.PrimaryScreen.Boundsuntuk mengambil ukuran monitor utama (atau memeriksa Screenobjek untuk mengambil semua monitor). Gunakan orang-orang dengan MyForms.Boundsuntuk mencari tahu di mana harus meletakkan formulir Anda.

C.Evenhuis
sumber
1

Mungkin tidak sepenuhnya relevan dengan pertanyaan. Tapi mungkin bisa membantu seseorang.

Layar Tengah bukan pekerjaan di atas untuk saya. Alasannya adalah saya menambahkan kontrol secara dinamis ke formulir. Secara teknis ketika berpusat itu benar, berdasarkan pada formulir sebelum menambahkan kontrol.

Jadi, inilah solusi saya. (Harus bekerja dengan kedua skenario)

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

Jadi, Anda akan melihat bahwa saya menggunakan "PreferredSize" bukan hanya menggunakan Tinggi / Lebar. Ukuran yang disukai akan menyimpan nilai formulir setelah menambahkan kontrol. Di mana Tinggi / Lebar tidak akan.

Semoga ini bisa membantu seseorang.

Bersulang

De Wet Ellis
sumber
0

Dalam hal multi monitor dan Jika Anda lebih suka memusatkan pada monitor / layar yang benar maka Anda mungkin ingin mencoba baris ini:

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