158

I need a way to center the current window on the screen.

So for example, if a user pushes a button, I want the window to center itself on the screen.

I know you can use the startposition property, but I cannot figure out a way to use that other than when the application first starts up.

So how do I center the form on the screen?

4
  • 1
    I suppose you using win forms? Commented Jan 5, 2011 at 7:51
  • 10
    Do not use Form.CenterToScreen. See this post for details. Commented Feb 7, 2013 at 10:31
  • 1
    use the CenterToScreen() Method in the constructor of the form class. Commented Mar 28, 2018 at 8:49
  • 2
    try: StartPosition = FormStartPosition.CenterScreen; OR this.CenterToScreen(); Commented Aug 31, 2022 at 7:28

13 Answers 13

230

Use Form.CenterToScreen() method.

Sign up to request clarification or add additional context in comments.

6 Comments

On system with two monitors the form will be centered on one that currently have the cursor. So, the form may suddenly jump to other monitor. See the post here.
The documentation you reference does say "Do not call this directly from your code." though it doesn't say why.
The documentation does say use the form's StartPosition property to center it. It worked for me.
This works, I just had to instantiate it: this.CenterToScreen();
I would also like to know why the documentation says "Do not call this directly from your code."
|
193
  1. Using the Property window

    Select form → go to property window → select "start position" → select whatever the place you want.

    "

  2. Programmatically

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

    Note: Do not directly call Form.CenterToScreen() from your code. Read here.

1 Comment

This doesn't answer the question since it only centers the form at startup, not when pressing a button.
46

A single line:

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

5 Comments

This shows a good way of getting the center of either the 'x' or 'y' manually. I needed 'center screen', but only for the 'y' coordinate.
Why Screen.PrimaryScreen? What if the form is on 'SecondaryScreen'? You should use Screen screen = Screen.FromControl(this); here.
I use this primitive techniques simply because it works on .NET Compact Framework 3.5, and this also explain why I don't use Screen.FromControl(this) but keep it to PrimaryScreen. (I'm developing an application under hardware constraint) :-)
That method is ok if you are only using one screen. However, if you have multiple monitors and click a shortcut over here on the left monitor, you don't really want it opening on the right one. The StartPosition property handles that for you.
This is not [per monitor DPI aware].
38

In Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen; 

In WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen; 

That's all you have to do...

1 Comment

Best answer for the situation. I did not want to set the position but to have it reset once I came back to the form. This is perfect.
26

If you want to center your windows during runtime use the code below, copy it into your application:

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

And finally call the method above to get it working:

ReallyCenterToScreen(); 

2 Comments

This works best since it will work even if you run this.Location = Screen.AllScreens[0].WorkingArea.Location; before it, other answers do not work in such case of moving app when using multiple screens.
This worked on my machine with 3 monitors.
9

 Centering a form in runtime

1.Set following property of Form:
   -> StartPosition : CenterScreen
   -> WindowState: Normal

This will center the form at runtime but if form size is bigger then expected, do second step.

2. Add Custom Size after InitializeComponent();

public Form1() { InitializeComponent(); this.Size = new Size(800, 600); } 

Comments

7

Use this:

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

1 Comment

-100. "Do not call CenterToScreen() directly from your code. Instead, set the StartPosition property to CenterScreen." msdn.microsoft.com/en-us/library/…
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; } } } 

Centers any window you can get the handle of

Comments

6

Might not be completely relevant to the question. But maybe can help someone.

Center Screen non of the above work for me. Reason was I was adding controls dynamically to the form. Technically when it centered it was correct , based on the form before adding the controls.

So here was my solution. ( Should work with both scenarios )

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

So you will notice that I am using "PreferredSize" instead of just using Height / Width. The preferred size will hold the value of the form after adding the controls. Where Height / Width won't.

Hope this helps someone .

Cheers

1 Comment

This is a great response! and should be the solution to the question.
4

Working sample

private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { AccountAddForm f = new AccountAddForm(); f.StartPosition = FormStartPosition.CenterScreen; f.Show(); } 

Comments

2

Use Location property of the form. Set it to the desired top left point

desired x = (desktop_width - form_witdh)/2

desired y = (desktop_height - from_height)/2

Comments

1

You can use the Screen.PrimaryScreen.Bounds to retrieve the size of the primary monitor (or inspect the Screen object to retrieve all monitors). Use those with MyForms.Bounds to figure out where to place your form.

Comments

1

In case of multi monitor and If you prefer to center on correct monitor/screen then you might like to try these lines:

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.