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

Posted

技术标签:

【中文标题】如何在 C# 中将窗口居中显示在屏幕上?【英文标题】:How do I center a window onscreen in C#? 【发布时间】:2011-06-03 20:42:06 【问题描述】:

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

【问题讨论】:

我猜你用的是win forms? 不要使用 Form.CenterToScreen。详情请见this post。 在表单类的构造函数中使用CenterToScreen()方法。 【参考方案1】:

使用Form.CenterToScreen() 方法。

【讨论】:

在有两台显示器的系统上,表格将集中在一个当前有光标的显示器上。因此,表格可能会突然跳转到其他显示器。见帖子here。 您参考的文档确实说“不要直接从您的代码中调用它。”虽然没有说明原因。 文档确实说使用表单的 StartPosition 属性将其居中。它对我有用。 这行得通,我只需要实例化它:this.CenterToScreen(); 我也想知道为什么文档说“不要直接从你的代码中调用它。”【参考方案2】:

    使用属性窗口

    选择表格→进入属性窗口→选择“开始位置”→选择您想要的任何位置。

    以编程方式

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

    注意:不要从您的代码中直接调用 Form.CenterToScreen()。阅读here。

【讨论】:

【参考方案3】:

一行:

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

【讨论】:

这显示了一种手动获取 要么 'x' 或 'y' 中心的好方法。我需要“中心屏幕”,但仅限于“y”坐标。 为什么选择 Screen.PrimaryScreen?如果表格在“SecondaryScreen”上怎么办?你应该在这里使用Screen screen = Screen.FromControl(this); 我使用这种原始技术只是因为它适用于 .NET Compact Framework 3.5,这也解释了为什么我不使用 Screen.FromControl(this) 而是将其保留为 @987654324 @。 (我正在开发一个受硬件限制的应用程序):-) 如果您只使用一个屏幕,该方法是可以的。但是,如果您有多个监视器并在左侧监视器上单击此处的快捷方式,您并不真的希望它在右侧打开。 StartPosition 属性会为您处理。 这不是[每个显示器的 DPI 感知]。【参考方案4】:

在 Windows 窗体中:

this.StartPosition = FormStartPosition.CenterScreen;

在 WPF 中:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

这就是你所要做的……

【讨论】:

这种情况的最佳答案。我不想设置位置,而是在我回到表格后将其重置。这是完美的。【参考方案5】:

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

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;它也能工作,其他答案在使用多个屏幕时移动应用程序的情况下不起作用。 这在我的机器上有 3 个显示器。【参考方案6】:

 在运行时使表单居中 1.设置Form的以下属性:    -> StartPosition : CenterScreen    -> WindowState:正常

这将使表单在运行时居中,但如果表单大小大于预期,请执行第二步。 2.在InitializeComponent()后添加自定义尺寸;

public Form1()

    InitializeComponent();
    this.Size = new Size(800, 600);

【讨论】:

【参考方案7】:
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;
        
    

居中任何您可以获得句柄的窗口

【讨论】:

【参考方案8】:

使用这个:

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

【讨论】:

-100。 “不要直接从您的代码调用 CenterToScreen()。而是将 StartPosition 属性设置为 CenterScreen。” msdn.microsoft.com/en-us/library/…【参考方案9】:

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

想要的 x = (desktop_width - form_witdh)/2

期望的 y = (desktop_height - from_height)/2

【讨论】:

【参考方案10】:

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

中心屏幕不适合我。原因是我正在向表单动态添加控件。从技术上讲,当它居中时,它是正确的,基于添加控件之前的表单。

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

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”而不是仅仅使用高度/宽度。 添加控件后,首选大小将保留表单的值。高度/宽度不会。

希望这对某人有所帮助。

干杯

【讨论】:

【参考方案11】:

您可以使用Screen.PrimaryScreen.Bounds 检索主监视器的大小(或检查Screen 对象以检索所有监视器)。使用MyForms.Bounds 来确定表单的放置位置。

【讨论】:

【参考方案12】:

在多显示器的情况下,如果您希望集中在正确的显示器/屏幕上,那么您可能想尝试以下几行:

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

【讨论】:

【参考方案13】:

工作样本

private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)

    AccountAddForm f = new AccountAddForm();
    f.StartPosition = FormStartPosition.CenterScreen;
    f.Show();            

【讨论】:

以上是关于如何在 C# 中将窗口居中显示在屏幕上?的主要内容,如果未能解决你的问题,请参考以下文章

在屏幕上居中 Swift 弹出窗口

如何使窗口适合其内容并将其居中放置在 Sciter 的屏幕上?

如何在页面上居中模式窗口?

WPF 窗口居中 & 变更触发机制

Qt窗口屏幕居中显示以及设置大小

WPF运行中怎么用C# 代码调整窗口位置,特别是怎么居中到屏幕中央