C # 'da ekrandaki bir pencereyi nasıl ortalayabilirim?


129

Mevcut pencereyi ortalamak için bir yola ihtiyacım var. Örneğin, bir kullanıcı bir düğmeye basarsa, pencerenin kendisini ekranda ortalamasını istiyorum. Startposition özelliğini kullanabileceğinizi biliyorum, ancak bunu uygulamanın ilk başlatıldığı zamandan farklı bir şekilde kullanmanın bir yolunu bulamıyorum. Peki formu ekranda nasıl ortalayabilirim?


Galiba kazanma formları kullanıyorsunuz?
Andrew Orsich

8
Form.CenterToScreen'i kullanmayın. Ayrıntılar için bu gönderiye bakın.
Artemix

form sınıfının yapıcısında CenterToScreen () Yöntemini kullanın.
webMac

Yanıtlar:


203

Form.CenterToScreen () yöntemini kullanın .


7
İki monitörlü sistemde form, halihazırda imleci olan bir monitörde ortalanacaktır. Bu nedenle, form aniden diğer monitöre atlayabilir. Buradaki gönderiye bakın .
Artemix

6
Referans verdiğiniz belgelerde "Bunu doğrudan kodunuzdan arama" diyor. nedenini söylemese de.
Stephen Turner

4
Belgeler, formun StartPosition özelliğini ortalamak için kullandığını söylüyor. Benim için çalıştı.
John Kroetch

Bu işe yarıyor, sadece örneğini oluşturmam gerekiyor: this.CenterToScreen ();
Laki Politis

Ayrıca belgelerde neden "Bunu doğrudan kodunuzdan çağırmayın" dediğini bilmek isterim.
Pete

154
  1. Özellik penceresini kullanma

    Form seçin → özellik penceresine gidin → "başlangıç ​​konumu" seçin → istediğiniz yeri seçin.

    "

  2. Programlı

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

    Not: Form.CenterToScreen () 'i doğrudan kodunuzdan çağırmayın. Burada okuyun .


34

Tek satır:

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

Bu gösterileri merkezini almanın iyi bir yoludur ya elle 'x' ya da 'y'. "Orta ekrana" ihtiyacım vardı, ancak yalnızca "y" koordinatı için.
atconway

9
Neden Screen.PrimaryScreen? Ya form "SecondaryScreen" üzerindeyse? Screen screen = Screen.FromControl(this);Burayı kullanmalısın .
Artemix

Bu ilkel teknikleri sadece .NET Compact Framework 3.5 üzerinde çalıştığı için kullanıyorum ve bu da neden kullanmadığımı Screen.FromControl(this)ama kullanmaya devam ettiğimi açıklıyor PrimaryScreen. (Donanım kısıtlaması altında bir uygulama geliştiriyorum) :-)
Yeo

Yalnızca bir ekran kullanıyorsanız, bu yöntem uygundur. Ancak, birden fazla monitörünüz varsa ve burada sol monitörde bir kısayola tıklarsanız, gerçekten sağ monitörde açılmasını istemezsiniz. StartPosition özelliği bunu sizin için halleder.
Trevor_G

Bu, [monitör başına DPI duyarlı] değildir.
vt.

28

Windows Formlarında:

this.StartPosition = FormStartPosition.CenterScreen;

WPF'de:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Tek yapman gereken bu ...


Durum için en iyi cevap. Pozisyonu belirlemek istemedim, forma geri döndüğümde sıfırlanmasını istedim. Bu harika.
KangarooRIOT

16

Çalışma zamanı sırasında pencerelerinizi ortalamak istiyorsanız aşağıdaki kodu kullanın, uygulamanıza kopyalayın:

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

Ve nihayet çalışmasını sağlamak için yukarıdaki yöntemi çağırın:

ReallyCenterToScreen();

Bu, daha this.Location = Screen.AllScreens[0].WorkingArea.Location;önce çalıştırsanız bile işe yarayacağından en iyi şekilde çalışır , birden fazla ekran kullanılırken uygulamanın taşınması durumunda diğer yanıtlar işe yaramaz.
TK-421

8

 Formun çalışma zamanında    ortalanması

1. Aşağıdaki Form özelliğini ayarlayın:
-> StartPosition: CenterScreen
   -> WindowState: Normal

Bu, formu çalışma zamanında ortalayacaktır, ancak form boyutu beklenenden daha büyükse, ikinci adımı uygulayın.

2. InitializeComponent () 'den sonra Özel Boyut ekleyin;

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

Kulpunu alabileceğiniz herhangi bir pencereyi ortalar


3

Bunu kullan:

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

1
-100. " Do not doğrudan kodundan) CenterToScreen (çağırın. Bunun yerine, CenterScreen için StartPosition özelliğini ayarlayın." msdn.microsoft.com/en-us/library/…
A876

2

Formun Konum özelliğini kullanın. İstenilen sol üst noktaya ayarlayın

istenen x = (masaüstü_width - form_witdh) / 2

istenen y = (desktop_height - from_height) / 2


1

Screen.PrimaryScreen.BoundsBirincil monitörün boyutunu almak için kullanabilirsiniz (veya Screentüm monitörleri almak için nesneyi inceleyebilirsiniz ). MyForms.BoundsFormunuzu nereye yerleştireceğinizi bulmak için bunları kullanın .


1

Soruyla tamamen alakalı olmayabilir. Ama belki birine yardım edebilir.

Yukarıdakilerden hiçbiri Merkezi Ekran benim için çalışmıyor. Nedeni, forma dinamik olarak kontroller eklemekti. Teknik olarak ortalandığında, kontrolleri eklemeden önceki forma göre doğruydu.

İşte benim çözümüm buydu. (Her iki senaryo ile de çalışmalıdır)

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

Dolayısıyla, sadece Yükseklik / Genişlik yerine "PreferredSize" kullandığımı fark edeceksiniz. Tercih edilen boyut, kontrolleri ekledikten sonra formun değerini tutacaktır. Yükseklik / Genişliğin olmayacağı yer.

Umarım bu birine yardımcı olur.

Şerefe


0

Çoklu monitör olması durumunda ve doğru monitörü / ekranı ortalamayı tercih ederseniz, şu satırları denemek isteyebilirsiniz:

// 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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.