Làm cách nào để căn giữa một cửa sổ trên màn hình trong C #?


128

Tôi cần một cách để tập trung vào cửa sổ hiện tại. Vì vậy, ví dụ, nếu người dùng nhấn nút, tôi muốn cửa sổ tự đặt chính giữa màn hình. Tôi biết bạn có thể sử dụng thuộc tính startplition, nhưng tôi không thể tìm ra cách sử dụng thuộc tính đó ngoài khi ứng dụng khởi động lần đầu tiên. Vậy làm cách nào để căn giữa biểu mẫu trên màn hình?


Tôi cho rằng bạn sử dụng các hình thức giành chiến thắng?
Andrew Orsich

8
Không sử dụng Form.CenterToScreen. Xem bài này để biết chi tiết.
Artemix

sử dụng Phương thức CenterToScreen () trong hàm tạo của lớp biểu mẫu.
webMac

Câu trả lời:


201

Sử dụng phương thức Form.CenterToScreen () .


7
Trên hệ thống có hai màn hình, biểu mẫu sẽ được tập trung vào một màn hình hiện có con trỏ. Vì vậy, hình thức có thể đột nhiên nhảy sang màn hình khác. Xem bài ở đây .
Artemix

6
Tài liệu bạn tham khảo có ghi "Đừng gọi điều này trực tiếp từ mã của bạn." mặc dù nó không nói tại sao.
Stephen Turner

4
Tài liệu nói rằng sử dụng thuộc tính StartPocation của biểu mẫu để căn giữa nó. Nó làm việc cho tôi.
John Kroetch

Điều này hoạt động, tôi chỉ cần khởi tạo nó: this.CenterToScreen ();
Laki Pol viêm

Tôi cũng muốn biết lý do tại sao tài liệu nói "Đừng gọi điều này trực tiếp từ mã của bạn."
Pete

153
  1. Sử dụng cửa sổ Thuộc tính

    Chọn biểu mẫu → đi đến cửa sổ thuộc tính → chọn "vị trí bắt đầu" → chọn bất cứ nơi nào bạn muốn.

    "

  2. Lập trình

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

    Lưu ý: Không gọi trực tiếp Form.CenterToScreen () từ mã của bạn. Đọc ở đây .


34

Một dòng duy nhất:

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

Chương trình này một cách tốt để nhận được trung tâm của một trong hai 'x' hoặc 'y' bằng tay. Tôi cần 'màn hình trung tâm', nhưng chỉ cho tọa độ 'y'.
atconway

9
Tại sao màn hình.PrimaryScreen? Điều gì xảy ra nếu biểu mẫu trên 'Thứ cấp màn hình'? Bạn nên sử dụng Screen screen = Screen.FromControl(this);ở đây.
Artemix

Tôi sử dụng các kỹ thuật nguyên thủy này đơn giản vì nó hoạt động trên .NET Compact Framework 3.5 và điều này cũng giải thích tại sao tôi không sử dụng Screen.FromControl(this)mà vẫn giữ nó PrimaryScreen. (Tôi đang phát triển một ứng dụng dưới sự hạn chế của phần cứng) :-)
Yeo

Phương pháp đó là ok nếu bạn chỉ sử dụng một màn hình. Tuy nhiên, nếu bạn có nhiều màn hình và nhấp vào một phím tắt ở đây trên màn hình bên trái, bạn không thực sự muốn nó mở ở bên phải. Thuộc tính StartPocation xử lý việc đó cho bạn.
Trevor_G

Đây không phải là [mỗi màn hình DPI biết].
vt.

28

Trong các hình thức Windows:

this.StartPosition = FormStartPosition.CenterScreen;

Trong WPF:

this.WindowStartupLocation = WindowStartupLocation.CenterScreen;

Đó là tất cả những gì bạn phải làm ...


Câu trả lời tốt nhất cho tình huống. Tôi không muốn đặt vị trí nhưng để thiết lập lại vị trí một khi tôi trở lại biểu mẫu. Đây là hoàn hảo.
KangarooRIOT

16

Nếu bạn muốn căn giữa các cửa sổ của mình trong thời gian chạy, hãy sử dụng mã bên dưới, sao chép nó vào ứng dụng của bạn:

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

Và cuối cùng gọi phương thức trên để nó hoạt động:

ReallyCenterToScreen();

Điều này hoạt động tốt nhất vì nó sẽ hoạt động ngay cả khi bạn chạy this.Location = Screen.AllScreens[0].WorkingArea.Location;trước nó, các câu trả lời khác không hoạt động trong trường hợp ứng dụng di chuyển như vậy khi sử dụng nhiều màn hình.
TK-421

8

 Định tâm một biểu mẫu trong thời gian chạy

1. Đặt thuộc tính sau của Biểu mẫu:
   -> StartP vị trí: CenterScreen
   -> WindowState: Bình thường

Điều này sẽ tập trung vào biểu mẫu khi chạy nhưng nếu kích thước biểu mẫu lớn hơn dự kiến, hãy thực hiện bước thứ hai.

2. Thêm Kích thước tùy chỉnh sau khi khởi tạoComponent ();

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

Trung tâm bất kỳ cửa sổ nào bạn có thể có được xử lý của


3

Dùng cái này:

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

1
-100. " Đừng gọi CenterToScreen () trực tiếp từ mã của bạn. Thay vào đó, hãy đặt thuộc tính StartPocation thành CenterScreen." msdn.microsoft.com/en-us/l
Library / từ

2

Sử dụng vị trí tài sản của mẫu. Đặt nó vào điểm trên cùng bên trái mong muốn

mong muốn x = (desktop_ thong - form_witdh) / 2

mong muốn y = (desktop_height - from_height) / 2


1

Bạn có thể sử dụng Screen.PrimaryScreen.Boundsđể truy xuất kích thước của màn hình chính (hoặc kiểm tra Screenđối tượng để truy xuất tất cả các màn hình). Sử dụng những người MyForms.Boundsđể tìm ra nơi để đặt biểu mẫu của bạn.


1

Có thể không hoàn toàn liên quan đến câu hỏi. Nhưng có lẽ có thể giúp ai đó.

Màn hình trung tâm không phải là công việc trên cho tôi. Lý do là tôi đã thêm các điều khiển động vào biểu mẫu. Về mặt kỹ thuật, khi nó tập trung vào nó là chính xác, dựa trên biểu mẫu trước khi thêm các điều khiển.

Vì vậy, đây là giải pháp của tôi. (Nên làm việc với cả hai kịch bản)

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

Vì vậy, bạn sẽ nhận thấy rằng tôi đang sử dụng "PreferredSize" thay vì chỉ sử dụng Chiều cao / Chiều rộng. Kích thước ưa thích sẽ giữ giá trị của biểu mẫu sau khi thêm các điều khiển. Trường hợp Chiều cao / Chiều rộng sẽ không.

Hy vọng điều này sẽ giúp được ai đó.

Chúc mừng


0

Trong trường hợp có nhiều màn hình và Nếu bạn thích tập trung vào màn hình / màn hình chính xác thì bạn có thể muốn thử các dòng sau:

// 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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.