자동 크기 조정

자동 크기 조정을 사용하면 특정 디스플레이 해상도 또는 글꼴이 있는 한 컴퓨터에서 디자인된 폼과 해당 컨트롤이 다른 디스플레이 해상도 또는 글꼴로 다른 컴퓨터에 적절하게 표시되도록 할 수 있습니다. 양식 및 컨트롤은 사용자와 다른 개발자 컴퓨터 모두에서 네이티브 창 및 기타 애플리케이션과 일관성을 유지하기 위해 지능적으로 크기 조정됩니다. 자동 크기 조정 및 비주얼 스타일을 사용하면 Windows Forms 애플리케이션이 각 사용자의 컴퓨터에서 네이티브 Windows 애플리케이션과 비교할 때 일관된 모양을 유지할 수 있습니다.

대부분의 경우 자동 스케일링은 Windows Forms에서 예상대로 작동합니다. 그러나 글꼴 구성표 변경은 문제가 될 수 있습니다. 이 문제를 해결하는 방법의 예는 방법: Windows Forms 애플리케이션의 글꼴 구성표 변경 내용에 응답하는 방법을 참조하세요.

.NET의 DPI 인식 기능

DPI 인식은 기본적으로 설정된 ApplicationHighDpiMode 속성을 사용하여 SystemAware 프로젝트 파일을 통해 구성됩니다. 이 구성은 애플리케이션 부트스트랩 시스템과 함께 작동하여 애플리케이션이 시작될 때 DPI 처리를 자동으로 구성합니다.

Windows Forms 애플리케이션에 대한 기본 및 권장 DPI 모드는 다음과 같습니다SystemAware. 이 모드는 애플리케이션 시작 시 DPI 설정을 한 번 쿼리하고 애플리케이션 수명 동안 해당 값을 사용하여 일관된 크기 조정 동작을 제공합니다.

프로젝트 파일에서 DPI 모드를 구성합니다.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
  </PropertyGroup>
</Project>

메모

권장되는 방법은 프로젝트 파일을 통해 DPI를 구성하는 것이지만 애플리케이션 매니페스트 파일(app.manifest)을 사용하여 이러한 설정을 재정의할 수 있습니다. 그러나 매니페스트를 사용하면 애플리케이션 구성과 충돌이 발생할 수 있으므로 사용하지 마세요. 자세한 내용은 컴파일러 경고 WFO0003 참조하세요.

Visual Studio 디자이너 고려 사항

Visual Studio 양식을 디자인할 때 애플리케이션과 별도로 디자이너의 DPI 인식을 구성해야 할 수 있습니다. Visual Studio 2022 버전 17.8부터 프로젝트 파일의 속성을 설정 ForceDesignerDPIUnaware 하여 Windows Forms 디자이너가 DPI를 인식하지 못하는 모드에서 실행되도록 할 수 있습니다. 이 설정은 높은 DPI 모니터에서 양식을 디자인할 때 렌더링 문제를 방지하는 데 도움이 됩니다.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
  </PropertyGroup>
</Project>

이 속성은 Visual Studio 디자이너에만 영향을 줍니다. 애플리케이션 실행 방법은 변경되지 않습니다. 자세한 내용은 크기 조정 문제를 해결하기 위해 DPI 인식 사용 안 함을 참조하세요.

사용 가능한 DPI 모드는 다음과 같습니다.

  • SystemAware- 애플리케이션은 시작할 때 DPI를 한 번 쿼리하고 앱의 수명 동안 이 값을 사용합니다.
  • PerMonitor- 애플리케이션은 모니터별로 DPI 변경 내용을 확인하고 DPI가 변경되면 다시 크기 조정합니다.
  • PerMonitorV2PerMonitor와 유사하지만, 자식 창 DPI 변경 알림 및 향상된 크기 조정 동작을 사용할 수 있습니다.
  • DpiUnaware- 애플리케이션은 DPI 변경에 맞게 크기를 조정하지 않으며 Windows 크기 조정을 처리합니다.
  • DpiUnawareGdiScaled- GDI 기반 콘텐츠와 DpiUnaware 비슷하지만 더 나은 품질을 제공합니다.

DPI 설정을 구성하는 방법에 대한 자세한 내용은 .NET 6에 대한 Windows Forms 새로운 기능입니다.

자동 스케일링 요구

자동 크기 조정이 없으면 해상도나 글꼴이 변경되면 하나의 디스플레이 해상도 또는 글꼴용으로 디자인된 애플리케이션이 너무 작거나 너무 크게 표시됩니다. 예를 들어 Tahoma 9 점을 기준선으로 사용하여 애플리케이션을 디자인하는 경우 시스템 글꼴이 Tahoma 12 지점인 컴퓨터에서 실행할 때 조정하지 않고 너무 작게 표시됩니다. 제목, 메뉴 및 텍스트 상자 내용과 같은 텍스트 요소는 다른 응용 프로그램보다 작게 렌더링됩니다. 또한 제목 표시줄, 메뉴 및 많은 컨트롤과 같은 텍스트를 포함하는 UI(사용자 인터페이스) 요소의 크기는 사용되는 글꼴에 따라 달라집니다. 이 예제에서는 이러한 요소도 상대적으로 작게 표시됩니다.

특정 디스플레이 해상도를 위해 애플리케이션을 디자인할 때 유사한 상황이 발생합니다. 가장 일반적인 디스플레이 해상도는 100개% 디스플레이 크기 조정과 같은 96개의 DPI(도트 수)이지만, 고해상도 디스플레이는 125개의%, 150개의%, 200개의%(각각 120, 144 및 192DPI와 동일)을 지원하는 고해상도 디스플레이가 점점 더 보편화되고 있습니다. 조정하지 않으면 한 해상도용으로 설계된 애플리케이션, 특히 그래픽 기반 애플리케이션이 다른 해상도에서 실행할 때 너무 크거나 너무 작게 표시됩니다.

자동 크기 조정은 상대 글꼴 크기 또는 표시 해상도에 따라 양식 및 자식 컨트롤의 크기를 자동으로 조정하여 이러한 문제를 해결합니다. Windows 운영 체제는 대화 상자 단위라는 상대 측정 단위를 사용하여 대화 상자의 자동 크기 조정을 지원합니다. 대화 상자 단위는 시스템 글꼴을 기반으로 하며, 픽셀과의 관계는 Win32 SDK 함수 GetDialogBaseUnits를 통해 확인할 수 있습니다. 사용자가 Windows 사용하는 테마를 변경하면 모든 대화 상자가 자동으로 조정됩니다. Windows Forms 기본 시스템 글꼴 또는 표시 해상도에 따라 자동 크기 조정을 지원합니다. 필요에 따라 애플리케이션에서 자동 크기 조정을 사용하지 않도록 설정할 수 있습니다.

주의

DPI와 글꼴 크기 조정 모드의 임의 혼합은 지원되지 않습니다. 한 모드(예: DPI)를 사용하여 사용자 컨트롤의 크기를 조정하고 문제 없이 다른 모드(글꼴)를 사용하여 폼에 배치할 수 있지만 기본 폼을 한 모드에서 혼합하고 다른 모드에서 파생된 폼을 혼합하면 예기치 않은 결과가 발생할 수 있습니다.

자동 스케일링의 실제 동작

Windows Forms는 다음 논리를 사용하여 양식과 해당 콘텐츠를 자동으로 스케일링합니다.

  1. 디자인 타임에는 각 ContainerControl가 크기 조정 모드와 현재 해상도를 각각 AutoScaleModeAutoScaleDimensions 속성에 기록합니다.

  2. 런타임에 실제 해상도는 CurrentAutoScaleDimensions 속성에 저장됩니다. AutoScaleFactor 속성은 런타임과 디자인 타임의 배율 조정 해상도 간 비율을 동적으로 계산합니다.

  3. 폼이 로드되면 CurrentAutoScaleDimensionsAutoScaleDimensions의 값이 서로 다를 경우 컨트롤과 그 자식 컨트롤의 크기를 조정하기 위해 PerformAutoScale 메서드가 호출됩니다. 이 메서드는 레이아웃을 일시 중단하고 Scale 메서드를 호출하여 실제 크기 조정을 수행합니다. 그 후 점진적 크기 조정을 방지하기 위해 값 AutoScaleDimensions 이 업데이트됩니다.

  4. PerformAutoScale는 다음과 같은 상황에서도 자동으로 호출됩니다:

    • OnFontChanged 이벤트에 응답하여, 크기 조정 모드가 Font인 경우.

    • 컨테이너 컨트롤의 레이아웃이 다시 수행될 때 AutoScaleDimensions 또는 AutoScaleMode 속성의 변경이 감지되는 경우

    • 상위 요소 ContainerControl의 크기를 조정 중일 때. 각 컨테이너 컨트롤은 부모 컨테이너의 것이 아니라 자체 스케일링 계수를 사용해 자식 요소의 크기를 조정합니다.

  5. 자식 컨트롤은 다음과 같은 여러 수단을 통해 해당 크기 조정 동작을 수정할 수 있습니다.

    • ScaleChildren 속성을 재정의하여 자식 컨트롤의 크기를 조정할지 여부를 결정합니다.

    • GetScaledBounds 메서드를 재정의하여 컨트롤이 크기 조정되는 경계를 조정하되, 크기 조정 논리는 변경하지 않습니다.

    • 현재 컨트롤의 크기 조정 논리를 변경하려면 ScaleControl 메서드를 재정의합니다.

고DPI 개선

.NET 특히 PerMonitorV2 모드에서 높은 DPI 렌더링을 크게 개선했습니다.

  • 모니터별 DPI 인식 - 애플리케이션은 DPI 설정이 다른 모니터 간에 이동할 때 동적으로 조정됩니다.
  • 향상된 크기 조정 동작 - 중첩된 컨트롤 및 컨테이너 컨트롤(.NET 6 이상)을 포함하여 DPI가 변경될 때 컨트롤의 크기가 올바르게 조정됩니다.
  • 양식 크기 조정MaximumSizeMinimumSize 현재 모니터 DPI 설정에 따라 속성 크기 조정(.NET 7 이상, .NET 8 이상에서 기본적으로 사용).
  • DPI 변경 이벤트 - 새 이벤트를 사용하면 동적 DPI 변경 내용을 프로그래밍 방식으로 처리할 수 있습니다.
    • DpiChanged- 양식이 현재 표시된 디스플레이 디바이스에서 DPI 설정이 변경될 때 발생합니다.
    • DpiChangedBeforeParent- 부모 컨트롤 또는 폼에 대한 DPI 변경 이벤트가 발생하기 전에 컨트롤에 대한 DPI 설정이 프로그래밍 방식으로 변경되면 발생합니다.
    • DpiChangedAfterParent- 부모 컨트롤 또는 폼에 대한 DPI 변경 이벤트가 발생한 후 컨트롤에 대한 DPI 설정이 프로그래밍 방식으로 변경되면 발생합니다.

높은 DPI 개선에 대한 자세한 내용은 .NET 6의 Windows Forms 새로운 기능, .NET 7의 Windows Forms 새로운 기능 및 .NET 8용 Windows Forms 새로운 기능 을 참조하세요.

.NET 프레임워크 차이점

.NET 프레임워크 및 .NET DPI 인식을 다르게 처리합니다.

  • .NET Framework에서는 <System.Windows.Forms.ApplicationConfigurationSection> 요소를 사용한 app.config 파일을 통해 DPI 인식을 구성합니다.
  • .NET에서는 프로젝트 파일에서 ApplicationHighDpiMode 속성을 사용하여 DPI 인식을 구성합니다.
  • .NET Framework는 더 이상 권장되지 않는 DPI 구성에 매니페스트 파일을 사용합니다.
  • .NET 더 나은 크기 조정 동작과 보다 안정적인 DPI 변경 처리를 제공합니다.

.NET Framework DPI 구성에 대한 자세한 내용은 Windows Forms 높은 DPI 지원을 참조하세요.

참고하십시오