C#でウィンドウを画面の中央に配置するにはどうすればよいですか?


129

現在のウィンドウを中央に配置する方法が必要です。たとえば、ユーザーがボタンを押した場合、ウィンドウを画面の中央に配置したいとします。startpositionプロパティを使用できることは知っていますが、アプリケーションが最初に起動するとき以外は、それを使用する方法を理解できません。では、フォームを画面の中央に配置するにはどうすればよいですか?


私はあなたが勝利フォームを使用していると思いますか?
Andrew Orsich

8
Form.CenterToScreenは使用しないでください。詳細については、この投稿を参照してください。
Artemix 2013

フォームクラスのコンストラクターでCenterToScreen()メソッドを使用します。
webMac 2018年

回答:


202

Form.CenterToScreen()メソッドを使用します。


7
2つのモニターを備えたシステムでは、フォームは現在カーソルがあるモニターの中央に配置されます。そのため、フォームが突然他のモニターにジャンプする場合があります。こちらの投稿をご覧ください
Artemix 2013

6
あなたが参照しているドキュメントには、「これをコードから直接呼び出さないでください」と書かれています。それは理由を述べていませんが。
スティーブンターナー

4
ドキュメントには、フォームのStartPositionプロパティを使用して中央に配置することが記載されています。それは私のために働いた。
John Kroetch 2014

これは機能します。インスタンス化する必要がありました:this.CenterToScreen();
ラキポリティス2017

また、ドキュメントに「これをコードから直接呼び出さないでください」と書かれている理由も知りたいです。
ピート

153
  1. プロパティウィンドウの使用

    フォームを選択→プロパティウィンドウに移動→「開始位置」を選択→好きな場所を選択します。

    」

  2. プログラム的に

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

    注:コードからForm.CenterToScreen()を直接呼び出さないでください。こちらをお読みください


34

単一行:

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

これはショーの中央得るための良い方法のいずれかを手動「X」または「Y」を。「中央画面」が必要でしたが、これは「y」座標のみです。
atconway 2012年

9
Screen.PrimaryScreenを使用する理由 フォームが「SecondaryScreen」にある場合はどうなりますか?あなたはScreen screen = Screen.FromControl(this);ここを使うべきです。
Artemix 2013

それは上で動作するという理由だけで、私は、この原始的な技術を使用し、.NET Compact Frameworkの3.5、そして私が使用していない理由は、これがまた、説明Screen.FromControl(this)だけに、それを維持しますPrimaryScreen。(私はハードウェアの制約の下でアプリケーションを開発しています):-)
Yeo

この方法は、1つの画面のみを使用している場合は問題ありません。ただし、複数のモニターがあり、左側のモニターのここにあるショートカットをクリックすると、右側のモニターで開く必要はありません。StartPositionプロパティがそれを処理します。
Trevor_G 2017

これは[モニターごとのDPI対応]ではありません。
vt。

28

Windowsフォーム:

this.StartPosition = FormStartPosition.CenterScreen;

WPFの場合:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

あなたがしなければならないのはそれだけです...


状況に対する最良の答え。位置を設定したくはありませんでしたが、フォームに戻ったら位置をリセットしました。これは完璧です。
カンガルー

16

ランタイム中にウィンドウを中央に配置したい場合は、以下のコードを使用して、アプリケーションにコピーします。

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;より前に実行しても機能するので最適に機能します。複数の画面を使用しているときにアプリを移動するような場合、他の回答は機能しません。
TK-421

8

 ランタイム

でのフォームの
   中央揃え1. フォームの次のプロパティを設定します。- > StartPosition:CenterScreen
   > WindowState:Normal

これにより、実行時にフォームが中央に配置されますが、フォームのサイズが予想よりも大きい場合は、2番目の手順を実行します。

2. InitializeComponent();の後にカスタムサイズを追加します。

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

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

ハンドルを取得できるウィンドウを中央に配置します


3

これを使って:

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

1
-100。" コードから直接CenterToScreen()を呼び出さないでください。代わりに、StartPositionプロパティをCenterScreenに設定してください。" msdn.microsoft.com/en-us/library/...
A876

2

フォームのLocationプロパティを使用します。目的の左上ポイントに設定します

望ましいx =(desktop_width-form_witdh)/ 2

望ましいy =(desktop_height-from_height)/ 2


1

を使用しScreen.PrimaryScreen.Boundsて、プライマリモニターのサイズを取得できます(またはScreenオブジェクトを調べてすべてのモニターを取得できます)。を使用しMyForms.Boundsて、フォームを配置する場所を見つけます。


1

質問に完全に関連しているとは限りません。しかし、多分誰かを助けることができます。

上記の作品以外のセンタースクリーンは私にとっては。理由は、フォームにコントロールを動的に追加していたからです。技術的には、コントロールを追加する前のフォームに基づいて、中央に配置されたときは正しいものでした。

だからここに私の解決策がありました。(両方のシナリオで動作するはずです)

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」を使用していることに気付くでしょう。推奨サイズは、コントロールを追加した後のフォームの値を保持します。高さ/幅ができないところ。

これが誰かを助けることを願っています。

乾杯


0

マルチモニターの場合で、正しいモニター/画面を中心にしたい場合は、次の行を試してください。

// 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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.