C #에서 창을 가운데에 맞추려면 어떻게합니까?


129

현재 창을 가운데에 맞추는 방법이 필요합니다. 예를 들어 사용자가 버튼을 누르면 창을 화면 중앙에 놓기를 원합니다. startposition 속성을 사용할 수 있다는 것을 알고 있지만 응용 프로그램을 처음 시작할 때 이외의 다른 방법을 사용할 수는 없습니다. 그러면 양식을 화면 중앙에 어떻게 배치합니까?


승리 양식을 사용한다고 가정합니까?
앤드류 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. 은 Using 속성 창을

    양식 선택 → 속성 창으로 이동 → "시작 위치"선택 → 원하는 곳을 선택하십시오.

    "

  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.PrimaryScreen을 선택해야하는 이유 양식이 'SecondaryScreen'에 있으면 어떻게합니까? Screen screen = Screen.FromControl(this);여기서 사용해야 합니다.
Artemix

이 원시 기술은 .NET Compact 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/ko-kr/library/…
A876

2

폼의 위치 속성을 사용하십시오. 원하는 왼쪽 상단 지점으로 설정

원하는 x = (데스크톱 너비-form_witdh) / 2

원하는 y = (데스크탑 높이-출발 높이) / 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.