如何在C#屏幕上居中显示窗口?


128

我需要一种使当前窗口居中的方法。因此,例如,如果用户按下一个按钮,我希望窗口在屏幕上居中。我知道您可以使用startposition属性,但是除了应用程序首次启动时,我无法找到使用该属性的方法。那么如何在屏幕上居中放置表单?


我想您使用获胜表格?
2011年

8
不要使用Form.CenterToScreen。有关详细信息,请参见此帖子
Artemix

在表单类的构造函数中使用CenterToScreen()方法。
webMac

Answers:


201

使用Form.CenterToScreen()方法。


7
在具有两个监视器的系统上,表格将居中放置在当前具有光标的一个监视器上。因此,表格可能会突然跳到其他监视器。在这里查看帖子。
Artemix

6
您引用的文档确实说“不要直接从您的代码中调用它”。尽管没有说明原因。
Stephen Turner 2014年

4
该文档确实说使用窗体的StartPosition属性将其居中。它为我工作。
约翰·克罗奇

这行得通,我只需要实例化它:this.CenterToScreen();
Laki Politis

我也想知道为什么文档说“不要直接从您的代码中调用它”。
皮特

153
  1. 使用属性窗口

    选择表单→转到属性窗口→选择“开始位置”→选择您想要的任何地方。

    ”

  2. 以编程方式

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

    注意:不要直接从代码中调用Form.CenterToScreen()。在这里阅读。


34

一行:

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

这说明得到的中心的一个很好的方法任一的“x”或“Y”手动。我需要“中心屏幕”,但仅用于“ y”坐标。
atconway 2012年

9
为什么选择Screen.PrimaryScreen?如果表单位于“ SecondaryScreen”上怎么办?您应该Screen screen = Screen.FromControl(this);在这里使用。
Artemix

我之所以使用这种原始技术,仅仅是因为它可以在.NET Compact Framework 3.5上运行,这也解释了为什么我不使用Screen.FromControl(this)而是将其保留下来PrimaryScreen。(我正在硬件限制下开发应用程序):-)
Yeo 2015年

如果仅使用一个屏幕,则该方法是可以的。但是,如果您有多台监视器,并在左侧监视器上单击此处的快捷方式,则您实际上不希望它在右侧监视器上打开。StartPosition属性为您处理。
Trevor_G

这不是[每个监视器DPI知道的]。
vt。

28

在Windows窗体中:

this.StartPosition = FormStartPosition.CenterScreen;

在WPF中:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

那就是你要做的...


对于这种情况的最佳答案。回到表格后,我不想设置位置,但是要重置它。太棒了。
KangarooRIOT

16

如果要在运行时使窗口居中,请使用以下代码,将其复制到应用程序中:

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

最后调用上面的方法使其工作:

ReallyCenterToScreen();

这是最好的方法,因为即使您先运行this.Location = Screen.AllScreens[0].WorkingArea.Location;它也可以使用,在使用多个屏幕移动应用程序的情况下,其他答案将不起作用。
TK-421

8

 在运行时中将表单居中1.设置表单的

以下属性:
   -> StartPosition:CenterScreen-
   > WindowState:Normal

这将使表单在运行时居中,但是如果表单大小大于预期大小,请执行第二步。

2.在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;
        }
    }
}

居中您可以获取的任何窗口



2

使用表单的位置属性。将其设置为所需的左上角

所需的x =(desktop_width-form_witdh)/ 2

所需y =(desktop_height-from_height)/ 2


1

您可以使用Screen.PrimaryScreen.Bounds来检索主监视器的大小(或检查Screen对象以检索所有监视器)。使用那些与MyForms.Bounds找出表格的放置位置。


1

可能与问题不完全相关。但也许可以帮助某人。

中心屏幕非上述工作适合我。原因是我要向表单动态添加控件。从技术上讲,居中位置是正确的(基于添加控件之前的表格)。

所以这是我的解决方案。(应该同时适用于两种情况)

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

因此,您会注意到我使用的是“ PreferredSize”,而不仅仅是使用“高度/宽度”。添加控件后,首选大小将保留表单的值。高度/宽度不会的地方。

希望这对某人有帮助。

干杯


0

如果是多显示器,并且如果您希望以正确的显示器/屏幕为中心,则可以尝试以下操作:

// 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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.