現在のウィンドウを中央に配置する方法が必要です。たとえば、ユーザーがボタンを押した場合、ウィンドウを画面の中央に配置する必要があります。 startpositionプロパティを使用できることは知っていますが、アプリケーションが最初に起動するとき以外はそれを使用する方法がわかりません。では、フォームを画面の中央に配置するにはどうすればよいですか
Form.CenterToScreen() メソッドを使用します。
Propertyウィンドウを使用する
フォームを選択→プロパティウィンドウに移動→「開始位置」を選択→任意の場所を選択.
プログラムで
Form form1 = new Form(); form1.StartPosition = FormStartPosition.CenterScreen; form1.ShowDialog();
注:コードから直接Form.CenterToScreen()を呼び出さないでください。 ここ を読んでください。
単一の行:
this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2,
(Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2);
Windowsフォームの場合:
this.StartPosition = FormStartPosition.CenterScreen;
WPFの場合:
this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
あなたがしなければならないのはそれだけです...
実行時にウィンドウを中央に配置するには、次のコードを使用して、アプリケーションにコピーします。
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();
実行時のフォームの中央揃え
1。フォームの次のプロパティを設定します。
-> StartPosition:CenterScreen
-> WindowState:通常
これにより、実行時にフォームが中央に配置されますが、フォームサイズが予想よりも大きい場合は、2番目のステップを実行します。
2。 InitializeComponent()の後にカスタムサイズを追加します。
public Form1()
{
InitializeComponent();
this.Size = new Size(800, 600);
}
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);
したがって、私は単にHeight/Widthを使用するのではなく、「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;