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?


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 () .


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 .


34

Satu baris:

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

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 ...


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

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

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


3

Gunakan ini:

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

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


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.


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


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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.