現在のウィンドウを中央に配置する方法が必要です。たとえば、ユーザーがボタンを押した場合、ウィンドウを画面の中央に配置したいとします。startpositionプロパティを使用できることは知っていますが、アプリケーションが最初に起動するとき以外は、それを使用する方法を理解できません。では、フォームを画面の中央に配置するにはどうすればよいですか?
現在のウィンドウを中央に配置する方法が必要です。たとえば、ユーザーがボタンを押した場合、ウィンドウを画面の中央に配置したいとします。startpositionプロパティを使用できることは知っていますが、アプリケーションが最初に起動するとき以外は、それを使用する方法を理解できません。では、フォームを画面の中央に配置するにはどうすればよいですか?
回答:
Form.CenterToScreen()メソッドを使用します。
単一行:
this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2,
(Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2);
Screen screen = Screen.FromControl(this);
ここを使うべきです。
Screen.FromControl(this)
だけに、それを維持しますPrimaryScreen
。(私はハードウェアの制約の下でアプリケーションを開発しています):-)
ランタイム中にウィンドウを中央に配置したい場合は、以下のコードを使用して、アプリケーションにコピーします。
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;
より前に実行しても機能するので最適に機能します。複数の画面を使用しているときにアプリを移動するような場合、他の回答は機能しません。
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.CenterToScreen(); // This will take care of the current form
フォームのLocationプロパティを使用します。目的の左上ポイントに設定します
望ましいx =(desktop_width-form_witdh)/ 2
望ましいy =(desktop_height-from_height)/ 2
を使用しScreen.PrimaryScreen.Bounds
て、プライマリモニターのサイズを取得できます(またはScreen
オブジェクトを調べてすべてのモニターを取得できます)。を使用しMyForms.Bounds
て、フォームを配置する場所を見つけます。
質問に完全に関連しているとは限りません。しかし、多分誰かを助けることができます。
上記の作品以外のセンタースクリーンは私にとっては。理由は、フォームにコントロールを動的に追加していたからです。技術的には、コントロールを追加する前のフォームに基づいて、中央に配置されたときは正しいものでした。
だからここに私の解決策がありました。(両方のシナリオで動作するはずです)
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」を使用していることに気付くでしょう。推奨サイズは、コントロールを追加した後のフォームの値を保持します。高さ/幅ができないところ。
これが誰かを助けることを願っています。
乾杯
マルチモニターの場合で、正しいモニター/画面を中心にしたい場合は、次の行を試してください。
// 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;