2016-07-05 84 views
1

我Form3与此代码:C#找到画面的窗口形式的顶部中央

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

这让我Form3在右下像

Esempio

我希望它的我的屏幕顶部中心。它可以适应我的代码或不?如果不是,你能否为我提供一个简单的解决方案?

谢谢!

+0

@BugFinder左上角是0,0。计算机通常不能使用笛卡儿坐标。 –

+0

(0,0)实际上是(*,主屏幕*的左侧,顶部),而不是整个虚拟屏幕。负坐标是可能的。 –

回答

2

Top将为0,而Left将为工作区域宽度的一半减去控制宽度的一半。

this.Left = (rightmost.WorkingArea.Right/2) - (this.Width/2); 
this.Top = 0; 
2

简单。 Screen.WorkingArea为您提供了一个描述整个virtual screen的矩形。找到矩形的中心是一个简单的数学运算。

因此:

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

注意,这将会把形式嫌-DAB在虚拟屏幕的顶部中心。这可能不是你想要的。如果用户有多个显示器,表格可能会跨越两个不同的显示器。为了解决这个问题,你需要更精确地定义你希望显示表单的位置。你可能会决定你希望它在主屏幕(用户设计为“主”的那个屏幕)上居中,或者你可能会认为你希望它在当前显示的屏幕上居中(或者至少,目前包含屏幕的屏幕最多,其面积为)。对于前者,您可以使用Screen.PrimaryScreen.WorkingArea。对于后者,您可以使用Screen.FromControl(this).WorkingArea

0

或者您可以将设计器中的StartPosition属性更改为CenterScreen

this.StartPosition = FormStartPosition.CenterScreen; 
this.Top = 0; 
+0

它在屏幕中垂直和水平居中。该问题询问了屏幕的“顶部中心”。当然,你可以这样做,然后手动重置'Top'属性... –

+0

谢谢科迪,更新了这个例子。我误以为它是屏幕上最顶级的形式。 – Slai

0

找到一个稍微简单的方法来做到这一点。

public Form1() 
    { 
     InitializeComponent(); 

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

    }