ฉันจะจัดกึ่งกลางหน้าต่างบนหน้าจอใน C # ได้อย่างไร


129

ฉันต้องการวิธีที่จะจัดกึ่งกลางหน้าต่างปัจจุบัน ตัวอย่างเช่นหากผู้ใช้กดปุ่มฉันต้องการให้หน้าต่างอยู่กึ่งกลางหน้าจอของตัวเอง ฉันรู้ว่าคุณสามารถใช้คุณสมบัติการเริ่มต้นได้ แต่ฉันไม่สามารถหาวิธีใช้สิ่งอื่นนอกเหนือจากเมื่อแอปพลิเคชันเริ่มทำงานครั้งแรก ดังนั้นฉันจะจัดกึ่งกลางของแบบฟอร์มบนหน้าจอได้อย่างไร


ฉันสมมติว่าคุณใช้ฟอร์มชนะ
Andrew Orsich

8
อย่าใช้ Form.CenterToScreen ดูโพสต์นี้สำหรับรายละเอียด
Artemix

ใช้วิธี CenterToScreen () ในตัวสร้างของคลาสฟอร์ม
webMac

คำตอบ:


202

ใช้วิธีการForm.CenterToScreen ()


7
บนระบบที่มีจอภาพสองจอแบบฟอร์มจะถูกจัดกึ่งกลางบนหนึ่งที่มีเคอร์เซอร์ในปัจจุบัน ดังนั้นแบบฟอร์มอาจข้ามไปยังจอภาพอื่นทันที ดูโพสต์ที่นี่
Artemix

6
เอกสารอ้างอิงที่คุณอ้างว่า "อย่าเรียกสิ่งนี้โดยตรงจากรหัสของคุณ" แม้ว่ามันจะไม่พูดว่าทำไม
Stephen Turner

4
เอกสารกล่าวว่าใช้คุณสมบัติ StartPosition ของฟอร์มเพื่อจัดกึ่งกลาง มันใช้งานได้สำหรับฉัน
John Kroetch

งานนี้ฉันต้องยกตัวอย่าง: this.CenterToScreen ();
Laki Politis

ฉันต้องการทราบว่าทำไมเอกสารอธิบายว่า "อย่าโทรจากรหัสของคุณโดยตรง"
Pete

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

9
หน้าจอทำไมหน้าจอหลัก? เกิดอะไรขึ้นถ้าแบบฟอร์มอยู่บน 'หน้าจอรอง'? คุณควรใช้Screen screen = Screen.FromControl(this);ที่นี่
Artemix

ผมใช้เทคนิคดั้งเดิมนี้เพียงเพราะมันทำงานบน.NET Framework กระชับ 3.5และนี้ยังอธิบายว่าทำไมฉันไม่ได้ใช้แต่เก็บไว้ให้Screen.FromControl(this) PrimaryScreen(ฉันกำลังพัฒนาแอปพลิเคชันภายใต้ข้อ จำกัด ด้านฮาร์ดแวร์) :-)
Yeo

วิธีการนั้นใช้ได้ถ้าคุณใช้เพียงหน้าจอเดียว อย่างไรก็ตามหากคุณมีจอภาพหลายจอและคลิกทางลัดที่นี่บนจอภาพด้านซ้ายคุณไม่ต้องการให้เปิดทางด้านขวา คุณสมบัติ StartPosition จะจัดการให้คุณ
Trevor_G

นี่ไม่ใช่ [ระวัง DPI ของจอภาพแต่ละจอภาพ]
vt

28

ใน Windows Forms:

this.StartPosition = FormStartPosition.CenterScreen;

ใน WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

นั่นคือทั้งหมดที่คุณต้องทำ ...


คำตอบที่ดีที่สุดสำหรับสถานการณ์ ฉันไม่ต้องการตั้งตำแหน่ง แต่จะรีเซ็ตเมื่อฉันกลับมาที่แบบฟอร์ม มันสมบูรณ์แบบ
KangarooRIOT

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. เพิ่มขนาดที่กำหนดเองหลังจาก 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

ใช้คุณสมบัติตำแหน่งของแบบฟอร์ม ตั้งค่าเป็นจุดซ้ายบนที่ต้องการ

ต้องการ 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.