Як центрувати вікно на екрані в C #?


129

Мені потрібен спосіб центрувати поточне вікно. Так, наприклад, якщо користувач натискає кнопку, я хочу, щоб вікно зосереджувалося на екрані. Я знаю, що ви можете використовувати властивість стартової позиції, але я не можу знайти спосіб використовувати інше, ніж коли програма запускається вперше. Тож як я центрую форму на екрані?


Я думаю, ви використовуєте виграшні форми?
Андрій Орсич

8
Не використовуйте Form.CenterToScreen. Детальніше дивіться у цій публікації .
Артемікс

використовуйте метод CenterToScreen () у конструкторі класу форм.
webMac

Відповіді:


202

Використовуйте метод Form.CenterToScreen () .


7
У системі з двома моніторами форма буде зосереджена на тому, на якому в даний час є курсор. Отже, форма може раптово перейти на інший монітор. Дивіться пост тут .
Артемікс

6
Документація, на яку ви посилаєтесь, говорить "Не дзвоніть цьому безпосередньо зі свого коду". хоча це не говорить чому.
Стівен Тернер

4
У документації йдеться про використання властивості StartPosition форми для центрування. Це працювало для мене.
Джон Крокч

Це працює, я просто мусив його інстанціювати: this.CenterToScreen ();
Лакі Політ

Я також хотів би знати, чому в документації написано "Не дзвоніть це безпосередньо зі свого коду".
Піт

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

Це показує хороший спосіб отримати в центрі або в «х» або «у» вручну. Мені знадобився 'центральний екран', але лише для координати 'y'.
atconway

9
Чому Screen.PrimaryScreen? Що робити, якщо форма знаходиться на "SecondaryScreen"? Ви повинні використовувати Screen screen = Screen.FromControl(this);тут.
Артемікс

Я використовую цей примітивний прийом просто тому, що він працює на .NET Compact Framework 3.5 , і це також пояснює, чому я не використовую, Screen.FromControl(this)але тримати його PrimaryScreen. (Я розробляю програму під апаратним обмеженням) :-)
Yeo

Цей спосіб нормальний, якщо ви використовуєте лише один екран. Однак якщо у вас є кілька моніторів і натисніть ярлик тут, на лівому моніторі, ви не хочете, щоб він відкривався на правому. Властивість StartPosition обробляє це для вас.
Trevor_G

Це не [на моніторі відомо про DPI].
вт.

28

У формах Windows:

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

Використовуйте властивість Location форми. Встановіть його на потрібну верхню ліву точку

бажаний х = (робоча_ширина - форма_витдх) / 2

бажаний у = (стільниця_висота - від_висоти) / 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.