C# C从屏幕的顶部中心定位窗口

C# C从屏幕的顶部中心定位窗口,c#,C#,我有带此代码的Form3: protected override void OnLoad(EventArgs e) { PlaceLowerRight(); base.OnLoad(e); } private void PlaceLowerRight() { //Determine "rightmost" screen Screen rightmost = Screen.AllScreens

我有带此代码的Form3:

    protected override void OnLoad(EventArgs e)
    {
        PlaceLowerRight();
        base.OnLoad(e);
    }

    private void PlaceLowerRight()
    {
        //Determine "rightmost" screen
        Screen rightmost = Screen.AllScreens[0];
        foreach (Screen screen in Screen.AllScreens)
        {
            if (screen.WorkingArea.Right > rightmost.WorkingArea.Right)
                rightmost = screen;
        }

        this.Left = rightmost.WorkingArea.Right - this.Width;
        this.Top = rightmost.WorkingArea.Bottom - this.Height;
    }
这将我的表格3放在右下角

我想把它放在我屏幕的顶部中间。它是否可以修改我的代码?如果没有,你能给我一个简单的解决方案吗

谢谢大家!

顶部为0,左侧为工作区宽度的一半减去控制宽度的一半

this.Left = (rightmost.WorkingArea.Right / 2) - (this.Width / 2);
this.Top = 0;
顶部为0,左侧为工作区宽度的一半减去控制宽度的一半

this.Left = (rightmost.WorkingArea.Right / 2) - (this.Width / 2);
this.Top = 0;
简单。为您提供一个描述整个图形的矩形。找到矩形的中心是一个简单的数学运算

因此:

private void PlaceInTopCenter()
{
    Rectangle rcScreen = Screen.WorkingArea;
    Rectangle rcForm   = new Rectangle(this.Width, this.Height);
    this.Position = new Point((rcScreen.Left + rcScreen.Right) / 2 - (rcForm.Width / 2), 0);
}
请注意,这将使表单smack dab位于虚拟屏幕的顶部中心。这可能不是你想要的。如果用户有多个监视器,表单可能会跨越两个不同的监视器。为了解决这个问题,您需要更精确地定义表单的显示位置。您可以决定将其集中在用户设计为主屏幕的主屏幕上,或者您可以决定将其集中在当前显示的屏幕上,或者至少是当前包含其大部分区域的屏幕上。对于前者,可以使用Screen.PrimaryScreen.WorkingArea。对于后者,可以使用Screen.FromControlthis.WorkingArea.

Simple。为您提供一个描述整个图形的矩形。找到矩形的中心是一个简单的数学运算

因此:

private void PlaceInTopCenter()
{
    Rectangle rcScreen = Screen.WorkingArea;
    Rectangle rcForm   = new Rectangle(this.Width, this.Height);
    this.Position = new Point((rcScreen.Left + rcScreen.Right) / 2 - (rcForm.Width / 2), 0);
}

请注意,这将使表单smack dab位于虚拟屏幕的顶部中心。这可能不是你想要的。如果用户有多个监视器,表单可能会跨越两个不同的监视器。为了解决这个问题,您需要更精确地定义表单的显示位置。您可以决定将其集中在用户设计为主屏幕的主屏幕上,或者您可以决定将其集中在当前显示的屏幕上,或者至少是当前包含其大部分区域的屏幕上。对于前者,可以使用Screen.PrimaryScreen.WorkingArea。对于后者,可以使用Screen.FromControlthis.WorkingArea.

,也可以将设计器中的StartPosition属性更改为CenterScreen


也可以将设计器中的StartPosition属性更改为CenterScreen


找到了一种更简单的方法

public Form1()
    {
        InitializeComponent();

        Rectangle rcScreen = Screen.PrimaryScreen.WorkingArea;
        this.Location = new System.Drawing.Point((rcScreen.Left + rcScreen.Right) / 2 - (this.Width / 2), 0);

    }

找到了一种更简单的方法

public Form1()
    {
        InitializeComponent();

        Rectangle rcScreen = Screen.PrimaryScreen.WorkingArea;
        this.Location = new System.Drawing.Point((rcScreen.Left + rcScreen.Right) / 2 - (this.Width / 2), 0);

    }

@BugFinder左上角为0,0。计算机通常不使用笛卡尔坐标。0,0实际上位于主屏幕的左侧,而不是整个虚拟屏幕的顶部。负坐标是可能的。@BugFinder左上角是0,0。计算机通常不使用笛卡尔坐标。0,0实际上位于主屏幕的左侧,而不是整个虚拟屏幕的顶部。负坐标是可能的。它在屏幕上垂直和水平居中。该问题询问屏幕的顶部中心。当然,您可以这样做,然后手动重置Top属性…谢谢Cody,更新了示例。我把它误读为屏幕上最顶端的形状,它在屏幕上垂直和水平居中。该问题询问屏幕的顶部中心。当然,您可以这样做,然后手动重置Top属性…谢谢Cody,更新了示例。我把它误读为屏幕上最上面的表格。