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.