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

我需要一个方法来定位当前窗口。例如,如果用户按下一个按钮,我希望窗口在屏幕上居中显示。我知道您可以使用 startposition 属性,但是除了在应用程序首次启动时使用之外,我找不到其他使用方法。那么如何在屏幕上居中显示窗体呢?

267656 次浏览

可以使用 Screen.PrimaryScreen.Bounds检索主监视器的大小(或检查 Screen对象以检索所有监视器)。使用那些与 MyForms.Bounds的,以确定在哪里放置您的形式。

使用窗体的 Location 属性。将其设置为所需的左上角点

所需的 x = (桌面 _ width-form _ witdh)/2

所需的 y = (桌面 _ 高度-从 _ 高度)/2

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

把任何你能拿到把手的窗口都放在中心

一句话:

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

在 Windows 窗体中:

this.StartPosition = FormStartPosition.CenterScreen;

在 WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

这就是你要做的。

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

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();
  1. 使用 财产窗口

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

    "

  2. 以程序化的方式

    表格1 = 新表格() ; Form1.StartPosition = FormStartPosition. CenterScreen; Form1.ShowDialog () ;

    注意: 不要直接从代码中调用 Form. CenterToScreen () ,请阅读 给你

< strong > 在运行时以表单为中心

1. 设置 Form 的下列属性:
- > 开始位置: 中央屏幕
- > WindowState: 正常

这将在运行时使窗体居中,但如果窗体大小比预期的要大,则执行第二步。

在 InitializeComponent ()后添加自定义大小;

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

用这个:

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

可能和这个问题不完全相关,但也许能帮到某人。

中央屏幕非以上工作为我。原因是我正在向窗体动态添加控件。从技术上说,当它居中时,它是正确的,基于添加控件之前的窗体。

这就是我的解决方案

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”,而不仅仅是使用 Height/Width。 添加控件后,首选大小将保存窗体的值。

希望这对谁有帮助。

干杯

在多显示器的情况下,如果你喜欢在正确的显示器/屏幕上居中,那么你可以试试以下几行:

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

工作样本

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