2011-01-05 13 views
93

Ich brauche eine Möglichkeit, das aktuelle Fenster zu zentrieren. Wenn beispielsweise ein Benutzer eine Schaltfläche drückt, möchte ich, dass sich das Fenster auf dem Bildschirm zentriert. Ich weiß, dass Sie die Startposition-Eigenschaft verwenden können, aber ich kann nicht herausfinden, wie Sie diese verwenden können, außer wenn die Anwendung zum ersten Mal gestartet wird. Wie zentriere ich das Formular auf dem Bildschirm?Wie zentriere ich ein Fenster auf dem Bildschirm in C#?

+0

Ich nehme an, Sie gewinnen Formularen? –

+0

Ja, das ist richtig – Sean

+7

Verwenden Sie nicht Form.CenterToScreen. Siehe [diesen Beitrag] (http://stackoverflow.com/questions/6837463/how-come-centertoscreen-method-centers-the-form-on-the-screen-where-the-cursori-i/6837499#6837499) für Details. – Artemix

Antwort

149

Verwendung Form.CenterToScreen() Methode.

+7

Wow, verarschen Sie mich? Der Rest von uns springt durch die Reifen, um es herauszufinden. Das hat perfekt funktioniert. Vielen Dank! – Sean

+9

@Sean: Immer Ihre Bibliothek kennen. Es gibt einen Grund, warum du all dieses Gepäck trägst. ;-) –

+3

Bei einem System mit zwei Monitoren ist das Formular auf einem zentriert, auf dem sich der Cursor gerade befindet. So kann das Formular plötzlich auf einen anderen Monitor springen. Siehe den Beitrag [hier] (http://stackoverflow.com/questions/6837463/how-come-centertoscreen-method-centers-the-form-on-the-screen-where-the-cursori-i/6837499#6837499). – Artemix

1

Sie können die Screen.PrimaryScreen.Bounds verwenden, um die Größe des primären Monitors abzurufen (oder das Objekt Screen untersuchen, um alle Monitore abzurufen). Verwenden Sie diese mit MyForms.Bounds um herauszufinden, wo Sie Ihr Formular platzieren.

2

Verwenden Sie die Standorteigenschaft des Formulars. Eingestellt auf den gewünschten Punkt oben links

gewünschten x = (desktop_width - form_witdh)/2

gewünschten y = (desktop_height - from_height)/2

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

Zentren jedes Fenster können Sie den Griff

25

Eine einzelne Zeile erhalten:

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

Dies zeigt eine gute Möglichkeit, das Zentrum von * entweder * dem 'x' oder 'y' manuell zu erhalten. Ich brauchte 'Center Screen', aber nur für die 'Y' Koordinate. – atconway

+6

Warum Screen.PrimaryScreen? Was passiert, wenn das Formular auf "SecondaryScreen" steht? Sie sollten 'Screen screen = Screen.FromControl (this);' hier verwenden. – Artemix

+0

Ich benutze diese primitiven Techniken einfach, weil es auf dem .NET Compact Framework 3.5 ** funktioniert, und dies erklärt auch, warum ich 'Screen.FromControl (this)' nicht verwende, sondern es auf 'PrimaryScreen' behalte. (Ich entwickle eine Anwendung unter Hardware-Constraint) :-) – Yeo

22

In Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen; 

In WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen; 

Das ist alles, was Sie tun müssen ...

+0

Vervollkommnen Sie meinen Freund. –

+0

Beste Antwort für die Situation. Ich wollte die Position nicht festlegen, sondern zurücksetzen lassen, sobald ich zum Formular zurückgekehrt bin. Dies ist perfekt. – KangarooRIOT

14

Wenn Sie während Ihrer Windows-zentrieren möchten Runtime den Code unten verwenden, kopieren Sie sie in Ihre Anwendung:

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

Und schließlich die Methode aufrufen, oben zu bekommen sie arbeiten:

ReallyCenterToScreen(); 
93
  1. Mit dem Property Fenster

    Formular auswählen → zum Eigenschaftsfenster gehen → "Startposition" auswählen → den gewünschten Ort auswählen.

    "

  2. Programmatically

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

    Hinweis: Rufen Sie Form.CenterToScreen() nicht direkt von Ihrem Code ab. Lesen Sie here.

+2

Dies sollte die akzeptierte Antwort sein. – user2481095

7

  Zentrieren eine Laufzeit-Form in

1.Stellen Sie folgende Eigenschaft von Form:
      -> Startposition: Mittenschirm
      -> Window: Normal

Dies wird die Form zur Laufzeit Zentrieren aber wenn Formulargröße ist größer als erwartet, tut zweiten Schritt.

2. Benutzerdefinierte Größe hinzufügen nach InitializeComponent();

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

Es ist nett, dass du WindowState Normal erwähnt hast. Vielen Dank. –

1

verwenden:

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

-100. "Rufen Sie nicht CenterToScreen() direkt aus Ihrem Code auf. Stattdessen legen Sie die Eigenschaft StartPosition auf CenterScreen fest." http://msdn.microsoft.com/en-us/library/system.windows.forms.form.centertoscreen.aspx – A876

Verwandte Themen